commit 4f7b594ec80f6d096a9849f383d6b947b5fd127d Author: CI Publish Bot Date: Sun Jul 26 21:17:45 2026 +0000 Public release from ruodoo-project: 19.0 - 2026-07-26 21:17:35 UTC diff --git a/access_apps/README.rst b/access_apps/README.rst new file mode 100644 index 00000000..f87af79e --- /dev/null +++ b/access_apps/README.rst @@ -0,0 +1,30 @@ +.. image:: https://itpp.dev/images/infinity-readme.png + :alt: Tested and maintained by IT Projects Labs + :target: https://itpp.dev + +======================== + Control access to Apps +======================== + +Allows to configure administrators which don't have access to Apps. + +Adds **Apps access** selection in user's access rights tab. Two options are available: + +* *Allow installing apps* +* *Allow installing apps only from settings* + +Questions? +========== + +To get an assistance on this module contact us by email :arrow_right: help@itpp.dev + +Contributors +============ +* `Ivan Yelizariev `__ +* `Ildar Nasyrov `__ + + +Further information +=================== + +Tested on `Odoo 17.0 `_ diff --git a/access_apps/__init__.py b/access_apps/__init__.py new file mode 100644 index 00000000..071962a3 --- /dev/null +++ b/access_apps/__init__.py @@ -0,0 +1,2 @@ +from . import models +from .hooks import uninstall_hook diff --git a/access_apps/__manifest__.py b/access_apps/__manifest__.py new file mode 100644 index 00000000..3c41044d --- /dev/null +++ b/access_apps/__manifest__.py @@ -0,0 +1,29 @@ +# Copyright 2018,2021 Ivan Yelizariev +# Copyright 2018 Ildar Nasyrov +# License MIT (https://opensource.org/licenses/MIT). +{ + "name": """Control access to Apps""", + "summary": """You can configure administrators which don't have access to Apps""", + "category": "Extra Tools", + # "live_test_url": "", + "images": ["images/banner.png"], + "version": "19.0.2.0.0", + "application": False, + "author": "IT-Projects LLC, Ivan Yelizariev", + "support": "apps@itpp.dev", + "website": "https://twitter.com/OdooFree", + "license": "Other OSI approved licence", # MIT + # "price": 10.00, + "currency": "EUR", + "depends": ["access_restricted"], + "external_dependencies": {"python": [], "bin": []}, + "data": ["security/access_apps_security.xml", "security/ir.model.access.csv"], + "demo": [], + "qweb": [], + "post_load": None, + "pre_init_hook": None, + "post_init_hook": None, + "uninstall_hook": "uninstall_hook", + "auto_install": False, + "installable": True, +} diff --git a/access_apps/doc/changelog.rst b/access_apps/doc/changelog.rst new file mode 100644 index 00000000..87762f64 --- /dev/null +++ b/access_apps/doc/changelog.rst @@ -0,0 +1,37 @@ +`2.0.0` +------- +- **Fix:** restore original access rights on uninstallation +- **Fix:** error in Settings menu when some modules are installed + +`1.3.3` +------- +- **Fix:** Grant `Allow installing apps` to Admin and System users (it was only System) + +`1.3.2` +------- + +- **Fix:** allow users in group `Allow install apps only from settings` also to uninstall from settings +- **Fix:** `Allow install apps only from settings` security group should imply `Administration: Settings` - no access to settings otherwise + +`1.3.1` +------- + +- **Fix:** `Access Error` when administrators without access to apps trying to open ``[[ Website Admin ]] >> Configuratiion >> Settings`` + +`1.3.0` +------- + +- **Fix:** the "Allow install apps" group is now implies "Administration: Settings" ("base.group_system") since in Odoo 11.0 only group_system users can install apps + +`1.2.0` +------- + +- **Improvement:** rename "Show Apps Menu" to "Allow install apps" +- **New:** "Allow install apps only from settings" +- **Improvement:** group "Show Apps Menu" and "Allow install apps only from settings" under "Apps access" security category + +`1.0.1` +------- + +- **Fix:** updates for recent odoo 9.0 +- **Improvement:** apps dashboard can be showed if user has access 'Show Apps Menu' diff --git a/access_apps/doc/index.rst b/access_apps/doc/index.rst new file mode 100644 index 00000000..7eb646c1 --- /dev/null +++ b/access_apps/doc/index.rst @@ -0,0 +1,32 @@ +======================== + Control access to Apps +======================== + +Installation +============ + +* `Install `__ this module in a usual way + +Configuration +============= + +After the installation of this module by default only *default admin* and *superuser* have access to installing modules. +To update the permission follow for other users follow the steps below. + + +* Open menu ``[[ Settings ]] >> Users & Companies >> Users``, select the user you want to grant the access to +* On ``Access Rights`` tab, ``Other`` settings group there is an ``Apps access`` security category + + * Select ``Allow installing apps`` - to allow apps installation from everywhere + * Select ``Allow installing apps only from settings`` - allow apps installation only from other module's ``Configuration >> Settings`` menu. More precisely, it just hides ``[[ Apps ]]`` menu + * Select blank line - to restrict application installation + +Usage +===== + +* Be sure that you don't test the functionality under the ``Administrator`` (superuser with id=1) user - he is immune to any access restriction except of hiding menus or buttons in UI +* If you don't select anything in ``Apps access``: there is no ``[[ Apps ]]`` menu - even if your user is in ``Administration: Settings`` security group. Also note that you + have no ability to include yourself in groups allowing to installing apps - this is what ``access_restricted`` module does (``access_apps`` depends on it) +* If you have ``Allow installing apps`` selected: there is ``[[ Apps ]]`` menu +* If you have ``Allow installing apps only from settings``: from other module's ``Configuration >> Settings`` menu, e.g. from ``[[ Website ]] >> Configuration >> Settings`` see that + you have the ability to check the ``Digital Content`` checkbox that actually installs the ``website_sale_digital`` module after clicking on ``[Apply]`` button. diff --git a/access_apps/hooks.py b/access_apps/hooks.py new file mode 100644 index 00000000..ed07b059 --- /dev/null +++ b/access_apps/hooks.py @@ -0,0 +1,7 @@ +# Copyright 2021,2023 Ivan Yelizariev +# License MIT (https://opensource.org/licenses/MIT). +def uninstall_hook(env): + access = env.ref( + "base.access_ir_module_module_group_user", raise_if_not_found=False + ) + access.write({"active": True}) diff --git a/access_apps/i18n/access_apps.pot b/access_apps/i18n/access_apps.pot new file mode 100644 index 00000000..053e5413 --- /dev/null +++ b/access_apps/i18n/access_apps.pot @@ -0,0 +1,35 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * access_apps +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: access_apps +#: model:res.groups,name:access_apps.group_allow_apps +msgid "Allow installing apps" +msgstr "" + +#. module: access_apps +#: model:res.groups,name:access_apps.group_allow_apps_only_from_settings +msgid "Allow installing apps only from settings" +msgstr "" + +#. module: access_apps +#: model:ir.module.category,name:access_apps.module_category_access_apps +msgid "Apps access" +msgstr "" + +#. module: access_apps +#: model:ir.model,name:access_apps.model_res_config_settings +msgid "Config Settings" +msgstr "" + diff --git a/access_apps/i18n/de.po b/access_apps/i18n/de.po new file mode 100644 index 00000000..22047c86 --- /dev/null +++ b/access_apps/i18n/de.po @@ -0,0 +1,42 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * access_apps +# +# Translators: +# Sergej Briesin <20bs18@gmail.com>, 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-04-21 00:17+0000\n" +"PO-Revision-Date: 2018-04-21 00:17+0000\n" +"Last-Translator: Sergej Briesin <20bs18@gmail.com>, 2018\n" +"Language-Team: German (https://www.transifex.com/it-projects-llc/teams/76080/" +"de/)\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: access_apps +#: model:res.groups,name:access_apps.group_allow_apps +#, fuzzy +msgid "Allow installing apps" +msgstr "Erlaube Apps zu installieren" + +#. module: access_apps +#: model:res.groups,name:access_apps.group_allow_apps_only_from_settings +#, fuzzy +msgid "Allow installing apps only from settings" +msgstr "Erlaube Apps nur vom Einstellungen zu installieren" + +#. module: access_apps +#: model:ir.module.category,name:access_apps.module_category_access_apps +msgid "Apps access" +msgstr "Apps Zugriff" + +#. module: access_apps +#: model:ir.model,name:access_apps.model_res_config_settings +msgid "Config Settings" +msgstr "" diff --git a/access_apps/i18n/es.po b/access_apps/i18n/es.po new file mode 100644 index 00000000..4cbda45e --- /dev/null +++ b/access_apps/i18n/es.po @@ -0,0 +1,45 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * access_apps +# +# Translators: +# charles paul requena palomino , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-04-26 19:17+0000\n" +"PO-Revision-Date: 2018-04-26 19:17+0000\n" +"Last-Translator: charles paul requena palomino , 2018\n" +"Language-Team: Spanish (https://www.transifex.com/it-projects-llc/" +"teams/76080/es/)\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" + +#. module: access_apps +#: model:res.groups,name:access_apps.group_allow_apps +#, fuzzy +msgid "Allow installing apps" +msgstr "Permitir instalar aplicaciones solo desde la configuración" + +#. module: access_apps +#: model:res.groups,name:access_apps.group_allow_apps_only_from_settings +#, fuzzy +msgid "Allow installing apps only from settings" +msgstr "Permitir instalar aplicaciones solo desde la configuración" + +#. module: access_apps +#: model:ir.module.category,name:access_apps.module_category_access_apps +msgid "Apps access" +msgstr "Acceso a aplicaciones" + +#. module: access_apps +#: model:ir.model,name:access_apps.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#~ msgid "Access to Modules" +#~ msgstr "Acceso a los módulos" diff --git a/access_apps/i18n/es_CR.po b/access_apps/i18n/es_CR.po new file mode 100644 index 00000000..4722e88c --- /dev/null +++ b/access_apps/i18n/es_CR.po @@ -0,0 +1,43 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * access_apps +# +# Translators: +# Randall , 2018 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-04-21 00:17+0000\n" +"PO-Revision-Date: 2017-11-28 13:02+0000\n" +"Last-Translator: Randall , 2018\n" +"Language-Team: Spanish (Costa Rica) (https://www.transifex.com/it-projects-" +"llc/teams/76080/es_CR/)\n" +"Language: es_CR\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" + +#. module: access_apps +#: model:res.groups,name:access_apps.group_allow_apps +#, fuzzy +msgid "Allow installing apps" +msgstr "Permitir instalar aplicaciones" + +#. module: access_apps +#: model:res.groups,name:access_apps.group_allow_apps_only_from_settings +msgid "Allow installing apps only from settings" +msgstr "Permitir instalar aplicaciones sólo desde ajustes" + +#. module: access_apps +#: model:ir.module.category,name:access_apps.module_category_access_apps +msgid "Apps access" +msgstr "Acceso aplicaciones" + +#. module: access_apps +#: model:ir.model,name:access_apps.model_res_config_settings +#, fuzzy +msgid "Config Settings" +msgstr "res.config.settings" diff --git a/access_apps/images/banner.png b/access_apps/images/banner.png new file mode 100644 index 00000000..6569c1c8 Binary files /dev/null and b/access_apps/images/banner.png differ diff --git a/access_apps/models/__init__.py b/access_apps/models/__init__.py new file mode 100644 index 00000000..ab480f8b --- /dev/null +++ b/access_apps/models/__init__.py @@ -0,0 +1 @@ +from . import res_config diff --git a/access_apps/models/res_config.py b/access_apps/models/res_config.py new file mode 100644 index 00000000..ef28380b --- /dev/null +++ b/access_apps/models/res_config.py @@ -0,0 +1,70 @@ +# Copyright 2018 Ivan Yelizariev +# Copyright 2018 Ildar Nasyrov +# License MIT (https://opensource.org/licenses/MIT). + +from odoo import api, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + @api.model + def _install_modules(self, modules): + if self.env.user.has_group( + "access_apps.group_allow_apps_only_from_settings" + ): + self = self.sudo() + + return super(ResConfigSettings, self)._install_modules(modules) + + @api.model + def default_get(self, fields): + # We restricted any access to apps by default (`ir.module.module`) but in `website_sale` module configuration + # there is a field that gets its default value by searching in apps. + # Without this there is a possibility to encounter the `Access Error` when trying to open settings + # - e.g. when administrators without access to apps open ``[[ Website Admin ]] >> Configuration >> Settings`` + + # TODO: this solution may lead to unexpected result + # if some of default methods uses self self.env.user to compute default value + res = super(ResConfigSettings, self.sudo()).default_get(fields) + + # modules: which modules are installed/to install + classified = self._get_classified_fields() + for module in classified["to_uninstall"]: + name = f"module_{module.name}" + res[name] = module.state in ("installed", "to install", "to upgrade") + if self._fields[name].type == "selection": + res[name] = str(int(res[name])) + + return res + + @api.model + def _get_classified_fields(self, fnames=None): + # classify mudules to install and uninstall independently + res = super(ResConfigSettings, self)._get_classified_fields(fnames=fnames) + + to_uninstall = res["module"].filtered( + lambda m: not self[f"module_{m.name}"] + and m.state in ("installed", "to upgrade") + ) + + modules = res["module"] - to_uninstall + + res["module"] = modules + res["to_uninstall"] = to_uninstall + + return res + + def execute(self): + # base `exectute` doesn't know about new classification - it only has a list of modules to install now + res = super(ResConfigSettings, self).execute() + # uninstall modules if needed and a user has access + to_uninstall = self._get_classified_fields()["to_uninstall"] + if to_uninstall and self.env.user.has_group( + "access_apps.group_allow_apps_only_from_settings" + ): + to_uninstall_modules = self.env["ir.module.module"] + for module in to_uninstall: + to_uninstall_modules += module + to_uninstall_modules.sudo().button_immediate_uninstall() + return res diff --git a/access_apps/security/access_apps_security.xml b/access_apps/security/access_apps_security.xml new file mode 100644 index 00000000..e05f762d --- /dev/null +++ b/access_apps/security/access_apps_security.xml @@ -0,0 +1,32 @@ + + + + + + + + Apps access + 18 + + + Allow installing apps only from settings + + + + Allow installing apps + + + + + + + diff --git a/access_apps/security/ir.model.access.csv b/access_apps/security/ir.model.access.csv new file mode 100644 index 00000000..30770dd9 --- /dev/null +++ b/access_apps/security/ir.model.access.csv @@ -0,0 +1,6 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +"access_ir_module_category_group_user","ir_module_category group_user","base.model_ir_module_category","group_allow_apps",1,0,0,0 +"access_ir_module_module_group_user","ir_module_module group_user","base.model_ir_module_module","group_allow_apps",1,1,1,1 +"access_ir_module_module_dependency_group_allow_apps","ir_module_module_dependency group_allow_apps","base.model_ir_module_module_dependency","group_allow_apps",1,1,1,1 +"access_ir_module_module_group_allow_apps_only_from_settings","ir_module_module_group_allow_apps_only_from_settings","base.model_ir_module_module","group_allow_apps_only_from_settings",1,1,0,0 +"access_ir_module_module_all_can_read","ir_module_module_all_can_read","base.model_ir_module_module","base.group_system",1,0,0,0 diff --git a/access_apps/static/description/icon.png b/access_apps/static/description/icon.png new file mode 100644 index 00000000..85f5fe74 Binary files /dev/null and b/access_apps/static/description/icon.png differ diff --git a/access_apps/tests/__init__.py b/access_apps/tests/__init__.py new file mode 100644 index 00000000..18849263 --- /dev/null +++ b/access_apps/tests/__init__.py @@ -0,0 +1 @@ +from . import test_access diff --git a/access_apps/tests/test_access.py b/access_apps/tests/test_access.py new file mode 100644 index 00000000..62544da7 --- /dev/null +++ b/access_apps/tests/test_access.py @@ -0,0 +1,64 @@ +# Copyright 2024 DOB +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo.exceptions import AccessError +from odoo.tests import new_test_user +from odoo.tests.common import TransactionCase + + +class TestAccessApps(TransactionCase): + """Tests for access_apps: access control to the Apps section. + + Validates: Requirement 6.1 + """ + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env( + context=dict(cls.env.context, tracking_disable=True, no_reset_password=True) + ) + # Regular user without admin rights and without group_allow_apps + cls.regular_user = new_test_user( + cls.env, + name="Regular User", + login="test_regular_user_access_apps", + groups="base.group_user", + ) + + def test_non_admin_cannot_read_ir_module_module(self): + """WHEN a user without admin rights tries to access the Apps section, + access_apps SHALL deny access. + + Validates: Requirement 6.1 + """ + # The module deactivates base.access_ir_module_module_group_user, + # so only users in group_allow_apps can read ir.module.module. + # A regular user (not in group_allow_apps) should get AccessError. + with self.assertRaises(AccessError): + self.env["ir.module.module"].with_user(self.regular_user).search([]) + + def test_admin_can_read_ir_module_module(self): + """WHEN the admin user (in group_allow_apps) accesses the Apps section, + access_apps SHALL allow access. + + Validates: Requirement 6.1 (positive case) + """ + # Admin is in group_allow_apps by default (see security XML) + admin_user = self.env.ref("base.user_admin") + modules = self.env["ir.module.module"].with_user(admin_user).search([], limit=1) + # Should not raise; result may be empty or non-empty + self.assertIsNotNone(modules) + + def test_non_admin_not_in_group_allow_apps(self): + """WHEN a regular user is not in group_allow_apps, + they SHALL NOT have access to ir.module.module. + + Validates: Requirement 6.1 + """ + group_allow_apps = self.env.ref("access_apps.group_allow_apps") + self.assertNotIn( + self.regular_user, + group_allow_apps.users, + "Regular user should not be in group_allow_apps", + ) diff --git a/access_restricted/README.rst b/access_restricted/README.rst new file mode 100644 index 00000000..6c0c2667 --- /dev/null +++ b/access_restricted/README.rst @@ -0,0 +1,27 @@ +.. image:: https://itpp.dev/images/infinity-readme.png + :alt: Tested and maintained by IT Projects Labs + :target: https://itpp.dev + +Restricted administration rights +================================ + +The module makes impossible for administrator to set (and see) more access rights (groups) than he already has. +The only partial exception of this rule is made if you are already a member of the *Allow add implied groups from settings* security group. +Then you are allowed to escalate your privileges but just from ``Settings`` menus (by means of ``group_XXX`` boolean fields of ``res.config.settings`` models views). + +This doesn't affect superuser, of course. + +Typical usage of the module +=========================== + +The superuser creates an administrator user without access group "Show Apps Menu" (see **access_apps** module). Then the administrator has access to settings, but not able to install new apps (without this module he can add himself to "Show Apps Menu" and get access to apps). + +Roadmap +======= + +* Settings menu shows group fields are not updated without *Allow add implied groups from settings* (ok), but it shows the fields as not editable (not ok) + +Further information +=================== + +Tested on `Odoo 17.0 `_ diff --git a/access_restricted/__init__.py b/access_restricted/__init__.py new file mode 100644 index 00000000..0650744f --- /dev/null +++ b/access_restricted/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/access_restricted/__manifest__.py b/access_restricted/__manifest__.py new file mode 100644 index 00000000..440e37e2 --- /dev/null +++ b/access_restricted/__manifest__.py @@ -0,0 +1,15 @@ +{ + "name": "Restricted administration rights", + "summary": "Apply strict restriction on what an admin can do", + "version": "19.0.1.3.5", + "author": "IT-Projects LLC, Ivan Yelizariev", + "category": "Extra Tools", + "images": ["images/banner.jpg"], + "support": "apps@itpp.dev", + "website": "https://twitter.com/OdooFree", + "license": "Other OSI approved licence", # MIT + "currency": "EUR", + "depends": ["ir_rule_protected"], + "data": ["security/access_restricted_security.xml"], + "installable": True, +} diff --git a/access_restricted/doc/changelog.rst b/access_restricted/doc/changelog.rst new file mode 100644 index 00000000..6b5e6f58 --- /dev/null +++ b/access_restricted/doc/changelog.rst @@ -0,0 +1,50 @@ +`1.3.5` +------- + +- **Fix:** Fixed possibility to write inappropriate groups directly via write method after some odoo updates https://github.com/odoo/odoo/commit/5f12e244f6e57b8edb56788147774150e2ae134d + +`1.3.4` +------- + +- **Fix:** Allow superuser to write groups via settings menu + +`1.3.3` +------- + +- **Fix:** If no permission to add groups then just ignore write operations to groups model records but apply any other valid settings. In other words - do not block rest of the settings from applying if there is only no permission to add groups + +`1.3.2` +------- + +- **Fix:** regardless of ``Allow add implied groups from settings`` always allow to uncheck **group_XXX** fields from settings menu. This makes possible for ``access_apps`` module to independently install apps from settings menu. Otherwise users of ``access_apps`` need always be in ``Allow add implied...`` to install from settings + +`1.3.1` +------- + +- **Fix:** a user, if he has ``Allow add implied groups from settings`` group access right, should be able to uncheck **group_XXX** fields from a settings menu to exit from implied groups (all other users that are in implying group also quit from the implied group) + +`1.3.0` +------- + +- [ADD] security group that allows increasing rights from settings menu (by checking ``res.config.settings`` 'group_XXX' boolean fields) + +`1.2.0` +------- + +- [REF] clean and simplify code + +`1.1.0` +------- + +- ADD: Make restricted groups readonly in Settigs pages (res.config.settings) +- ADD: don't restrict access to Technical Settings group + +`1.0.1` +------- + +- FIX: update to the latest odoo 9.0 version due to this comit from Mar 24, 2016 https://github.com/odoo/odoo/commit/40a299c580c4608edab8781fda4e66f39611543b + +`1.0.0` +------- + +- init version diff --git a/access_restricted/doc/index.rst b/access_restricted/doc/index.rst new file mode 100644 index 00000000..83c7761a --- /dev/null +++ b/access_restricted/doc/index.rst @@ -0,0 +1,37 @@ +================================== + Restricted administration rights +================================== + +Installation +============ + +* `Install `__ this module in a usual way + +Configuration +============= + + +* `Log in as SUPERUSER `__ +* Navigate to menu ``[[ Settings ]] >> Users & Companies >> Users`` +* In ``Access Rights`` tab you can select *Allow add implied groups from settings*: + it allows a user to configure groups via ``group_XXX`` fields from ``Settings`` menu. + +Usage +===== + +By default all users except a superuser restricted to escalate the privileges. + +Let's take ``Sales (sale_management)`` module as an example. + +Without this module installed: + +* Say you have a user with administration rights ``Administration: Access Rights``. This user thus may increase his own rights in ``Application Accesses`` from ``Sales: User: Own Documents Only`` + to ``Sales: Administrator``. Also he can open menu ``[[ Sales ]] >> Configuration >> Settings`` and select ``Customer Addresses`` there + and then click ``[Apply]`` button (adding ``group_sale_delivery_address``) + +With this module installed: + +* The user from previous example cannot increase his privileges. There is no ``Sales: Manager`` option for him, and also no ``Customer Addresses`` + option in module configuration +* The only exception is done for users who are in special group *Allow add implied groups from settings*: if your user is included in this group by the superuser then you may select + ``Customer Addresses`` from ``Sale`` module ``Configuration >> Settings`` menu diff --git a/access_restricted/i18n/access_restricted.pot b/access_restricted/i18n/access_restricted.pot new file mode 100644 index 00000000..34357bc9 --- /dev/null +++ b/access_restricted/i18n/access_restricted.pot @@ -0,0 +1,94 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * access_restricted +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: access_restricted +#: code:addons/access_restricted/models/res_config_settings.py:48 +#, python-format +msgid "\n" +"\n" +"You don't have access to change this settings, because you administration rights are restricted" +msgstr "" + +#. module: access_restricted +#: model:ir.model,name:access_restricted.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: access_restricted +#: model:res.groups,name:access_restricted.group_allow_add_implied_from_settings +msgid "Allow add implied groups from settings" +msgstr "" + +#. module: access_restricted +#: model:ir.model,name:access_restricted.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings__create_uid +msgid "Created by" +msgstr "" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings__create_date +msgid "Created on" +msgstr "" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings__display_name +msgid "Display Name" +msgstr "" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings__group_private_addresses +msgid "Group Private Addresses" +msgstr "" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings__id +msgid "ID" +msgstr "" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings____last_update +msgid "Last Modified on" +msgstr "" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings__write_date +msgid "Last Updated on" +msgstr "" + +#. module: access_restricted +#: model:ir.model,name:access_restricted.model_res_users +msgid "Users" +msgstr "" + +#. module: access_restricted +#: code:addons/access_restricted/models/res_users.py:95 +#, python-format +msgid "You cannot add groups to Implied groups, because you are not allowed to increase your rights. Please contact your system administrator." +msgstr "" + +#. module: access_restricted +#: model:ir.model,name:access_restricted.model_test_config_settings +msgid "test.config.settings" +msgstr "" + diff --git a/access_restricted/i18n/de.po b/access_restricted/i18n/de.po new file mode 100644 index 00000000..f285d17c --- /dev/null +++ b/access_restricted/i18n/de.po @@ -0,0 +1,105 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * access_restricted +# +# Translators: +# Sergej Briesin <20bs18@gmail.com>, 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-04-21 00:17+0000\n" +"PO-Revision-Date: 2018-04-21 00:17+0000\n" +"Last-Translator: Sergej Briesin <20bs18@gmail.com>, 2018\n" +"Language-Team: German (https://www.transifex.com/it-projects-llc/teams/76080/" +"de/)\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: access_restricted +#: code:addons/access_restricted/models/res_config_settings.py:48 +#, python-format +msgid "" +"\n" +"\n" +"You don't have access to change this settings, because you administration " +"rights are restricted" +msgstr "" + +#. module: access_restricted +#: model:ir.model,name:access_restricted.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: access_restricted +#: model:res.groups,name:access_restricted.group_allow_add_implied_from_settings +msgid "Allow add implied groups from settings" +msgstr "" + +#. module: access_restricted +#: model:ir.model,name:access_restricted.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings__create_uid +msgid "Created by" +msgstr "" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings__create_date +msgid "Created on" +msgstr "" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings__display_name +msgid "Display Name" +msgstr "" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings__group_private_addresses +msgid "Group Private Addresses" +msgstr "" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings__id +msgid "ID" +msgstr "" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings____last_update +msgid "Last Modified on" +msgstr "" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings__write_date +msgid "Last Updated on" +msgstr "" + +#. module: access_restricted +#: code:addons/access_restricted/models/res_users.py:95 +#, python-format +msgid "" +"The requested operation cannot be completed due to security restrictions. " +"Please contact your system administrator.\n" +"\n" +"(Document type: %s, Operation: %s)" +msgstr "" + +#. module: access_restricted +#: model:ir.model,name:access_restricted.model_res_users +msgid "Users" +msgstr "Nutzer" + +#. module: access_restricted +#: model:ir.model,name:access_restricted.model_test_config_settings +msgid "test.config.settings" +msgstr "" diff --git a/access_restricted/i18n/es.po b/access_restricted/i18n/es.po new file mode 100644 index 00000000..602e63aa --- /dev/null +++ b/access_restricted/i18n/es.po @@ -0,0 +1,105 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * access_restricted +# +# Translators: +# charles paul requena palomino , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-04-26 19:17+0000\n" +"PO-Revision-Date: 2018-04-26 19:17+0000\n" +"Last-Translator: charles paul requena palomino , 2018\n" +"Language-Team: Spanish (https://www.transifex.com/it-projects-llc/" +"teams/76080/es/)\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" + +#. module: access_restricted +#: code:addons/access_restricted/models/res_config_settings.py:48 +#, python-format +msgid "" +"\n" +"\n" +"You don't have access to change this settings, because you administration " +"rights are restricted" +msgstr "" + +#. module: access_restricted +#: model:ir.model,name:access_restricted.model_res_groups +msgid "Access Groups" +msgstr "Grupos de acceso" + +#. module: access_restricted +#: model:res.groups,name:access_restricted.group_allow_add_implied_from_settings +msgid "Allow add implied groups from settings" +msgstr "" + +#. module: access_restricted +#: model:ir.model,name:access_restricted.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings__create_date +msgid "Created on" +msgstr "Creado en" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings__display_name +msgid "Display Name" +msgstr "Nombre para mostrar" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings__group_private_addresses +msgid "Group Private Addresses" +msgstr "" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings__id +msgid "ID" +msgstr "ID" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings____last_update +msgid "Last Modified on" +msgstr "Última modificación en" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings__write_uid +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings__write_date +msgid "Last Updated on" +msgstr "Ultima actualizacion en" + +#. module: access_restricted +#: code:addons/access_restricted/models/res_users.py:95 +#, python-format +msgid "" +"The requested operation cannot be completed due to security restrictions. " +"Please contact your system administrator.\n" +"\n" +"(Document type: %s, Operation: %s)" +msgstr "" + +#. module: access_restricted +#: model:ir.model,name:access_restricted.model_res_users +msgid "Users" +msgstr "" + +#. module: access_restricted +#: model:ir.model,name:access_restricted.model_test_config_settings +msgid "test.config.settings" +msgstr "" diff --git a/access_restricted/i18n/es_CR.po b/access_restricted/i18n/es_CR.po new file mode 100644 index 00000000..8bfd3e9d --- /dev/null +++ b/access_restricted/i18n/es_CR.po @@ -0,0 +1,114 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * access_restricted +# +# Translators: +# Randall , 2018 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-04-21 00:17+0000\n" +"PO-Revision-Date: 2017-11-28 13:02+0000\n" +"Last-Translator: Randall , 2018\n" +"Language-Team: Spanish (Costa Rica) (https://www.transifex.com/it-projects-" +"llc/teams/76080/es_CR/)\n" +"Language: es_CR\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" + +#. module: access_restricted +#: code:addons/access_restricted/models/res_config_settings.py:48 +#, python-format +msgid "" +"\n" +"\n" +"You don't have access to change this settings, because you administration " +"rights are restricted" +msgstr "" +"\n" +"\n" +"No tiene acceso para cambiar esta configuración, ya que los derechos de " +"administración están restringidos." + +#. module: access_restricted +#: model:ir.model,name:access_restricted.model_res_groups +msgid "Access Groups" +msgstr "Grupos de Accesos" + +#. module: access_restricted +#: model:res.groups,name:access_restricted.group_allow_add_implied_from_settings +msgid "Allow add implied groups from settings" +msgstr "Permitir agregar grupos implícitos desde la configuración" + +#. module: access_restricted +#: model:ir.model,name:access_restricted.model_res_config_settings +#, fuzzy +msgid "Config Settings" +msgstr "res.config.settings" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings__create_date +msgid "Created on" +msgstr "Creado en" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings__display_name +msgid "Display Name" +msgstr "Mostrar Nombre" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings__group_private_addresses +msgid "Group Private Addresses" +msgstr "" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings__id +msgid "ID" +msgstr "ID" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings____last_update +msgid "Last Modified on" +msgstr "Última modificación el" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings__write_uid +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: access_restricted +#: model:ir.model.fields,field_description:access_restricted.field_test_config_settings__write_date +msgid "Last Updated on" +msgstr "Última actualización en " + +#. module: access_restricted +#: code:addons/access_restricted/models/res_users.py:95 +#, python-format +msgid "" +"The requested operation cannot be completed due to security restrictions. " +"Please contact your system administrator.\n" +"\n" +"(Document type: %s, Operation: %s)" +msgstr "" + +#. module: access_restricted +#: model:ir.model,name:access_restricted.model_res_users +msgid "Users" +msgstr "Usuarios" + +#. module: access_restricted +#: model:ir.model,name:access_restricted.model_test_config_settings +msgid "test.config.settings" +msgstr "test.config.settings" + +#~ msgid "Group User" +#~ msgstr "Grupos de Usuario" diff --git a/access_restricted/images/banner.jpg b/access_restricted/images/banner.jpg new file mode 100644 index 00000000..99558f6f Binary files /dev/null and b/access_restricted/images/banner.jpg differ diff --git a/access_restricted/models/__init__.py b/access_restricted/models/__init__.py new file mode 100644 index 00000000..42098d2c --- /dev/null +++ b/access_restricted/models/__init__.py @@ -0,0 +1,3 @@ +from . import res_config_settings +from . import res_users +from . import test_config_settings diff --git a/access_restricted/models/res_config_settings.py b/access_restricted/models/res_config_settings.py new file mode 100644 index 00000000..36b7f694 --- /dev/null +++ b/access_restricted/models/res_config_settings.py @@ -0,0 +1,71 @@ +from odoo import SUPERUSER_ID, api, models +from odoo.tools import ustr +from odoo.tools.translate import _ + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + @api.model + def _get_classified_fields(self, fnames=None): + uid = self.env.uid + classified = super()._get_classified_fields(fnames) + config = self.env.context.get("config") + is_execute_stage = config and isinstance(config, models.Model) + + if uid == SUPERUSER_ID or is_execute_stage: + return classified + + group = [] + user = self.env.user + + for name, groups, implied_group in classified["group"]: + if ( + implied_group in user.group_ids + or user.has_group( + "access_restricted.group_allow_add_implied_from_settings" + ) + ): + group.append((name, groups, implied_group)) + + classified["group"] = group + return classified + + @api.model + def fields_get(self, allfields=None, **kwargs): + uid = self.env.uid + fields = super().fields_get(allfields, **kwargs) + + if uid == SUPERUSER_ID: + return fields + + user = self.env.user + + for name in fields: + if not name.startswith("group_"): + continue + + f = self._fields[name] + + if ( + f.implied_group in user.group_ids + or user.has_group( + "access_restricted.group_allow_add_implied_from_settings" + ) + ): + continue + + fields[name].update( + readonly=True, + help=ustr(fields[name].get("help", "")) + + _( + "\n\nYou don't have access to change this settings, because your administration rights are restricted" + ), + ) + + return fields + + def execute(self): + return super( + ResConfigSettings, self.with_context({"config": self}) + ).execute() diff --git a/access_restricted/models/res_users.py b/access_restricted/models/res_users.py new file mode 100644 index 00000000..8b185c41 --- /dev/null +++ b/access_restricted/models/res_users.py @@ -0,0 +1,112 @@ +from odoo import SUPERUSER_ID, _, api, models +from odoo.exceptions import AccessError + +IR_CONFIG_NAME = "access_restricted.fields_view_get_uid" + + +class ResUsers(models.Model): + _inherit = "res.users" + + @api.model + def get_views(self, views, options=None): + last_uid = self.env["ir.config_parameter"].sudo().get_param(IR_CONFIG_NAME) + if int(last_uid) != self.env.uid: + self.env["res.groups"]._update_user_groups_view() + return super().get_views(views, options) + + def write(self, vals): + if 'groups_id' in vals: + self.env["ir.config_parameter"].sudo().set_param(IR_CONFIG_NAME, "0") + return super().write(vals) + + +class ResGroups(models.Model): + _inherit = "res.groups" + + @api.model + def _update_user_groups_view(self): + real_uid = self.env.uid + self.env["ir.config_parameter"].sudo().set_param(IR_CONFIG_NAME, real_uid) + self.env.flush_all() + + @api.model + def get_application_groups(self, domain=None): + if domain is None: + domain = [] + domain.append(("share", "=", False)) + + real_uid = int( + self.env["ir.config_parameter"].sudo().get_param(IR_CONFIG_NAME, "0") + ) + if real_uid and real_uid != SUPERUSER_ID: + group_no_one_id = self.env.ref("base.group_no_one").id + domain = domain + [ + "|", + ("user_ids", "in", [real_uid]), + ("id", "=", group_no_one_id), + ] + return self.sudo().search(domain) + + def write(self, vals): + config = self.env.context.get("config") + + # `isinstance` check is a non-xmplrpc proof. + if config and isinstance(config, models.Model): + implied_ids = vals.get("implied_ids") + classified_group = config._get_classified_fields()["group"] + # when `res.config.settings`'s `execute` method writes the `users` field to group, + # it is always to remove users and the `users` field is the only key in the write dict + users = vals.get("user_ids") + implied_group = implied_ids and implied_ids[0][1] + users_exclude_operation = ( + users and len(vals) == 1 and all(u[0] == 3 for u in users) + ) + # ``all(u[0] == 3 for u in users)`` is to be sure that all operations are for removing. + # `(3, id)` tuple removes the record from the set (the Many2many field `users`) + add_implied_group_operation = implied_group in [ + group[2].id for group in classified_group + ] + curr_user_allowed = self.env.user._is_superuser() or self.env.user.has_group( + "access_restricted.group_allow_add_implied_from_settings" + ) + if ( + users_exclude_operation + or add_implied_group_operation + and curr_user_allowed + ): + self = self.with_user(SUPERUSER_ID) + else: + # do nothing with groups if there is no permission to add from settings + return + + # in the https://github.com/odoo/odoo/commit/5f12e244f6e57b8edb56788147774150e2ae134d commit + # the method was refactored due to a higher performance. + # Super method lacks of orm part so as consequent ir rules are not checked and we check its conditions manually. + # We apply super method and check the difference of implied groups, + # if the not proper group was set error is raised + check_for_implied_ids = ( + "implied_ids" in vals + and vals["implied_ids"] + and self.env.user.id != SUPERUSER_ID + ) + if check_for_implied_ids: + implied_ids_before = self.mapped("implied_ids") + groups_before = self.env.user.group_ids + + result = super(ResGroups, self).write(vals) + + if check_for_implied_ids: + implied_ids_after = self.mapped("implied_ids") + group_no_one = self.env.ref("base.group_no_one") + implied_group_ids = implied_ids_after - implied_ids_before - group_no_one + + # R1 <= R2 True if all records of R1 are also in R2 + if not implied_group_ids <= groups_before: + raise AccessError( + _( + "You cannot add groups to Implied groups, because you are not allowed to increase your rights. " + "Please contact your system administrator." + ) + ) + + return result diff --git a/access_restricted/models/test_config_settings.py b/access_restricted/models/test_config_settings.py new file mode 100644 index 00000000..70a5ec7f --- /dev/null +++ b/access_restricted/models/test_config_settings.py @@ -0,0 +1,13 @@ +from odoo import fields, models + + +class TestConfigSettings(models.TransientModel): + + _description = "Test config settings" + _inherit = ["res.config.settings"] + + group_test_access_restricted = fields.Boolean( + group="base.group_system", + # random group for test purposes + implied_group="base.group_multi_currency", + ) diff --git a/access_restricted/security/access_restricted_security.xml b/access_restricted/security/access_restricted_security.xml new file mode 100644 index 00000000..aeff89c6 --- /dev/null +++ b/access_restricted/security/access_restricted_security.xml @@ -0,0 +1,30 @@ + + + + Allow add implied groups from settings + + + Only admin can edit admin + + + [('id', '!=', 1)] + + + + + + + + res.groups.restricted + + + + + + + + + diff --git a/access_restricted/static/description/icon.png b/access_restricted/static/description/icon.png new file mode 100644 index 00000000..85f5fe74 Binary files /dev/null and b/access_restricted/static/description/icon.png differ diff --git a/access_restricted/tests/__init__.py b/access_restricted/tests/__init__.py new file mode 100644 index 00000000..177eccaa --- /dev/null +++ b/access_restricted/tests/__init__.py @@ -0,0 +1,3 @@ +from . import test_fields_view_get +from . import test_fields_get +from . import test_allow_implied diff --git a/access_restricted/tests/test_allow_implied.py b/access_restricted/tests/test_allow_implied.py new file mode 100644 index 00000000..969d2c41 --- /dev/null +++ b/access_restricted/tests/test_allow_implied.py @@ -0,0 +1,86 @@ +from odoo.exceptions import AccessError +from odoo.tests.common import TransactionCase + +GROUP = "base.group_multi_currency" + + +class TestAllowImplied(TransactionCase): + def _get_classified_groups(self, config): + groups = config._get_classified_fields()["group"] + return [g[0] for g in groups] + + def setUp(self): + super().setUp() + self.group = self.env.ref(GROUP) + self.demo_user = self.env["res.users"].create({ + "name": "Test Demo User", + "login": "test_demo_allow_implied", + "groups_id": [(6, 0, [self.env.ref("base.group_user").id])], + }) + + def test_base(self): + demo_user = self.demo_user + + group_system = self.env.ref("base.group_system") + + demo_user.write({"group_ids": [(3, self.group.id)]}) + self.group.write({"users": [(3, demo_user.id)]}) + self.assertFalse(self.env["res.users"].with_user(demo_user.id).has_group(GROUP)) + + demo_user.write({"group_ids": [(4, group_system.id)]}) + + test_config_settings = ( + self.env["res.config.settings"] + .with_user(demo_user.id) + .create({"group_test_access_restricted": True}) + ) + self.assertFalse(self.env["res.users"].with_user(demo_user.id).has_group(GROUP)) + + # check that the field is readonly + self.assertTrue( + test_config_settings.fields_get()["group_test_access_restricted"][ + "readonly" + ] + ) + # check that test group hasn't got appended to classified + self.assertNotIn( + "self.group", self._get_classified_groups(test_config_settings) + ) + + group_allow = self.env.ref( + "access_restricted.group_allow_add_implied_from_settings" + ) + demo_user.write({"group_ids": [(4, group_allow.id)]}) + + # check that now the field is not readonly + self.assertFalse( + test_config_settings.fields_get()["group_test_access_restricted"][ + "readonly" + ] + ) + # check that now the group is in classified + self.assertIn( + "group_test_access_restricted", + self._get_classified_groups(test_config_settings), + ) + + self.assertFalse(self.env["res.users"].with_user(demo_user.id).has_group(GROUP)) + test_config_settings.with_user(demo_user.id).execute() + self.assertTrue(self.env["res.users"].with_user(demo_user.id).has_group(GROUP)) + + def test_assert_raises(self): + demo_user = self.demo_user + group_system = self.env.ref("base.group_system") + + demo_user.write({"group_ids": [(3, self.group.id)]}) + self.group.write({"users": [(3, demo_user.id)]}) + self.assertFalse(self.env["res.users"].with_user(demo_user.id).has_group(GROUP)) + + demo_user.write({"group_ids": [(4, group_system.id)]}) + self.assertFalse(self.env["res.users"].with_user(demo_user.id).has_group(GROUP)) + + # check that there is no access to put test group into implied_ids anyways + with self.assertRaises(AccessError): + group_system.with_user(demo_user.id).write( + {"implied_ids": [(4, self.group.id)]} + ) diff --git a/access_restricted/tests/test_fields_get.py b/access_restricted/tests/test_fields_get.py new file mode 100644 index 00000000..47b9b1e8 --- /dev/null +++ b/access_restricted/tests/test_fields_get.py @@ -0,0 +1,39 @@ +from odoo.tests.common import TransactionCase + + +def _sel_groups_field_name(group_ids): + """Generate sel_groups field name from group ids (replaces removed name_selection_groups).""" + return 'sel_groups_' + '_'.join(str(i) for i in sorted(group_ids)) + + +class TestFieldsGet(TransactionCase): + def test_base(self): + demo_user = self.env["res.users"].create({ + "name": "Test Demo User Fields", + "login": "test_demo_fields_get", + "groups_id": [(6, 0, [self.env.ref("base.group_user").id])], + }) + group_erp_manager = self.env.ref("base.group_erp_manager") + group_system = self.env.ref("base.group_system") + + demo_user.write({"group_ids": [(3, group_system.id)]}) + group_system.write({"user_ids": [(3, demo_user.id)]}) + demo_user.write({"group_ids": [(4, group_erp_manager.id)]}) + + view_users_form = self.env.ref("base.view_users_form") + ( + self.env["res.users"] + .with_user(demo_user) + .with_context({"uid": demo_user.id}) + .get_views([[view_users_form.id, "form"]]) + ) + + sel_groups = _sel_groups_field_name([group_erp_manager.id]) + res = self.env["res.users"].with_user(demo_user).fields_get() + self.assertTrue(res.get(sel_groups)) + + demo_user.write({"groups_id": [(4, group_system.id)]}) + + sel_groups = _sel_groups_field_name([group_erp_manager.id, group_system.id]) + res = self.env["res.users"].with_user(demo_user).fields_get() + self.assertTrue(res.get(sel_groups)) diff --git a/access_restricted/tests/test_fields_view_get.py b/access_restricted/tests/test_fields_view_get.py new file mode 100644 index 00000000..15f1cad0 --- /dev/null +++ b/access_restricted/tests/test_fields_view_get.py @@ -0,0 +1,71 @@ +from odoo.tests.common import TransactionCase, tagged + +IR_CONFIG_NAME = "access_restricted.fields_view_get_uid" + + +@tagged("post_install", "-at_install") +class TestFieldsViewGet(TransactionCase): + def clear_config(self): + self.env["ir.config_parameter"].search([("key", "=", IR_CONFIG_NAME)]).unlink() + + def clear_access(self, user): + user.write( + { + "group_ids": [ + (3, self.env.ref("base.group_erp_manager").id, 0), + (3, self.env.ref("base.group_system").id, 0), + ] + } + ) + + def add_access(self, user, group_xmlid): + user.write({"group_ids": [(4, self.env.ref(group_xmlid).id, 0)]}) + + def _view_form(self, user, view_xmlid): + view_id = self.env.ref(view_xmlid).id + # context = {'lang': "en_US", 'tz': "Europe/Brussels", 'uid': user.id} + self.env["res.users"].with_user(user.id).get_view(view_id=view_id) + + def view_preference_form(self, user): + self._view_form(user, "base.view_users_form_simple_modif") + + def view_user_form(self, user): + self._view_form(user, "base.view_users_form") + + def view_form_all(self, user): + self.view_preference_form(user) + self.clear_config() + + self.view_user_form(user) + self.clear_config() + + def view_form_mix(self, user1, user2): + self.view_preference_form(user1) + self.view_user_form(user2) + + self.view_preference_form(user1) + self.view_preference_form(user2) + + self.view_form_all(user1) + self.view_user_form(user2) + + def test_base(self): + admin = self.env.ref("base.user_root") + demo = self.env.ref("base.user_demo") + + # test for admin + self.view_form_all(admin) + + # demo doesn't have admin rights + self.clear_access(demo) + self.view_preference_form(demo) + + # demo has "Access Rights" + self.add_access(demo, "base.group_erp_manager") + self.view_form_all(demo) + + # demo has "Settings" + self.add_access(demo, "base.group_system") + self.view_form_all(demo) + + self.view_form_mix(admin, demo) diff --git a/access_settings_menu/README.rst b/access_settings_menu/README.rst new file mode 100644 index 00000000..ea4067f0 --- /dev/null +++ b/access_settings_menu/README.rst @@ -0,0 +1,18 @@ +.. image:: https://itpp.dev/images/infinity-readme.png + :alt: Tested and maintained by IT Projects Labs + :target: https://itpp.dev + +Show settings menu for non-admin +================================ + +Adds "Show Settings Menu" checkbox in user's access rights tab. + +Uninstallation +============== + +After uninstalling, you need to update ``base`` module to return restriction to ``Settings`` menu back. + +Further information +=================== + +Tested on `Odoo 17.0 `_ diff --git a/access_settings_menu/__init__.py b/access_settings_menu/__init__.py new file mode 100644 index 00000000..0650744f --- /dev/null +++ b/access_settings_menu/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/access_settings_menu/__manifest__.py b/access_settings_menu/__manifest__.py new file mode 100644 index 00000000..772280b5 --- /dev/null +++ b/access_settings_menu/__manifest__.py @@ -0,0 +1,15 @@ +{ + "name": "Show settings menu for non-admin", + "summary": """Allows to make Settings menu visible for non-admins""", + "version": "19.0.2.0.0", + "author": "IT-Projects LLC, Ivan Yelizariev", + "category": "Extra Tools", + "images": ["images/banner.png"], + "support": "apps@itpp.dev", + "website": "https://twitter.com/OdooFree", + "license": "Other OSI approved licence", # MIT + "depends": ["access_restricted"], + "data": ["security/access_settings_menu_security.xml"], + "demo": ["security/access_settings_menu_security_demo.xml"], + "installable": True, +} diff --git a/access_settings_menu/doc/changelog.rst b/access_settings_menu/doc/changelog.rst new file mode 100644 index 00000000..fa37a7e6 --- /dev/null +++ b/access_settings_menu/doc/changelog.rst @@ -0,0 +1,20 @@ +`2.0.0` +------- + +- Improvement: replace `access_apps` dependency with `access_restricted` since only the latter one is needed + +`1.0.2` +------- + +- FIX: make compatible with CI-tests of other modules + + +`1.0.1` +------- + +- FIX issue occured when user has ``[x] Show Settings Menu`` access, but doesn't have administration rights + +`1.0.0` +------- + +- Init version diff --git a/access_settings_menu/doc/index.rst b/access_settings_menu/doc/index.rst new file mode 100644 index 00000000..ea69bcca --- /dev/null +++ b/access_settings_menu/doc/index.rst @@ -0,0 +1,33 @@ +====================== + Access settings menu +====================== + +Installation +============ + +* `Install `__ this module in a usual way + +Configuration +============= + +* Open menu ``[[ Settings ]] >> Users & Companies >> Users`` +* Open user form view (click on the line with the user) +* Click ``[Edit]`` +* Select ``[Show Settings Menu]`` and click ``[Save]`` + +Usage +===== + +Without this module installed: + +* Non-admin user can't see the ``[[ Settings ]]`` menu. + + +With this module installed: + +* If non-admin user has the ``[Show Settings Menu]`` right he can see the ``[[ Settings ]]`` menu. + +Uninstallation +============== + +After uninstalling, you need to update ``base`` module to return restriction to ``Settings`` menu back. diff --git a/access_settings_menu/i18n/access_settings_menu.pot b/access_settings_menu/i18n/access_settings_menu.pot new file mode 100644 index 00000000..9b10824d --- /dev/null +++ b/access_settings_menu/i18n/access_settings_menu.pot @@ -0,0 +1,25 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * access_settings_menu +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: access_settings_menu +#: model:res.groups,name:access_settings_menu.group_show_settings_menu +msgid "Show Settings Menu" +msgstr "" + +#. module: access_settings_menu +#: model:ir.model,name:access_settings_menu.model_res_users +msgid "Users" +msgstr "" + diff --git a/access_settings_menu/i18n/de.po b/access_settings_menu/i18n/de.po new file mode 100644 index 00000000..46fe065a --- /dev/null +++ b/access_settings_menu/i18n/de.po @@ -0,0 +1,30 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * access_settings_menu +# +# Translators: +# Sergej Briesin <20bs18@gmail.com>, 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-04-21 00:17+0000\n" +"PO-Revision-Date: 2018-04-21 00:17+0000\n" +"Last-Translator: Sergej Briesin <20bs18@gmail.com>, 2018\n" +"Language-Team: German (https://www.transifex.com/it-projects-llc/teams/76080/" +"de/)\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: access_settings_menu +#: model:res.groups,name:access_settings_menu.group_show_settings_menu +msgid "Show Settings Menu" +msgstr "Einstellungsmenü anzeigen" + +#. module: access_settings_menu +#: model:ir.model,name:access_settings_menu.model_res_users +msgid "Users" +msgstr "Nutzer" diff --git a/access_settings_menu/i18n/es_CR.po b/access_settings_menu/i18n/es_CR.po new file mode 100644 index 00000000..9c9db52a --- /dev/null +++ b/access_settings_menu/i18n/es_CR.po @@ -0,0 +1,31 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * access_settings_menu +# +# Translators: +# Randall , 2018 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-04-21 00:17+0000\n" +"PO-Revision-Date: 2017-11-28 13:02+0000\n" +"Last-Translator: Randall , 2018\n" +"Language-Team: Spanish (Costa Rica) (https://www.transifex.com/it-projects-" +"llc/teams/76080/es_CR/)\n" +"Language: es_CR\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" + +#. module: access_settings_menu +#: model:res.groups,name:access_settings_menu.group_show_settings_menu +msgid "Show Settings Menu" +msgstr "Mostrar Menu de Ajustes" + +#. module: access_settings_menu +#: model:ir.model,name:access_settings_menu.model_res_users +msgid "Users" +msgstr "Usuarios" diff --git a/access_settings_menu/images/banner.png b/access_settings_menu/images/banner.png new file mode 100644 index 00000000..f499446e Binary files /dev/null and b/access_settings_menu/images/banner.png differ diff --git a/access_settings_menu/models.py b/access_settings_menu/models.py new file mode 100644 index 00000000..7a2d4ddb --- /dev/null +++ b/access_settings_menu/models.py @@ -0,0 +1,10 @@ +from odoo import api, models + + +class ResUsers(models.Model): + _inherit = "res.users" + + @api.model + def fields_get(self, *args, **kwargs): + # switch to superuser to get access to virtual fields + return super(ResUsers, self.sudo()).fields_get(*args, **kwargs) diff --git a/access_settings_menu/security/access_settings_menu_security.xml b/access_settings_menu/security/access_settings_menu_security.xml new file mode 100644 index 00000000..971f829b --- /dev/null +++ b/access_settings_menu/security/access_settings_menu_security.xml @@ -0,0 +1,20 @@ + + + + + Show Settings Menu + + + + + + + + + diff --git a/access_settings_menu/security/access_settings_menu_security_demo.xml b/access_settings_menu/security/access_settings_menu_security_demo.xml new file mode 100644 index 00000000..cb3b011d --- /dev/null +++ b/access_settings_menu/security/access_settings_menu_security_demo.xml @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/access_settings_menu/static/description/icon.png b/access_settings_menu/static/description/icon.png new file mode 100644 index 00000000..85f5fe74 Binary files /dev/null and b/access_settings_menu/static/description/icon.png differ diff --git a/access_settings_menu/tests/__init__.py b/access_settings_menu/tests/__init__.py new file mode 100644 index 00000000..cc74d794 --- /dev/null +++ b/access_settings_menu/tests/__init__.py @@ -0,0 +1 @@ +from . import test_fields_view_get diff --git a/access_settings_menu/tests/test_fields_view_get.py b/access_settings_menu/tests/test_fields_view_get.py new file mode 100644 index 00000000..9d5b68da --- /dev/null +++ b/access_settings_menu/tests/test_fields_view_get.py @@ -0,0 +1,20 @@ +from odoo.tests import common + +from odoo.addons.access_restricted.tests.test_fields_view_get import ( + TestFieldsViewGet as TestFieldsViewGetBase, +) + + +@common.tagged("post_install", "-at_install") +class TestFieldsViewGet(TestFieldsViewGetBase): + def test_access_settings_menu(self): + admin = self.env.ref("base.user_root") + demo = self.env.ref("base.user_demo") + + # demo doesn't have admin rights, but has "Show Settings Menu" + self.clear_access(demo) + self.add_access(demo, "access_settings_menu.group_show_settings_menu") + self.view_form_all(demo) + self.view_form_mix(admin, demo) + self.clear_config() + self.view_form_mix(demo, admin) diff --git a/account_bank_statement_1c_import/__init__.py b/account_bank_statement_1c_import/__init__.py new file mode 100644 index 00000000..12a4cc22 --- /dev/null +++ b/account_bank_statement_1c_import/__init__.py @@ -0,0 +1,2 @@ +from . import wizard +from . import models \ No newline at end of file diff --git a/account_bank_statement_1c_import/__manifest__.py b/account_bank_statement_1c_import/__manifest__.py new file mode 100644 index 00000000..a9c9ad55 --- /dev/null +++ b/account_bank_statement_1c_import/__manifest__.py @@ -0,0 +1,19 @@ +{ + 'name': 'Account Bank Statement 1C Import', + 'category': 'Accounting', + 'version': '19.0.0.1', + 'author': 'MK.Lab', + 'website': 'https://inf-centre.ru/', + 'depends': [ + 'account', + 'l10n_ru_doc', + ], + 'data': [ + 'security/ir.model.access.csv', + 'wizard/invoice_import_wizard.xml', + 'views/account_journal_wizard_action.xml', + 'views/account_journal_dashboard_inherit.xml', + 'views/account_journal_settings.xml', + ], + 'installable': True, +} diff --git a/account_bank_statement_1c_import/i18n/ru.po b/account_bank_statement_1c_import/i18n/ru.po new file mode 100644 index 00000000..b1e87ed4 --- /dev/null +++ b/account_bank_statement_1c_import/i18n/ru.po @@ -0,0 +1,160 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_bank_statement_1c_import +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-03-18 22:00+0000\n" +"PO-Revision-Date: 2024-03-18 22:00+0000\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: account_bank_statement_1c_import +#: model:ir.model,name:account_bank_statement_1c_import.model_account_bank_statement +msgid "Bank Statement" +msgstr "Банковская выписка" + +#. module: account_bank_statement_1c_import +#: model_terms:ir.ui.view,arch_db:account_bank_statement_1c_import.view_invoice_import_wizard_form +msgid "Cancel" +msgstr "Отменить" + +#. module: account_bank_statement_1c_import +#: model:ir.model.fields,field_description:account_bank_statement_1c_import.field_invoice_import_wizard__create_uid +msgid "Created by" +msgstr "" + +#. module: account_bank_statement_1c_import +#: model:ir.model.fields,field_description:account_bank_statement_1c_import.field_invoice_import_wizard__create_date +msgid "Created on" +msgstr "" + +#. module: account_bank_statement_1c_import +#: model:ir.model.fields,field_description:account_bank_statement_1c_import.field_account_bank_statement__date_from +msgid "Date From" +msgstr "" + +#. module: account_bank_statement_1c_import +#: model:ir.model.fields,field_description:account_bank_statement_1c_import.field_invoice_import_wizard__display_name +msgid "Display Name" +msgstr "" + +#. module: account_bank_statement_1c_import +#. odoo-python +#: code:addons/account_bank_statement_1c_import/wizard/invoice_import_wizard.py:0 +#, python-format +msgid "Error Import: %s" +msgstr "" + +#. module: account_bank_statement_1c_import +#: model:ir.model.fields,field_description:account_bank_statement_1c_import.field_invoice_import_wizard__file +msgid "File" +msgstr "Файл" + +#. module: account_bank_statement_1c_import +#: model:ir.model.fields,field_description:account_bank_statement_1c_import.field_invoice_import_wizard__file_name +msgid "File Name" +msgstr "" + +#. module: account_bank_statement_1c_import +#: model:ir.model.fields,field_description:account_bank_statement_1c_import.field_invoice_import_wizard__id +msgid "ID" +msgstr "" + +#. module: account_bank_statement_1c_import +#: model_terms:ir.ui.view,arch_db:account_bank_statement_1c_import.view_invoice_import_wizard_form +msgid "Import" +msgstr "Импортировать" + +#. module: account_bank_statement_1c_import +#: model:ir.actions.act_window,name:account_bank_statement_1c_import.action_invoice_import_wizard +#: model:ir.model,name:account_bank_statement_1c_import.model_invoice_import_wizard +#: model:ir.ui.menu,name:account_bank_statement_1c_import.menu_invoice_import +#: model_terms:ir.ui.view,arch_db:account_bank_statement_1c_import.account_journal_dashboard_inherit +#: model_terms:ir.ui.view,arch_db:account_bank_statement_1c_import.view_invoice_import_wizard_form +msgid "Import Invoice" +msgstr "Импортировать выписку" + +#. module: account_bank_statement_1c_import +#: model:ir.actions.server,name:account_bank_statement_1c_import.action_import_invoice_wizard +msgid "Import Invoice Wizard" +msgstr "Импорт выписки" + +#. module: account_bank_statement_1c_import +#: model:ir.model,name:account_bank_statement_1c_import.model_account_journal +msgid "Journal" +msgstr "Журнал" + +#. module: account_bank_statement_1c_import +#: model:ir.model.fields,field_description:account_bank_statement_1c_import.field_invoice_import_wizard__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: account_bank_statement_1c_import +#: model:ir.model.fields,field_description:account_bank_statement_1c_import.field_invoice_import_wizard__write_date +msgid "Last Updated on" +msgstr "" + +#. module: account_bank_statement_1c_import +#. odoo-python +#: code:addons/account_bank_statement_1c_import/wizard/invoice_import_wizard.py:0 +#, python-format +msgid "Only TXT files are allowed." +msgstr "Разрешены только файлы TXT" + +#. module: account_bank_statement_1c_import +#. odoo-python +#: code:addons/account_bank_statement_1c_import/wizard/invoice_import_wizard.py:0 +#, python-format +msgid "Please upload the file." +msgstr "Пожалуйста, загрузите файл" + +#. module: account_bank_statement_1c_import +#. odoo-python +#: code:addons/account_bank_statement_1c_import/wizard/invoice_import_wizard.py:0 +#, python-format +msgid "Statement not found for journal {} on date {}." +msgstr "Не найдено выписки по журналу {} и дате {}" + +#. module: account_bank_statement_1c_import +#. odoo-python +#: code:addons/account_bank_statement_1c_import/wizard/invoice_import_wizard.py:0 +#, python-format +msgid "Suitable journal not found." +msgstr "" +"Подходящий журнал не найден. Проверьте стоит ли галочка 'Использовать в " +"банковской выписке' в журнале" + +#. module: account_bank_statement_1c_import +#: model:ir.model.fields,field_description:account_bank_statement_1c_import.field_account_journal__use_in_bank_statement +msgid "Use in Bank Statement" +msgstr "Использовать в банковской выписке" + +#. module: account_bank_statement_1c_import +#. odoo-python +#: code:addons/account_bank_statement_1c_import/wizard/invoice_import_wizard.py:0 +#, python-format +msgid "inn your company not found." +msgstr "" +"ИНН вашей компании не найден в файле. Пожалуйста, проверьте корректность " +"файла." + +#. module: account_bank_statement_1c_import +#. odoo-python +#: code:addons/account_bank_statement_1c_import/wizard/invoice_import_wizard.py:0 +#, python-format +msgid "Выписка успешно импортирована." +msgstr "" + +#. module: account_bank_statement_1c_import +#. odoo-python +#: code:addons/account_bank_statement_1c_import/wizard/invoice_import_wizard.py:0 +#, python-format +msgid "Импорт завершен" +msgstr "" diff --git a/account_bank_statement_1c_import/models/__init__.py b/account_bank_statement_1c_import/models/__init__.py new file mode 100644 index 00000000..2d921e48 --- /dev/null +++ b/account_bank_statement_1c_import/models/__init__.py @@ -0,0 +1,2 @@ +from . import account_journal +from . import account_bank_statement \ No newline at end of file diff --git a/account_bank_statement_1c_import/models/account_bank_statement.py b/account_bank_statement_1c_import/models/account_bank_statement.py new file mode 100644 index 00000000..003f6976 --- /dev/null +++ b/account_bank_statement_1c_import/models/account_bank_statement.py @@ -0,0 +1,6 @@ +from odoo import models, fields + +class AccountBankStatement(models.Model): + _inherit = 'account.bank.statement' + + date_from = fields.Date(string="Date From") \ No newline at end of file diff --git a/account_bank_statement_1c_import/models/account_journal.py b/account_bank_statement_1c_import/models/account_journal.py new file mode 100644 index 00000000..1c3ac0db --- /dev/null +++ b/account_bank_statement_1c_import/models/account_journal.py @@ -0,0 +1,6 @@ +from odoo import models, fields + +class AccountJournal(models.Model): + _inherit = 'account.journal' + + use_in_bank_statement = fields.Boolean(string="Use in Bank Statement") \ No newline at end of file diff --git a/account_bank_statement_1c_import/security/ir.model.access.csv b/account_bank_statement_1c_import/security/ir.model.access.csv new file mode 100644 index 00000000..ea2df933 --- /dev/null +++ b/account_bank_statement_1c_import/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_invoice_import_wizard,access_invoice_import_wizard,model_invoice_import_wizard,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/account_bank_statement_1c_import/tests/__init__.py b/account_bank_statement_1c_import/tests/__init__.py new file mode 100644 index 00000000..8f010a0a --- /dev/null +++ b/account_bank_statement_1c_import/tests/__init__.py @@ -0,0 +1 @@ +from . import test_parser diff --git a/account_bank_statement_1c_import/tests/test_parser.py b/account_bank_statement_1c_import/tests/test_parser.py new file mode 100644 index 00000000..aebc82f8 --- /dev/null +++ b/account_bank_statement_1c_import/tests/test_parser.py @@ -0,0 +1,293 @@ +""" +Tests for Parser_1C (account_bank_statement_1c_import). + +Validates: Requirements 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.9 +""" +import base64 + +from odoo.exceptions import UserError +from odoo.tests.common import TransactionCase + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + +COMPANY_INN = "7700000001" +COMPANY_KPP = "770001001" + +PARTNER_INN = "7700000002" +PARTNER_KPP = "770001002" + +VALID_TXT_TEMPLATE = """\ +1CClientBankExchange +ВерсияФормата=1.03 +Кодировка=Windows +Отправитель=Бухгалтерия предприятия +ДатаСоздания=01.01.2024 +ВремяСоздания=12:00:00 +ДатаНачала=01.01.2024 +ДатаКонца=31.01.2024 +РасчСчет=40702810000000000001 +СекцияРасчСчет +ДатаНачала=01.01.2024 +ДатаКонца=31.01.2024 +РасчСчет=40702810000000000001 +НачальныйОстаток=10000.00 +ВсегоПоступило=5000.00 +ВсегоСписано=3000.00 +КонечныйОстаток=12000.00 +КонецРасчСчет +{transactions}КонецФайла +""" + +TRANSACTION_PAYER = """\ +СекцияДокумент=Платежное поручение +Номер=1 +Дата=15.01.2024 +Сумма=1000.00 +ПлательщикСчет=40702810000000000001 +ДатаСписано=15.01.2024 +ПлательщикИНН={company_inn} +ПлательщикКПП={company_kpp} +Плательщик=ООО Наша Компания +Плательщик1=ООО Наша Компания +ПлательщикРасчСчет=40702810000000000001 +ПлательщикБанк1=Банк Плательщика +ПлательщикБИК=044525001 +ПлательщикКорсчет=30101810400000000001 +ПолучательСчет=40702810000000000002 +ПолучательИНН={partner_inn} +ПолучательКПП={partner_kpp} +Получатель=ООО Контрагент +Получатель1=ООО Контрагент +ПолучательРасчСчет=40702810000000000002 +ПолучательБанк1=Банк Получателя +ПолучательБИК=044525002 +ПолучательКорсчет=30101810400000000002 +НазначениеПлатежа=Оплата по договору №1 +КонецДокумента +""" + +TRANSACTION_RECIPIENT = """\ +СекцияДокумент=Платежное поручение +Номер=2 +Дата=16.01.2024 +Сумма=2000.00 +ПлательщикСчет=40702810000000000002 +ДатаПоступило=16.01.2024 +ПлательщикИНН={partner_inn} +ПлательщикКПП={partner_kpp} +Плательщик=ООО Контрагент +Плательщик1=ООО Контрагент +ПлательщикРасчСчет=40702810000000000002 +ПлательщикБанк1=Банк Плательщика +ПлательщикБИК=044525002 +ПлательщикКорсчет=30101810400000000002 +ПолучательСчет=40702810000000000001 +ПолучательИНН={company_inn} +ПолучательКПП={company_kpp} +Получатель=ООО Наша Компания +Получатель1=ООО Наша Компания +ПолучательРасчСчет=40702810000000000001 +ПолучательБанк1=Банк Получателя +ПолучательБИК=044525001 +ПолучательКорсчет=30101810400000000001 +НазначениеПлатежа=Поступление по договору №2 +КонецДокумента +""" + +TRANSACTION_UNKNOWN_INN = """\ +СекцияДокумент=Платежное поручение +Номер=3 +Дата=17.01.2024 +Сумма=500.00 +ПлательщикСчет=40702810000000000003 +ДатаСписано=17.01.2024 +ПлательщикИНН=9999999999 +ПлательщикКПП=999999999 +Плательщик=ООО Чужая Компания +Плательщик1=ООО Чужая Компания +ПлательщикРасчСчет=40702810000000000003 +ПлательщикБанк1=Чужой Банк +ПлательщикБИК=044525003 +ПлательщикКорсчет=30101810400000000003 +ПолучательСчет=40702810000000000004 +ПолучательИНН=8888888888 +ПолучательКПП=888888888 +Получатель=ООО Другая Компания +Получатель1=ООО Другая Компания +ПолучательРасчСчет=40702810000000000004 +ПолучательБанк1=Другой Банк +ПолучательБИК=044525004 +ПолучательКорсчет=30101810400000000004 +НазначениеПлатежа=Транзакция без нашей компании +КонецДокумента +""" + + +def _encode(text): + """Encode text to base64 as cp1251 (as the wizard expects).""" + return base64.b64encode(text.encode('cp1251')) + + +def _make_txt(transactions=""): + return VALID_TXT_TEMPLATE.format(transactions=transactions) + + +def _payer_tx(): + return TRANSACTION_PAYER.format( + company_inn=COMPANY_INN, company_kpp=COMPANY_KPP, + partner_inn=PARTNER_INN, partner_kpp=PARTNER_KPP, + ) + + +def _recipient_tx(): + return TRANSACTION_RECIPIENT.format( + company_inn=COMPANY_INN, company_kpp=COMPANY_KPP, + partner_inn=PARTNER_INN, partner_kpp=PARTNER_KPP, + ) + + +def _unknown_inn_tx(): + return TRANSACTION_UNKNOWN_INN + + +# --------------------------------------------------------------------------- +# Fixtures / setUp helpers +# --------------------------------------------------------------------------- + +class _Base(TransactionCase): + """Common setUp: company VAT, bank journal with use_in_bank_statement.""" + + def setUp(self): + super().setUp() + # Set company VAT so the parser can match INN + self.env.company.write({'vat': COMPANY_INN}) + + # Create (or find) a bank journal with use_in_bank_statement=True + self.journal = self.env['account.journal'].search( + [('type', '=', 'bank'), ('use_in_bank_statement', '=', True)], + limit=1, + ) + if not self.journal: + self.journal = self.env['account.journal'].create({ + 'name': 'Test Bank Journal', + 'type': 'bank', + 'code': 'TBNK', + 'use_in_bank_statement': True, + }) + + def _wizard(self, file_content_bytes, file_name='statement.txt'): + """Create an InvoiceImportWizard record.""" + return self.env['invoice.import.wizard'].create({ + 'file': base64.b64encode(file_content_bytes), + 'file_name': file_name, + }) + + +# --------------------------------------------------------------------------- +# TestParser1CBasic +# --------------------------------------------------------------------------- + +class TestParser1CBasic(_Base): + """Validates: Requirements 2.1, 2.2, 2.3""" + + def test_valid_txt_parses_without_exception(self): + """Req 2.1 — correct TXT file is parsed without exceptions.""" + content = _make_txt().encode('cp1251') + wizard = self._wizard(content, 'statement.txt') + # action_import_invoice should not raise + wizard.action_import_invoice() + + def test_wrong_extension_raises_user_error(self): + """Req 2.2 — non-.txt extension raises UserError.""" + content = _make_txt().encode('cp1251') + wizard = self._wizard(content, 'statement.csv') + with self.assertRaises(UserError): + wizard.action_import_invoice() + + def test_no_file_raises_user_error(self): + """Req 2.3 — missing file raises UserError.""" + wizard = self.env['invoice.import.wizard'].create({ + 'file': False, + 'file_name': 'statement.txt', + }) + with self.assertRaises(UserError): + wizard.action_import_invoice() + + +# --------------------------------------------------------------------------- +# TestParser1CLines +# --------------------------------------------------------------------------- + +class TestParser1CLines(_Base): + """Validates: Requirements 2.4, 2.5, 2.6""" + + def _import_and_get_lines(self, transactions_text): + content = _make_txt(transactions_text).encode('cp1251') + wizard = self._wizard(content, 'statement.txt') + wizard.action_import_invoice() + return self.env['account.bank.statement.line'].search([], order='id desc') + + def test_company_as_payer_creates_negative_amount(self): + """Req 2.4 — company INN as payer → negative amount line.""" + lines = self._import_and_get_lines(_payer_tx()) + payer_lines = lines.filtered(lambda l: l.payment_ref == '1') + self.assertTrue(payer_lines, "Expected a statement line with payment_ref='1'") + self.assertLess(payer_lines[0].amount, 0, "Amount should be negative when company is payer") + + def test_company_as_recipient_creates_positive_amount(self): + """Req 2.5 — company INN as recipient → positive amount line.""" + lines = self._import_and_get_lines(_recipient_tx()) + recipient_lines = lines.filtered(lambda l: l.payment_ref == '2') + self.assertTrue(recipient_lines, "Expected a statement line with payment_ref='2'") + self.assertGreater(recipient_lines[0].amount, 0, "Amount should be positive when company is recipient") + + def test_duplicate_line_is_skipped(self): + """Req 2.6 — importing the same transaction twice does not create a duplicate.""" + tx = _payer_tx() + content = _make_txt(tx).encode('cp1251') + + # First import + self._wizard(content, 'statement.txt').action_import_invoice() + count_after_first = self.env['account.bank.statement.line'].search_count( + [('payment_ref', '=', '1')] + ) + + # Second import of the same file + self._wizard(content, 'statement.txt').action_import_invoice() + count_after_second = self.env['account.bank.statement.line'].search_count( + [('payment_ref', '=', '1')] + ) + + self.assertEqual(count_after_first, count_after_second, + "Duplicate transaction should be skipped on second import") + + +# --------------------------------------------------------------------------- +# TestParser1CPartner +# --------------------------------------------------------------------------- + +class TestParser1CPartner(_Base): + """Validates: Requirements 2.7, 2.9""" + + def test_unknown_inn_kpp_creates_new_partner(self): + """Req 2.7 — unknown INN/KPP → new partner of type 'company' is created.""" + # Ensure partner does not exist + self.env['res.partner'].search([('vat', '=', PARTNER_INN)]).unlink() + + content = _make_txt(_payer_tx()).encode('cp1251') + self._wizard(content, 'statement.txt').action_import_invoice() + + partner = self.env['res.partner'].search([('vat', '=', PARTNER_INN)], limit=1) + self.assertTrue(partner, "A new partner should have been created") + self.assertEqual(partner.company_type, 'company', + "New partner should have company_type='company'") + + def test_unknown_company_inn_in_transaction_raises_user_error(self): + """Req 2.9 — company INN not found as payer or recipient → UserError.""" + content = _make_txt(_unknown_inn_tx()).encode('cp1251') + wizard = self._wizard(content, 'statement.txt') + with self.assertRaises(UserError): + wizard.action_import_invoice() diff --git a/account_bank_statement_1c_import/views/account_journal_dashboard_inherit.xml b/account_bank_statement_1c_import/views/account_journal_dashboard_inherit.xml new file mode 100644 index 00000000..807456eb --- /dev/null +++ b/account_bank_statement_1c_import/views/account_journal_dashboard_inherit.xml @@ -0,0 +1,16 @@ + + + account.dashboard.inherit + account.journal + + + + + + + + \ No newline at end of file diff --git a/account_bank_statement_1c_import/views/account_journal_settings.xml b/account_bank_statement_1c_import/views/account_journal_settings.xml new file mode 100644 index 00000000..51fd6402 --- /dev/null +++ b/account_bank_statement_1c_import/views/account_journal_settings.xml @@ -0,0 +1,14 @@ + + + + account.journal.form.inherit + account.journal + + + + + + + + + \ No newline at end of file diff --git a/account_bank_statement_1c_import/views/account_journal_wizard_action.xml b/account_bank_statement_1c_import/views/account_journal_wizard_action.xml new file mode 100644 index 00000000..d73c3feb --- /dev/null +++ b/account_bank_statement_1c_import/views/account_journal_wizard_action.xml @@ -0,0 +1,17 @@ + + + Import Invoice Wizard + + + code + + action = { + 'type': 'ir.actions.act_window', + 'view_mode': 'form', + 'res_model': 'invoice.import.wizard', + 'target': 'new', + 'name': 'Import Invoice' + } + + + \ No newline at end of file diff --git a/account_bank_statement_1c_import/views/invoice_import_menu.xml b/account_bank_statement_1c_import/views/invoice_import_menu.xml new file mode 100644 index 00000000..e8f30483 --- /dev/null +++ b/account_bank_statement_1c_import/views/invoice_import_menu.xml @@ -0,0 +1,7 @@ + + + \ No newline at end of file diff --git a/account_bank_statement_1c_import/wizard/__init__.py b/account_bank_statement_1c_import/wizard/__init__.py new file mode 100644 index 00000000..f1355e67 --- /dev/null +++ b/account_bank_statement_1c_import/wizard/__init__.py @@ -0,0 +1 @@ +from . import invoice_import_wizard \ No newline at end of file diff --git a/account_bank_statement_1c_import/wizard/invoice_import_wizard.py b/account_bank_statement_1c_import/wizard/invoice_import_wizard.py new file mode 100644 index 00000000..642c7613 --- /dev/null +++ b/account_bank_statement_1c_import/wizard/invoice_import_wizard.py @@ -0,0 +1,202 @@ +from odoo import models, fields, _ +from odoo.exceptions import UserError +import base64 +import dateutil.parser +# import logging + +# _logger = logging.getLogger(__name__) + + +class InvoiceImportWizard(models.TransientModel): + _name = 'invoice.import.wizard' + _description = 'Import Invoice' + + file = fields.Binary(string='File', required=True) + file_name = fields.Char(string='File Name') + + def action_import_invoice(self): + # _logger.info("Начало импорта файла выписки") + + if not self.file: + # _logger.error("Файл не загружен") + raise UserError(_("Please upload the file.")) + + if not self.file_name.endswith('.txt'): + # _logger.error("Неподдерживаемый формат файла: %s", self.file_name) + raise UserError(_("Only TXT files are allowed.")) + + file_content = base64.b64decode(self.file).decode('cp1251') + journal = self.env['account.journal'].search([('type', '=', 'bank'), ('use_in_bank_statement', '=', True)], + limit=1) + if not journal: + raise UserError(_("Suitable journal not found.")) + + try: + sections = file_content.split('СекцияДокумент') + invoice_sections = sections[0] + transaction_sections = sections[1:] + + invoices = invoice_sections.split('СекцияРасчСчет')[1:] + for invoice in invoices: + statement_data = self.parse_statement_data(invoice) + + existing_statement = self.env['account.bank.statement'].search([ + ('date_from', '=', dateutil.parser.parse(statement_data.get('ДатаНачала', '').strip(), dayfirst=True).date()), + ('name', '=', statement_data.get('РасчСчет', '').strip()), + ], limit=1) + + if not existing_statement: + statement = self.create_statement(journal, statement_data) + # _logger.info("Выписка создана успешно: %s", statement.name) + self.create_statement_lines(journal, transaction_sections) + + + except Exception as e: + # _logger.error("Ошибка при импорте файла: %s", e) + raise UserError(_("Error Import: %s" % str(e))) + + message_title = _("Импорт завершен") + message_content = _("Выписка успешно импортирована.") + + return { + 'type': 'ir.actions.client', + 'tag': 'display_notification', + 'params': { + 'title': message_title, + 'message': message_content, + }, + } + + def parse_statement_data(self, section): + lines = section.strip().split('\n') + statement_data = {} + for line in lines: + if '=' in line: + key, value = line.split('=', 1) + statement_data[key] = value + return statement_data + + def create_statement(self, journal, statement_data): + statement_vals = { + 'journal_id': journal.id, + 'name': statement_data.get('РасчСчет', '').strip(), + 'balance_start': float(statement_data.get('НачальныйОстаток', '0.0').strip()), + 'balance_end_real': float(statement_data.get('КонечныйОстаток', '0.0').strip()), + 'date_from': dateutil.parser.parse(statement_data.get('ДатаНачала', '').strip(), dayfirst=True).date(), + } + + return self.env['account.bank.statement'].sudo().create(statement_vals) + + def create_statement_lines(self, journal, sections): + for section in sections: + if section.strip(): + lines = section.strip().split('\n') + transaction = self.parse_transaction_data(lines) + if transaction: + # _logger.info("<==================================>") + # _logger.info("Создание строки выписки для транзакции №%s", transaction.get('Номер').strip()) + self.create_line(journal, transaction) + # _logger.info("Строка выписки для транзакции №%s создана успешно", transaction.get('Номер').strip()) + + def parse_transaction_data(self, lines): + transaction = {} + for line in lines: + if '=' in line: + key, value = line.split('=', 1) + transaction[key] = value + return transaction + + def create_line(self, journal, transaction): + my_company_inn = journal.company_id.vat + + transaction_date = dateutil.parser.parse(transaction.get('Дата', '').strip(), dayfirst=True).date() + statement = self.env['account.bank.statement'].search([ + ('date_from', '=', transaction_date), + ], limit=1) + + if not statement: + raise UserError(_("Statement not found for journal {} on date {}.").format(journal.name, transaction_date)) + + amount = float(transaction.get('Сумма', '0.0').strip()) + + if transaction.get('ПлательщикИНН').strip() == my_company_inn: + amount = -amount + partner_inn = transaction.get('ПолучательИНН').strip() + partner_kpp = transaction.get('ПолучательКПП').strip() + partner_name = transaction.get('Получатель').strip() + partner_account = transaction.get('ПолучательСчет').strip() + bank_bik = transaction.get('ПолучательБИК').strip() + bank_account = transaction.get('ПолучательКорсчет').strip() + bank_name = transaction.get('ПолучательБанк1').strip() + elif transaction.get('ПолучательИНН').strip() == my_company_inn: + # Если наша компания - получатель, значит это доход + partner_inn = transaction.get('ПлательщикИНН').strip() + partner_kpp = transaction.get('ПлательщикКПП').strip() + partner_name = transaction.get('Плательщик').strip() + partner_account = transaction.get('ПлательщикСчет').strip() + bank_bik = transaction.get('ПлательщикБИК').strip() + bank_account = transaction.get('ПлательщикКорсчет').strip() + bank_name = transaction.get('ПлательщикБанк1').strip() + else: + error_message = "ИНН вашей компании не найден в транзакции. Запись не создана." + error_message += "Журнал: {}, Дата транзакции: {}. ".format(journal.name, transaction_date) + error_message += "Плательщик: {}, ИНН плательщика: {}. ".format(transaction.get('Плательщик1', 'не указан').strip(), + transaction.get('ПлательщикИНН', + 'не указан').strip()) + error_message += "Получатель: {}, ИНН получателя: {}. ".format(transaction.get('Получатель1', 'не указан').strip(), + transaction.get('ПолучательИНН', + 'не указан').strip()) + raise UserError(_(f"{error_message}")) + + existing_line = self.env['account.bank.statement.line'].search([ + ('date', '=', transaction_date), + ('amount', '=', amount), + ('narration', '=', transaction.get('НазначениеПлатежа', '').strip()), + ('payment_ref', '=', transaction.get('Номер').strip()), + ], limit=1) + + if existing_line: + # _logger.info("Строка выписки уже существует: %s", existing_line.id) + return None + + partner = self.env['res.partner'].search([('vat', '=', partner_inn), ('kpp', '=', partner_kpp)], limit=1) + if not partner: + # _logger.info("Создание нового партнера: ИНН %s, КПП %s", partner_inn, partner_kpp) + partner = self.env['res.partner'].create({ + 'name': partner_name, + 'vat': partner_inn, + 'kpp': partner_kpp, + 'company_type': 'company', + }) + + bank = self.env['res.bank'].search([('bic', '=', bank_bik), ('corr_acc', '=', bank_account)], limit=1) + if not bank: + # _logger.info("Создание нового банка: БИК %s", bank_bik) + bank = self.env['res.bank'].create({ + 'name': bank_name, + 'bic': bank_bik, + 'corr_acc': bank_account, + }) + + partner_bank_account = self.env['res.partner.bank'].search( + [('acc_number', '=', partner_account), ('partner_id', '=', partner.id)], limit=1) + if not partner_bank_account: + # _logger.info("Создание нового банковского счета для партнера %s", partner.name) + partner_bank_account = self.env['res.partner.bank'].create({ + 'acc_number': partner_account, + 'bank_id': bank.id, + 'partner_id': partner.id, + }) + + line_vals = { + 'journal_id': journal.id, + 'partner_bank_id': partner_bank_account.id, + 'partner_id': partner.id, + 'statement_id': statement.id, + 'company_id': journal.company_id.id, + 'date': transaction_date, + 'amount': amount, + 'narration': transaction.get('НазначениеПлатежа', '').strip(), + 'payment_ref': transaction.get('Номер').strip(), + } + self.env['account.bank.statement.line'].sudo().create(line_vals) diff --git a/account_bank_statement_1c_import/wizard/invoice_import_wizard.xml b/account_bank_statement_1c_import/wizard/invoice_import_wizard.xml new file mode 100644 index 00000000..81b2197c --- /dev/null +++ b/account_bank_statement_1c_import/wizard/invoice_import_wizard.xml @@ -0,0 +1,25 @@ + + + invoice.import.wizard.form + invoice.import.wizard + +
+ + + + +
+
+
+
+
+ + + Import Invoice + invoice.import.wizard + form + new + +
\ No newline at end of file diff --git a/account_move_templates/README.rst b/account_move_templates/README.rst new file mode 100644 index 00000000..b727c8ec --- /dev/null +++ b/account_move_templates/README.rst @@ -0,0 +1,97 @@ +============================ +Шаблоны типовых операций +============================ + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 + +|badge1| |badge2| + +Модуль позволяет создавать шаблоны типовых финансовых операций и применять их +для создания проводок с заранее определённым распределением по счетам. + +**Содержание** + +.. contents:: + :local: + +Возможности +=========== + +* Создание многократно используемых шаблонов типовых операций +* Определение распределения по счетам с использованием процентов +* Применение шаблонов для создания проводок через визард +* Категоризация шаблонов с помощью признаков (тегов) +* Автоматическая проверка баланса шаблона (дебет = кредит) +* Поддержка двух типов строк: + + * Продуктовая строка - заменяет счёт в существующих строках + * Строка оплаты - создаёт новые строки дебиторки/кредиторки + +Настройка +========= + +Для настройки модуля необходимо: + +#. Перейти в *Бухгалтерия > Настройка > Шаблоны типовых операций* +#. Создать новый шаблон +#. Добавить строки шаблона с указанием: + + * Счёт + * Сторона (Дебет/Кредит) + * Процент (0.01-100.00%) + * Тип строки: + + * Продуктовая строка - заменяет счёт в существующих product-строках + * Строка оплаты - создаёт новые receivable/payable строки + +#. При необходимости добавить признаки для категоризации + +Модуль автоматически проверяет, что сумма процентов по дебету равна сумме процентов по кредиту. + +Использование +============= + +Для использования модуля: + +#. Откройте любой документ, который наследует ``account.move.template.mixin`` +#. Нажмите кнопку "Создать проводку по шаблону" +#. Выберите шаблон +#. Укажите базовую сумму +#. Нажмите "Создать проводку" + +Модуль создаст новую проводку со счетами, распределёнными согласно процентам в шаблоне. + +Отслеживание ошибок +=================== + +Ошибки отслеживаются на `GitHub Issues `_. +В случае проблем, пожалуйста, проверьте, не была ли ваша проблема уже зарегистрирована. + +Авторы +====== + +Авторы +~~~~~~ + +* MK.Lab, RuOdoo + +Участники +~~~~~~~~~ + +* MK.Lab, RuOdoo + +Сопровождающие +~~~~~~~~~~~~~~ + +Модуль сопровождается MK.Lab, RuOdoo. + +.. image:: https://ruodoo.ru/logo.png + :alt: MK.Lab, RuOdoo + :target: https://ruodoo.ru + +Модуль является частью проекта расширений для бухгалтерии. diff --git a/account_move_templates/__init__.py b/account_move_templates/__init__.py new file mode 100644 index 00000000..0650744f --- /dev/null +++ b/account_move_templates/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/account_move_templates/__manifest__.py b/account_move_templates/__manifest__.py new file mode 100644 index 00000000..8b89340e --- /dev/null +++ b/account_move_templates/__manifest__.py @@ -0,0 +1,36 @@ +{ + 'name': 'Accounting Journal Templates', + 'version': '19.0.1.0.0', + 'summary': 'Шаблоны типовых финансовых операций', + 'description': """ +Шаблоны типовых финансовых операций +==================================== + +Создание многократно используемых шаблонов типовых проводок с заранее +определённым распределением по счетам с использованием процентов. + +Возможности: +------------ +* Создание шаблонов с несколькими строками счетов +* Определение сторон (дебет/кредит) и процентов +* Автоматическая проверка баланса шаблона +* Применение шаблонов через визард для создания проводок +* Категоризация шаблонов с помощью признаков (тегов) +* Поддержка продуктовых строк и строк оплаты + """, + 'author': 'MK.Lab, RuOdoo', + 'website': 'https://ruodoo.ru', + 'category': 'Accounting/Accounting', + 'depends': ['account'], + 'data': [ + 'security/ir.model.access.csv', + 'data/demo_templates.xml', + 'views/account_move_template_views.xml', + 'views/account_move_template_wizard_views.xml', + ], + 'demo': [], + 'installable': True, + 'application': False, + 'license': 'LGPL-3', + 'maintainers': ['mklab', 'ruodoo'], +} diff --git a/account_move_templates/data/demo_templates.xml b/account_move_templates/data/demo_templates.xml new file mode 100644 index 00000000..600f906a --- /dev/null +++ b/account_move_templates/data/demo_templates.xml @@ -0,0 +1,13 @@ + + + + + Склад + 1 + + + Продажи + 2 + + + diff --git a/account_move_templates/demo/demo.xml b/account_move_templates/demo/demo.xml new file mode 100644 index 00000000..d8a5f55e --- /dev/null +++ b/account_move_templates/demo/demo.xml @@ -0,0 +1,20 @@ + + + + + + + Общие + 3 + + + Налоги + 4 + + + + + + + + diff --git a/account_move_templates/models/__init__.py b/account_move_templates/models/__init__.py new file mode 100644 index 00000000..5d8c51a3 --- /dev/null +++ b/account_move_templates/models/__init__.py @@ -0,0 +1,3 @@ +from . import account_move_template +from . import account_move_template_mixin +from . import account_move_template_wizard diff --git a/account_move_templates/models/account_move_template.py b/account_move_templates/models/account_move_template.py new file mode 100644 index 00000000..fe96da09 --- /dev/null +++ b/account_move_templates/models/account_move_template.py @@ -0,0 +1,94 @@ +from odoo import api, fields, models +from odoo.exceptions import ValidationError + + +class AccountMoveTemplateTag(models.Model): + _name = 'account.move.template.tag' + _description = 'Признак шаблона' + + name = fields.Char(string='Название', required=True, translate=True) + color = fields.Integer(string='Цвет') + + +class AccountMoveTemplate(models.Model): + _name = 'account.move.template' + _description = 'Шаблон типовой операции' + + name = fields.Char(string='Название', required=True) + description = fields.Text(string='Описание') + tag_ids = fields.Many2many( + comodel_name='account.move.template.tag', + string='Признаки', + ) + line_ids = fields.One2many( + comodel_name='account.move.template.line', + inverse_name='template_id', + string='Строки шаблона', + ) + + @api.constrains('line_ids') + def _check_balance(self): + for template in self: + if not template.line_ids: + raise ValidationError( + 'Шаблон должен содержать хотя бы одну строку.' + ) + debit_sum = sum( + line.percent for line in template.line_ids if line.move_type == 'debit' + ) + credit_sum = sum( + line.percent for line in template.line_ids if line.move_type == 'credit' + ) + if round(debit_sum, 2) != round(credit_sum, 2): + diff = round(abs(debit_sum - credit_sum), 2) + raise ValidationError( + f'Сумма дебета ({debit_sum:.2f}%) не равна сумме кредита ' + f'({credit_sum:.2f}%), разница: {diff:.2f}%' + ) + + +class AccountMoveTemplateLine(models.Model): + _name = 'account.move.template.line' + _description = 'Строка шаблона типовой операции' + + template_id = fields.Many2one( + comodel_name='account.move.template', + string='Шаблон', + required=True, + ondelete='cascade', + ) + account_id = fields.Many2one( + comodel_name='account.account', + string='Счёт', + required=True, + ondelete='restrict', + ) + move_type = fields.Selection( + selection=[('debit', 'Дебет'), ('credit', 'Кредит')], + string='Сторона', + required=True, + ) + percent = fields.Float( + string='Процент', + required=True, + digits=(5, 2), + ) + line_type = fields.Selection( + selection=[ + ('product', 'Продуктовая строка (заменяет счёт)'), + ('payment', 'Строка оплаты (receivable/payable)') + ], + string='Тип строки', + required=True, + default='product', + help='Продуктовая строка заменяет счёт в существующих product-строках инвойса. ' + 'Строка оплаты создаёт новую payment_term строку.' + ) + + @api.constrains('percent') + def _check_percent(self): + for line in self: + if line.percent < 0.01 or line.percent > 100.0: + raise ValidationError( + 'Процент должен быть от 0.01 до 100.00.' + ) diff --git a/account_move_templates/models/account_move_template_mixin.py b/account_move_templates/models/account_move_template_mixin.py new file mode 100644 index 00000000..5fd0fe73 --- /dev/null +++ b/account_move_templates/models/account_move_template_mixin.py @@ -0,0 +1,57 @@ +from odoo import api, fields, models + + +class AccountMoveTemplateMixin(models.AbstractModel): + _name = 'account.move.template.mixin' + _description = 'Миксин для создания проводок через шаблоны' + + move_ids = fields.Many2many( + comodel_name='account.move', + string='Проводки', + ) + move_count = fields.Integer( + compute='_compute_move_count', + string='Количество проводок', + ) + + @api.depends('move_ids') + def _compute_move_count(self): + for record in self: + record.move_count = len(record.move_ids) + + def action_open_journal_wizard(self): + """If move_ids is empty, open wizard. Otherwise delegate to action_view_moves.""" + self.ensure_one() + if self.move_ids: + return self.action_view_moves() + amounts = self.get_move_line_amounts() + default_amount = amounts[0]['amount'] if amounts else 0.0 + return { + 'type': 'ir.actions.act_window', + 'name': 'Создать проводку', + 'res_model': 'account.move.template.wizard', + 'view_mode': 'form', + 'target': 'new', + 'context': { + 'default_res_model': self._name, + 'default_res_id': self.id, + 'default_amount': default_amount, + }, + } + + def action_view_moves(self): + """Return action to view related account.move records.""" + self.ensure_one() + return { + 'type': 'ir.actions.act_window', + 'name': 'Проводки', + 'res_model': 'account.move', + 'view_mode': 'list,form', + 'domain': [('id', 'in', self.move_ids.ids)], + } + + def get_move_line_amounts(self): + """Override in inheriting models to provide line amounts. + Returns list of dicts: [{'name': str, 'amount': float}, ...] + """ + return [] diff --git a/account_move_templates/models/account_move_template_wizard.py b/account_move_templates/models/account_move_template_wizard.py new file mode 100644 index 00000000..13cc7f26 --- /dev/null +++ b/account_move_templates/models/account_move_template_wizard.py @@ -0,0 +1,103 @@ +from odoo import api, fields, models +from odoo.exceptions import UserError + + +class AccountMoveTemplateWizardLine(models.TransientModel): + _name = 'account.move.template.wizard.line' + _description = 'Черновая строка визарда шаблона' + + wizard_id = fields.Many2one( + comodel_name='account.move.template.wizard', + required=True, + ondelete='cascade', + ) + account_id = fields.Many2one( + comodel_name='account.account', + string='Счёт', + required=True, + ) + move_type = fields.Selection( + selection=[('debit', 'Дебет'), ('credit', 'Кредит')], + string='Сторона', + required=True, + ) + amount = fields.Float( + string='Сумма', + digits=(16, 2), + ) + + +class AccountMoveTemplateWizard(models.TransientModel): + _name = 'account.move.template.wizard' + _description = 'Визард создания проводки по шаблону' + + res_model = fields.Char(string='Модель документа', required=True) + res_id = fields.Integer(string='ID документа', required=True) + template_id = fields.Many2one( + comodel_name='account.move.template', + string='Шаблон', + ) + amount = fields.Float( + string='Базовая сумма', + digits=(16, 2), + ) + draft_line_ids = fields.One2many( + comodel_name='account.move.template.wizard.line', + inverse_name='wizard_id', + string='Черновые строки', + ) + + @api.onchange('template_id', 'amount') + def _onchange_compute_draft_lines(self): + """Recompute draft lines when template or amount changes.""" + self.draft_line_ids = [(5, 0, 0)] # clear existing + if not self.template_id or not self.amount: + return + lines = [] + for tpl_line in self.template_id.line_ids: + line_amount = self.amount * tpl_line.percent / 100.0 + lines.append((0, 0, { + 'account_id': tpl_line.account_id.id, + 'move_type': tpl_line.move_type, + 'amount': line_amount, + })) + self.draft_line_ids = lines + + def action_post(self): + """Create account.move from draft lines and link to source document.""" + self.ensure_one() + if not self.template_id or not self.amount: + raise UserError('Необходимо выбрать шаблон и указать базовую сумму.') + + try: + # Build move lines + move_line_vals = [] + for draft_line in self.draft_line_ids: + if draft_line.move_type == 'debit': + debit = draft_line.amount + credit = 0.0 + else: + debit = 0.0 + credit = draft_line.amount + move_line_vals.append((0, 0, { + 'account_id': draft_line.account_id.id, + 'debit': debit, + 'credit': credit, + 'name': self.template_id.name, + })) + + # Create the move + move = self.env['account.move'].create({ + 'move_type': 'entry', + 'state': 'draft', + 'line_ids': move_line_vals, + }) + + # Link move to source document via move_ids + source_record = self.env[self.res_model].browse(self.res_id) + source_record.move_ids = [(4, move.id)] + + except Exception as e: + raise UserError(f'Ошибка при создании проводки: {str(e)}') from e + + return {'type': 'ir.actions.act_window_close'} diff --git a/account_move_templates/security/ir.model.access.csv b/account_move_templates/security/ir.model.access.csv new file mode 100644 index 00000000..fcb0f79b --- /dev/null +++ b/account_move_templates/security/ir.model.access.csv @@ -0,0 +1,6 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_account_move_template_user,account.move.template user,model_account_move_template,account.group_account_user,1,1,1,1 +access_account_move_template_line_user,account.move.template.line user,model_account_move_template_line,account.group_account_user,1,1,1,1 +access_account_move_template_tag_user,account.move.template.tag user,model_account_move_template_tag,account.group_account_user,1,1,1,1 +access_account_move_template_wizard_user,account.move.template.wizard user,model_account_move_template_wizard,account.group_account_user,1,1,1,1 +access_account_move_template_wizard_line_user,account.move.template.wizard.line user,model_account_move_template_wizard_line,account.group_account_user,1,1,1,1 diff --git a/account_move_templates/tests/__init__.py b/account_move_templates/tests/__init__.py new file mode 100644 index 00000000..80e48924 --- /dev/null +++ b/account_move_templates/tests/__init__.py @@ -0,0 +1 @@ +from . import test_template diff --git a/account_move_templates/tests/test_template.py b/account_move_templates/tests/test_template.py new file mode 100644 index 00000000..ad235bfb --- /dev/null +++ b/account_move_templates/tests/test_template.py @@ -0,0 +1,200 @@ +""" +Tests for Template_Engine (account_move_templates). + +Validates: Requirements 3.1, 3.2, 3.3, 3.4, 3.5 +""" +from odoo.exceptions import ValidationError +from odoo.tests.common import TransactionCase + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + +def _get_account(env, account_type='asset_current'): + """Return an existing account of the given type, or create one.""" + account = env['account.account'].search( + [('account_type', '=', account_type)], limit=1 + ) + if not account: + account = env['account.account'].create({ + 'name': f'Test Account ({account_type})', + 'code': f'TST{account_type[:4].upper()}', + 'account_type': account_type, + }) + return account + + +def _make_template(env, name='Test Template', lines=None): + """Create an AccountMoveTemplate with the given lines. + + lines: list of dicts with keys: account_id, move_type, percent, line_type + """ + vals = {'name': name} + if lines is not None: + vals['line_ids'] = [(0, 0, line) for line in lines] + return env['account.move.template'].create(vals) + + +# --------------------------------------------------------------------------- +# TestMoveTemplateValidation +# --------------------------------------------------------------------------- + +class TestMoveTemplateValidation(TransactionCase): + """Validates: Requirements 3.1, 3.2, 3.3, 3.4""" + + def setUp(self): + super().setUp() + self.account_debit = _get_account(self.env, 'asset_current') + self.account_credit = _get_account(self.env, 'liability_current') + + def _line(self, move_type, percent, account=None): + if account is None: + account = self.account_debit if move_type == 'debit' else self.account_credit + return { + 'account_id': account.id, + 'move_type': move_type, + 'percent': percent, + 'line_type': 'product', + } + + def test_no_lines_raises_validation_error(self): + """Req 3.1 — template without lines raises ValidationError.""" + with self.assertRaises(ValidationError): + _make_template(self.env, name='Empty Template', lines=[]) + + def test_imbalanced_percentages_raises_validation_error(self): + """Req 3.2 — debit sum != credit sum raises ValidationError.""" + with self.assertRaises(ValidationError): + _make_template(self.env, name='Imbalanced', lines=[ + self._line('debit', 60.0), + self._line('credit', 40.0), + ]) + + def test_balanced_percentages_saves_without_error(self): + """Req 3.3 — debit sum == credit sum saves without error.""" + template = _make_template(self.env, name='Balanced', lines=[ + self._line('debit', 100.0), + self._line('credit', 100.0), + ]) + self.assertTrue(template.id, "Template should be saved with a valid ID") + + def test_percent_below_minimum_raises_validation_error(self): + """Req 3.4 — percent < 0.01 raises ValidationError.""" + with self.assertRaises(ValidationError): + _make_template(self.env, name='Low Percent', lines=[ + self._line('debit', 0.001), + self._line('credit', 0.001), + ]) + + def test_percent_above_maximum_raises_validation_error(self): + """Req 3.4 — percent > 100.0 raises ValidationError.""" + with self.assertRaises(ValidationError): + _make_template(self.env, name='High Percent', lines=[ + self._line('debit', 101.0), + self._line('credit', 101.0), + ]) + + +# --------------------------------------------------------------------------- +# TestMoveTemplateWizard +# --------------------------------------------------------------------------- + +class TestMoveTemplateWizard(TransactionCase): + """Validates: Requirement 3.5""" + + def setUp(self): + super().setUp() + self.account_debit = _get_account(self.env, 'asset_current') + self.account_credit = _get_account(self.env, 'liability_current') + + # Create a balanced template: 100% debit / 100% credit + self.template = self.env['account.move.template'].create({ + 'name': 'Wizard Test Template', + 'line_ids': [ + (0, 0, { + 'account_id': self.account_debit.id, + 'move_type': 'debit', + 'percent': 100.0, + 'line_type': 'product', + }), + (0, 0, { + 'account_id': self.account_credit.id, + 'move_type': 'credit', + 'percent': 100.0, + 'line_type': 'product', + }), + ], + }) + + # Create a source document that uses the mixin (account.move itself + # does not use the mixin, so we create a minimal move to act as source) + self.source_move = self.env['account.move'].create({ + 'move_type': 'entry', + 'state': 'draft', + 'line_ids': [ + (0, 0, { + 'account_id': self.account_debit.id, + 'debit': 0.0, + 'credit': 0.0, + 'name': 'Source line', + }), + ], + }) + + def test_apply_template_creates_draft_move_with_correct_distribution(self): + """Req 3.5 — applying template via wizard creates a draft account.move + with correct account distribution.""" + base_amount = 1000.0 + + wizard = self.env['account.move.template.wizard'].create({ + 'res_model': 'account.move', + 'res_id': self.source_move.id, + 'template_id': self.template.id, + 'amount': base_amount, + }) + + # Trigger onchange to populate draft lines + wizard._onchange_compute_draft_lines() + + # Verify draft lines were computed + self.assertEqual(len(wizard.draft_line_ids), 2, + "Wizard should have 2 draft lines (one debit, one credit)") + + debit_line = wizard.draft_line_ids.filtered(lambda l: l.move_type == 'debit') + credit_line = wizard.draft_line_ids.filtered(lambda l: l.move_type == 'credit') + + self.assertAlmostEqual(debit_line.amount, base_amount, + msg="Debit line amount should equal base_amount * 100%") + self.assertAlmostEqual(credit_line.amount, base_amount, + msg="Credit line amount should equal base_amount * 100%") + + # Post the wizard — creates the account.move + wizard.action_post() + + # Reload source move and check linked moves + self.source_move.invalidate_recordset() + linked_moves = self.source_move.move_ids + + self.assertTrue(linked_moves, "A new account.move should be linked to the source") + + new_move = linked_moves[-1] + self.assertEqual(new_move.state, 'draft', + "Created move should be in draft state") + + move_lines = new_move.line_ids + debit_move_line = move_lines.filtered(lambda l: l.debit > 0) + credit_move_line = move_lines.filtered(lambda l: l.credit > 0) + + self.assertTrue(debit_move_line, "Move should have a debit line") + self.assertTrue(credit_move_line, "Move should have a credit line") + + self.assertAlmostEqual(debit_move_line[0].debit, base_amount, + msg="Debit amount on move line should match base_amount") + self.assertAlmostEqual(credit_move_line[0].credit, base_amount, + msg="Credit amount on move line should match base_amount") + + self.assertEqual(debit_move_line[0].account_id, self.account_debit, + "Debit line should use the debit account from template") + self.assertEqual(credit_move_line[0].account_id, self.account_credit, + "Credit line should use the credit account from template") diff --git a/account_move_templates/views/account_move_template_views.xml b/account_move_templates/views/account_move_template_views.xml new file mode 100644 index 00000000..dc39da61 --- /dev/null +++ b/account_move_templates/views/account_move_template_views.xml @@ -0,0 +1,82 @@ + + + + + + + account.move.template.list + account.move.template + + + + + + + + + + + + account.move.template.form + account.move.template + +
+ +
+
+ + + + + + + + + + + + + + + + +
+
+
+
+ + + + account.move.template.search + account.move.template + + + + + + + + + + + + Шаблоны типовых операций + account.move.template + list,form + + + + + + +
+
diff --git a/account_move_templates/views/account_move_template_wizard_views.xml b/account_move_templates/views/account_move_template_wizard_views.xml new file mode 100644 index 00000000..9eb44978 --- /dev/null +++ b/account_move_templates/views/account_move_template_wizard_views.xml @@ -0,0 +1,30 @@ + + + + + account.move.template.wizard.form + account.move.template.wizard + +
+ + + + + + + + + + + +
+
+
+
+
+
+
diff --git a/account_move_templates_invoice/README.rst b/account_move_templates_invoice/README.rst new file mode 100644 index 00000000..6977ab58 --- /dev/null +++ b/account_move_templates_invoice/README.rst @@ -0,0 +1,103 @@ +==================================================== +Шаблоны типовых операций - Интеграция с инвойсами +==================================================== + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 + +|badge1| |badge2| + +Модуль расширяет функциональность шаблонов типовых операций для работы +с инвойсами клиентов и счетами поставщиков, автоматически применяя шаблоны +при проведении документов. + +**Содержание** + +.. contents:: + :local: + +Возможности +=========== + +* Автоматическое применение шаблонов при проведении инвойсов +* Замена стандартного распределения по счетам на распределение из шаблона +* Поддержка инвойсов клиентов и счетов поставщиков +* Настройка через параметры системы +* Сохранение строк инвойса с обновлением счетов в проводках +* Автоматическое создание строк оплаты с датами погашения + +Настройка +========= + +Для настройки модуля необходимо: + +#. Перейти в *Бухгалтерия > Настройка > Параметры* +#. В разделе "Шаблоны типовых операций" включить опцию "Использовать шаблоны для инвойсов" +#. Сохранить настройки + +Настройка шаблонов: +~~~~~~~~~~~~~~~~~~~ + +При создании шаблонов для инвойсов настройте типы строк: + +* **Продуктовая строка**: Заменяет счёт в существующих продуктовых строках (счета доходов/расходов) +* **Строка оплаты**: Создаёт строки дебиторки/кредиторки с датами погашения + +Использование +============= + +После настройки модуль работает автоматически: + +#. Создайте инвойс клиента или счёт поставщика +#. Добавьте строки инвойса как обычно +#. Выберите шаблон типовой операции в поле "Шаблон типовой операции" +#. Нажмите "Провести" + +Модуль выполнит следующие действия: + +* Удалит стандартные строки условий оплаты +* Обновит счета в продуктовых строках согласно шаблону (line_type='product') +* Создаст новые строки оплаты согласно шаблону (line_type='payment') +* Установит корректные даты погашения для счетов дебиторки/кредиторки +* Проведёт инвойс с распределением по счетам из шаблона + +Известные проблемы / Планы развития +==================================== + +* В настоящее время поддерживаются только типы документов out_invoice и in_invoice +* Шаблон должен быть выбран до проведения документа +* В планах: Автоматический выбор шаблона на основе свойств инвойса + +Отслеживание ошибок +=================== + +Ошибки отслеживаются на `GitHub Issues `_. +В случае проблем, пожалуйста, проверьте, не была ли ваша проблема уже зарегистрирована. + +Авторы +====== + +Авторы +~~~~~~ + +* MK.Lab, RuOdoo + +Участники +~~~~~~~~~ + +* MK.Lab, RuOdoo + +Сопровождающие +~~~~~~~~~~~~~~ + +Модуль сопровождается MK.Lab, RuOdoo. + +.. image:: https://ruodoo.ru/logo.png + :alt: MK.Lab, RuOdoo + :target: https://ruodoo.ru + +Модуль является частью проекта расширений для бухгалтерии. diff --git a/account_move_templates_invoice/__init__.py b/account_move_templates_invoice/__init__.py new file mode 100644 index 00000000..0650744f --- /dev/null +++ b/account_move_templates_invoice/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/account_move_templates_invoice/__manifest__.py b/account_move_templates_invoice/__manifest__.py new file mode 100644 index 00000000..451ce088 --- /dev/null +++ b/account_move_templates_invoice/__manifest__.py @@ -0,0 +1,42 @@ +{ + 'name': 'Accounting Journal Templates - Invoice', + 'version': '19.0.1.0.0', + 'summary': 'Интеграция шаблонов типовых операций с Invoice и Vendor Bill', + 'description': """ +Шаблоны типовых операций - Интеграция с инвойсами +================================================== + +Автоматическое применение шаблонов типовых операций к инвойсам клиентов и счетам +поставщиков при проведении, заменяя стандартное распределение по счетам на +распределение из шаблона. + +Возможности: +------------ +* Автоматическое применение шаблонов при проведении инвойсов +* Замена счетов в продуктовых строках на счета из шаблона +* Создание строк условий оплаты с корректными датами погашения +* Поддержка инвойсов клиентов и счетов поставщиков +* Настройка через параметры системы +* Сохранение итоговых сумм инвойса + +Технические детали: +------------------- +* Расширяет модель account.move +* Переопределяет метод action_post() +* Обновляет существующие продуктовые строки вместо создания дубликатов +* Создаёт строки payment_term для счетов дебиторки/кредиторки +* Поддерживает баланс и валидацию инвойса + """, + 'author': 'MK.Lab, RuOdoo', + 'website': 'https://ruodoo.ru', + 'category': 'Accounting/Accounting', + 'depends': ['account', 'account_move_templates'], + 'data': [ + 'views/account_move_views.xml', + 'views/res_config_settings_views.xml', + ], + 'installable': True, + 'application': False, + 'license': 'LGPL-3', + 'maintainers': ['mklab', 'ruodoo'], +} diff --git a/account_move_templates_invoice/models/__init__.py b/account_move_templates_invoice/models/__init__.py new file mode 100644 index 00000000..8b309078 --- /dev/null +++ b/account_move_templates_invoice/models/__init__.py @@ -0,0 +1,3 @@ +from . import account_move +from . import account_move_line +from . import res_config_settings diff --git a/account_move_templates_invoice/models/account_move.py b/account_move_templates_invoice/models/account_move.py new file mode 100644 index 00000000..8cd79f6e --- /dev/null +++ b/account_move_templates_invoice/models/account_move.py @@ -0,0 +1,151 @@ +from odoo import api, fields, models +from odoo.exceptions import UserError +import logging + +_logger = logging.getLogger(__name__) + + +class AccountMove(models.Model): + _inherit = ['account.move', 'account.move.template.mixin'] + + move_ids = fields.Many2many( + comodel_name='account.move', + relation='account_move_template_invoice_move_rel', + column1='document_id', + column2='move_id', + string='Проводки по шаблону', + ) + + journal_template_id = fields.Many2one( + comodel_name='account.move.template', + string='Шаблон типовой операции', + default=lambda self: self._default_journal_template(), + ) + + def _default_journal_template(self): + use = self.env['ir.config_parameter'].sudo().get_param( + 'account_move_templates_invoice.use_journal_templates_for_invoices' + ) + if use: + return self.env['account.move.template'].search([], limit=1, order='id asc') + return False + + def get_move_line_amounts(self): + """Return invoice total as the base amount for the wizard.""" + self.ensure_one() + return [{'name': self.name or '/', 'amount': self.amount_total}] + + def _replace_lines_from_template(self, move): + """ + Replace ALL lines (product + payment_term) with template lines + plus one explicit payment_term line with date_maturity. + + We pass 'balance' explicitly in vals so _get_protected_vals protects + it from being overwritten by _sync_invoice. + """ + _logger.info("TEMPLATE DEBUG: _replace_lines_from_template START for move %s", move.id) + template = move.journal_template_id + _logger.info("TEMPLATE DEBUG: template = %s", template) + base_amount = move.amount_untaxed or move.amount_total + _logger.info("TEMPLATE DEBUG: base_amount = %s", base_amount) + + # Determine receivable/payable account + partner = move.commercial_partner_id.with_company(move.company_id) + if move.is_sale_document(include_receipts=True): + term_account = partner.property_account_receivable_id + else: + term_account = partner.property_account_payable_id + _logger.info("TEMPLATE DEBUG: term_account = %s", term_account) + + # due date: use invoice_date_due, invoice_date, or today + due_date = ( + move.invoice_date_due + or move.invoice_date + or fields.Date.context_today(move) + ) + _logger.info("TEMPLATE DEBUG: due_date = %s", due_date) + + # Remove only payment_term lines, keep product lines from invoice_line_ids + _logger.info("TEMPLATE DEBUG: Removing existing payment_term lines") + lines_to_remove = move.line_ids.filtered(lambda l: l.display_type == 'payment_term') + _logger.info("TEMPLATE DEBUG: Lines to remove: %s", [(l.id, l.account_id.code, l.display_type) for l in lines_to_remove]) + lines_to_remove.with_context( + dynamic_unlink=True, + check_move_validity=False, + skip_invoice_sync=True, + ).unlink() + _logger.info("TEMPLATE DEBUG: payment_term lines removed") + + AML = self.env['account.move.line'] + ctx = dict(check_move_validity=False, skip_invoice_sync=True) + + # 1. Process template lines based on line_type + _logger.info("TEMPLATE DEBUG: Processing template lines") + + # Get existing product lines from invoice_line_ids + product_lines = move.line_ids.filtered(lambda l: l.display_type == 'product') + _logger.info("TEMPLATE DEBUG: Found %d product lines", len(product_lines)) + + # Separate template lines by type + template_product_lines = template.line_ids.filtered(lambda l: l.line_type == 'product') + template_payment_lines = template.line_ids.filtered(lambda l: l.line_type == 'payment') + + _logger.info("TEMPLATE DEBUG: Template has %d product lines and %d payment lines", + len(template_product_lines), len(template_payment_lines)) + + # Update existing product lines with accounts from template (line_type='product') + for idx, product_line in enumerate(product_lines): + if idx < len(template_product_lines): + tpl_line = template_product_lines[idx] + _logger.info("TEMPLATE DEBUG: Updating product line %d: old account=%s, new account=%s", + product_line.id, product_line.account_id.code, tpl_line.account_id.code) + product_line.with_context(**ctx).write({'account_id': tpl_line.account_id.id}) + + # Create payment lines from template (line_type='payment') + _logger.info("TEMPLATE DEBUG: Creating payment lines from template") + for tpl_line in template_payment_lines: + line_amount = base_amount * tpl_line.percent / 100.0 + balance = line_amount if tpl_line.move_type == 'debit' else -line_amount + _logger.info("TEMPLATE DEBUG: Creating payment line: account=%s, balance=%s", + tpl_line.account_id.id, balance) + + vals = { + 'move_id': move.id, + 'account_id': tpl_line.account_id.id, + 'name': template.name, + 'balance': balance, + 'amount_currency': balance, + 'date_maturity': due_date, + 'display_type': 'payment_term', + } + + AML.with_context(**ctx).create(vals) + _logger.info("TEMPLATE DEBUG: Template lines processed") + + _logger.info("TEMPLATE DEBUG: _replace_lines_from_template END") + + def action_post(self): + _logger.info("TEMPLATE DEBUG: action_post called for moves: %s", self.ids) + use_templates = self.env['ir.config_parameter'].sudo().get_param( + 'account_move_templates_invoice.use_journal_templates_for_invoices' + ) + _logger.info("TEMPLATE DEBUG: use_templates = %s", use_templates) + + if use_templates: + for move in self.filtered( + lambda m: m.move_type in ('out_invoice', 'in_invoice') + ): + _logger.info("TEMPLATE DEBUG: Processing move %s, template: %s", move.id, move.journal_template_id) + if not move.journal_template_id: + raise UserError( + 'Выберите шаблон типовой операции перед проведением.' + ) + try: + _logger.info("TEMPLATE DEBUG: Calling _replace_lines_from_template") + self._replace_lines_from_template(move) + _logger.info("TEMPLATE DEBUG: _replace_lines_from_template completed") + except Exception as e: + _logger.error("TEMPLATE DEBUG: Error in _replace_lines_from_template: %s", e, exc_info=True) + raise + + return super().action_post() diff --git a/account_move_templates_invoice/models/account_move_line.py b/account_move_templates_invoice/models/account_move_line.py new file mode 100644 index 00000000..65614b6b --- /dev/null +++ b/account_move_templates_invoice/models/account_move_line.py @@ -0,0 +1,7 @@ +from odoo import models + + +class AccountMoveLine(models.Model): + _inherit = 'account.move.line' + + # No overrides needed - we handle everything in action_post() diff --git a/account_move_templates_invoice/models/res_config_settings.py b/account_move_templates_invoice/models/res_config_settings.py new file mode 100644 index 00000000..7793451d --- /dev/null +++ b/account_move_templates_invoice/models/res_config_settings.py @@ -0,0 +1,10 @@ +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = 'res.config.settings' + + use_journal_templates_for_invoices = fields.Boolean( + string='Использовать шаблоны типовых операций для счетов', + config_parameter='account_move_templates_invoice.use_journal_templates_for_invoices', + ) diff --git a/account_move_templates_invoice/views/account_move_views.xml b/account_move_templates_invoice/views/account_move_views.xml new file mode 100644 index 00000000..fb8614a9 --- /dev/null +++ b/account_move_templates_invoice/views/account_move_views.xml @@ -0,0 +1,31 @@ + + + + + account.move.template.invoice.form + account.move + + + + + + + + + + + + + + + + + diff --git a/account_move_templates_invoice/views/res_config_settings_views.xml b/account_move_templates_invoice/views/res_config_settings_views.xml new file mode 100644 index 00000000..9552a4fb --- /dev/null +++ b/account_move_templates_invoice/views/res_config_settings_views.xml @@ -0,0 +1,20 @@ + + + + + res.config.settings.view.form.template.invoice + res.config.settings + + + + + + + + + + + + + diff --git a/base_tier_validation/README.rst b/base_tier_validation/README.rst new file mode 100644 index 00000000..ce33fce2 --- /dev/null +++ b/base_tier_validation/README.rst @@ -0,0 +1,307 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +==================== +Base Tier Validation +==================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:3e44413fd72f8949deba313c3f31047cbf30ba3b17d78342590d2376001d905f + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Mature-brightgreen.png + :target: https://odoo-community.org/page/development-status + :alt: Mature +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--ux-lightgray.png?logo=github + :target: https://github.com/OCA/server-ux/tree/18.0/base_tier_validation + :alt: OCA/server-ux +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/server-ux-18-0/server-ux-18-0-base_tier_validation + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/server-ux&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Validating some operations is a common need across different areas in a +company and sometimes it also involves several people and stages in the +process. With this module you will be able to define your custom +validation workflows for any Odoo document. + +This module does not provide a functionality by itself but an abstract +model to implement a validation process based on tiers on other models +(e.g. purchase orders, sales orders, budgets, expenses...). + +**Note:** To be able to use this module in a new model you will need +some development. + +See +`purchase_tier_validation `__ +as an example of implementation. + +Additionally, if your state field is a (stored) computed field, you need +to set ``_tier_validation_state_field_is_computed`` to ``True`` in your +model Python file, and you will want to add the dependent fields of the +compute method in ``_get_after_validation_exceptions`` and +``_get_under_validation_exceptions``. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To configure this module, you need to: + +1. Go to *Settings > Technical > Tier Validations > Tier Definition*. +2. Create as many tiers as you want for any model having tier validation + functionality. + +**Note:** + +- If check *Notify Reviewers on Creation*, all possible reviewers will + be notified by email when this definition is triggered. +- If check *Notify reviewers on reaching pending* if you want to send a + notification when pending status is reached. This is usefull in a + approve by sequence scenario to only notify reviewers when it is their + turn in the sequence. +- If check *Comment*, reviewers can comment after click Validate or + Reject. +- If check *Approve by sequence*, reviewers is forced to review by + specified sequence. + +To configure Tier Validation Exceptions, you need to: + +1. Go to *Settings > Technical > Tier Validations > Tier Validation + Exceptions*. +2. Create as many tiers validation exceptions as you want for any model + having tier validation functionality. +3. Add desired fields to be checked in *Fields*. +4. Add desired groups that can use this Exception in *Groups*. +5. You must check *Write under Validation*, *Write after Validation* or + both. + +**Note:** + +- If you don't create any exception, the Validated record will be + readonly and cannot be modified. +- If check *Write under Validation*, records will be able to be modified + only in the defined fields when the Validation process is ongoing. +- If check *Write after Validation*, records will be able to be modified + only in the defined fields when the Validation process is finished. +- If check *Write after Validation* and *Write under Validation*, + records will be able to be modified defined fields always. + +Known issues / Roadmap +====================== + +This is the list of known issues for this module. Any proposal for +improvement will be very valuable. + +- **Issue:** + + When using approve_sequence option in any tier.definition there can be + inconsistencies in the systray notifications. + + **Description:** + + Field can_review in tier.review is used to filter out, in the systray + notifications, the reviews a user can approve. This can_review field + is updated **in the database** in method review_user_count, this can + make it very inconsistent for databases with a lot of users and + recurring updates that can change the expected behavior. + +- **Migration to 15.0:** + + The parameter \_tier_validation_manual_config will become False, on + 14.0, the default value is True, as the change is applied after the + migration. In order to use the new behavior we need to modify the + value on our expected model. + +Changelog +========= + +17.0.1.0.0 (2024-01-10) +----------------------- + +Migrated to Odoo 17. Merged module with tier_validation_waiting. To +support sending messages in a validation sequence when it is their turn +to validate. + +14.0.1.0.0 (2020-11-19) +----------------------- + +Migrated to Odoo 14. + +13.0.1.2.2 (2020-08-30) +----------------------- + +Fixes: + +- When using approve_sequence option in any tier.definition there can be + inconsistencies in the systray notifications +- When using approve_sequence, still not approve only the needed + sequence, but also other sequence for the same approver + +12.0.3.3.1 (2019-12-02) +----------------------- + +Fixes: + +- Show comment on Reviews Table. +- Edit notification with approve_sequence. + +12.0.3.3.0 (2019-11-27) +----------------------- + +New features: + +- Add comment on Reviews Table. +- Approve by sequence. + +12.0.3.2.1 (2019-11-26) +----------------------- + +Fixes: + +- Remove message_subscribe_users + +12.0.3.2.0 (2019-11-25) +----------------------- + +New features: + +- Notify reviewers + +12.0.3.1.0 (2019-07-08) +----------------------- + +Fixes: + +- Singleton error + +12.0.3.0.0 (2019-12-02) +----------------------- + +Fixes: + +- Edit Reviews Table + +12.0.2.1.0 (2019-05-29) +----------------------- + +Fixes: + +- Edit drop-down style width and position + +12.0.2.0.0 (2019-05-28) +----------------------- + +New features: + +- Pass parameters as functions. +- Add Systray. + +12.0.1.0.0 (2019-02-18) +----------------------- + +Migrated to Odoo 12. + +11.0.1.0.0 (2018-05-09) +----------------------- + +Migrated to Odoo 11. + +10.0.1.0.0 (2018-03-26) +----------------------- + +Migrated to Odoo 10. + +9.0.1.0.0 (2017-12-02) +---------------------- + +First version. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* ForgeFlow + +Contributors +------------ + +- Lois Rilo +- Naglis Jonaitis +- Adrià Gil Sorribes +- Pimolnat Suntian +- Pedro Gonzalez +- Kitti U. +- Saran Lim. +- Carlos Lopez +- Javier Colmeiro +- bosd +- Evan Soh +- Manuel Regidor +- Eduardo de Miguel +- `XCG Consulting `__: + + - Houzéfa Abbasbhay + +- Stefan Rijnhart +- Kevin Khao +- Do Anh Duy + +Other credits +------------- + +The migration of this module from 17.0 to 18.0 was financially supported +by Camptocamp. + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-LoisRForgeFlow| image:: https://github.com/LoisRForgeFlow.png?size=40px + :target: https://github.com/LoisRForgeFlow + :alt: LoisRForgeFlow + +Current `maintainer `__: + +|maintainer-LoisRForgeFlow| + +This module is part of the `OCA/server-ux `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/base_tier_validation/__init__.py b/base_tier_validation/__init__.py new file mode 100644 index 00000000..93aa2c1f --- /dev/null +++ b/base_tier_validation/__init__.py @@ -0,0 +1,4 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import models +from . import wizard diff --git a/base_tier_validation/__manifest__.py b/base_tier_validation/__manifest__.py new file mode 100644 index 00000000..085f13c3 --- /dev/null +++ b/base_tier_validation/__manifest__.py @@ -0,0 +1,35 @@ +# Copyright 2017-24 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Base Tier Validation", + "summary": "Implement a validation process based on tiers.", + "version": "19.0.2025.12.03", + "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/cron_data.xml", + "data/mail_data.xml", + "security/ir.model.access.csv", + "security/tier_validation_security.xml", + "views/res_config_settings_views.xml", + "views/tier_definition_view.xml", + "views/tier_review_view.xml", + "views/tier_validation_exception_view.xml", + "wizard/comment_wizard_view.xml", + "templates/tier_validation_templates.xml", + ], + "demo": [], + "assets": { + "web.assets_backend": [ + "base_tier_validation/static/src/components/**/*", + "base_tier_validation/static/src/js/**/*", + ], + }, +} diff --git a/base_tier_validation/data/cron_data.xml b/base_tier_validation/data/cron_data.xml new file mode 100644 index 00000000..f39096a0 --- /dev/null +++ b/base_tier_validation/data/cron_data.xml @@ -0,0 +1,15 @@ + + + + Send Tier Review Reminder + 1 + days + + + model._cron_send_review_reminder() + code + + diff --git a/base_tier_validation/data/mail_data.xml b/base_tier_validation/data/mail_data.xml new file mode 100644 index 00000000..fdcef9e2 --- /dev/null +++ b/base_tier_validation/data/mail_data.xml @@ -0,0 +1,61 @@ + + + + Tier Validation Requested + + + + + + Tier Validation Accepted Notification + + + + + + Tier Validation Rejected Notification + + + + + + Tier Validation Restarted + + + + + + Tier Validation Reminder + + + + + + Tier Validation Reminder + fa-bell + + diff --git a/base_tier_validation/demo/demo.xml b/base_tier_validation/demo/demo.xml new file mode 100644 index 00000000..89789e01 --- /dev/null +++ b/base_tier_validation/demo/demo.xml @@ -0,0 +1,20 @@ + + + + + + + Согласование счёта руководителем + + individual + + domain + [('move_type', '=', 'out_invoice'), ('amount_total', '>', 100000)] + 10 + + + + + + + diff --git a/base_tier_validation/i18n/base_tier_validation.pot b/base_tier_validation/i18n/base_tier_validation.pot new file mode 100644 index 00000000..16363084 --- /dev/null +++ b/base_tier_validation/i18n/base_tier_validation.pot @@ -0,0 +1,878 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" rejected\n" +" ." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" validated\n" +" !" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Bypass, if previous tier was validated by same reviewer" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A record to be reviewed has been created by %s." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "A review has been requested %s days ago." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review has been requested by %s." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted. (%s)" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %s." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A validation process is still open for at least one record." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "All" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Allowed groups to use this Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__group +msgid "Any user in a specific group" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Apply On" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "Approve Sequence Bypass" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence +msgid "Approve by sequence" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__approved +msgid "Approved" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Archived" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation_exception.py:0 +msgid "" +"At least one of these fields must be checked! Write under Validation, Write " +"after Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "" +"Bypassed (auto validated), if previous tier was validated by same reviewer" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__can_review +msgid "Can Review" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Comment" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment +msgid "Comments" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__company_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Company" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "Create a new Validation Exception!" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_uid +msgid "Created by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_date +msgid "Created on" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +msgid "Description" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__display_name +msgid "Display Name" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_status +msgid "Display Status" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__definition_type__domain +msgid "Domain" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__done_by +msgid "Done By" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Done by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__field_ids +msgid "Fields" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Group %s" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Groups" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__hide_reviews +msgid "Hide Reviews" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__id +msgid "ID" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation__has_comment +msgid "If set, Allow the reviewer to leave a comment on the review." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_pending +msgid "" +"If set, all possible reviewers will be notified by email when this status is" +" reached.Usefull in an Approve by sequence scenario. An notification request" +" to review is sent out when it's their turn to review." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is accepted." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is rejected." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "" +"If set, reviewers will be notified by email when a reviews related to this " +"definition are restarted." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's fully validated" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's in the validation process" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_date +msgid "Last Updated on" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Model" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +msgid "Model Name" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name +msgid "Name" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__need_validation +msgid "Need Validation" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "New Tier Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "Next: %s" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +msgid "No reviews to do." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "Notify Reviewers on Accepted" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "Notify Reviewers on Rejected" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "Notify Reviewers on Restarted" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_pending +msgid "Notify Reviewers on reaching Pending" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__pending +msgid "Pending" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__rejected +msgid "Rejected" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected_message +msgid "Rejected Message" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__res_id +msgid "Related Document ID" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__model +msgid "Related Document Model" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Request Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__requested_by +msgid "Requested By" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Requested by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +msgid "Res" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +msgid "Res Model" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Restart Validation" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_id +msgid "Reviewer" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +msgid "Reviews" +msgstr "" + +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +msgid "Sequence" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +msgid "Status" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "The review has been reset by %s." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" +"Please request a validation." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +msgid "Tier" +msgstr "" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +msgid "Tier Validation Accepted Notification" +msgstr "" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_validation_exception_action +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_validation_exception +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_form +msgid "Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation_exception +msgid "Tier Validation Exceptions" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +msgid "Tier Validation Rejected Notification" +msgstr "" + +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "" + +#. module: base_tier_validation +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_confirmation +msgid "Tier Validations" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__to_validate_message +msgid "To Validate Message" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__todo_by +msgid "Todo By" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Todo by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "User" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__valid_model_field_ids +msgid "Valid Model Field" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__valid_reviewer_field_ids +msgid "Valid Reviewer Field" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Validate" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__validated +msgid "Validated" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated_message +msgid "Validated Message" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__review_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__review_type +msgid "Validated by" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +msgid "Validation Date" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_formated_date +msgid "Validation Formated Date" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validation_status +msgid "Validation Status" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__waiting +msgid "Waiting" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__no +msgid "Without validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_after_validation +msgid "Write after Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write after validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_under_validation +msgid "Write under Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write under validation" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "e.g. Tier Validation for..." +msgstr "" diff --git a/base_tier_validation/i18n/de.po b/base_tier_validation/i18n/de.po new file mode 100644 index 00000000..115222a7 --- /dev/null +++ b/base_tier_validation/i18n/de.po @@ -0,0 +1,879 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" rejected\n" +" ." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" validated\n" +" !" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Bypass, if previous tier was validated by same reviewer" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A record to be reviewed has been created by %s." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "A review has been requested %s days ago." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review has been requested by %s." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted. (%s)" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %s." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A validation process is still open for at least one record." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "All" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Allowed groups to use this Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__group +msgid "Any user in a specific group" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Apply On" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "Approve Sequence Bypass" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence +msgid "Approve by sequence" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__approved +msgid "Approved" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Archived" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation_exception.py:0 +msgid "" +"At least one of these fields must be checked! Write under Validation, Write " +"after Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "" +"Bypassed (auto validated), if previous tier was validated by same reviewer" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__can_review +msgid "Can Review" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Comment" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment +msgid "Comments" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__company_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Company" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "Create a new Validation Exception!" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_uid +msgid "Created by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_date +msgid "Created on" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +msgid "Description" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__display_name +msgid "Display Name" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_status +msgid "Display Status" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__definition_type__domain +msgid "Domain" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__done_by +msgid "Done By" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Done by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__field_ids +msgid "Fields" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Group %s" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Groups" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__hide_reviews +msgid "Hide Reviews" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__id +msgid "ID" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation__has_comment +msgid "If set, Allow the reviewer to leave a comment on the review." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_pending +msgid "" +"If set, all possible reviewers will be notified by email when this status is" +" reached.Usefull in an Approve by sequence scenario. An notification request" +" to review is sent out when it's their turn to review." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is accepted." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is rejected." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "" +"If set, reviewers will be notified by email when a reviews related to this " +"definition are restarted." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's fully validated" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's in the validation process" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_date +msgid "Last Updated on" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Model" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +msgid "Model Name" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name +msgid "Name" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__need_validation +msgid "Need Validation" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "New Tier Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "Next: %s" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +msgid "No reviews to do." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "Notify Reviewers on Accepted" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "Notify Reviewers on Rejected" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "Notify Reviewers on Restarted" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_pending +msgid "Notify Reviewers on reaching Pending" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__pending +msgid "Pending" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__rejected +msgid "Rejected" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected_message +msgid "Rejected Message" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__res_id +msgid "Related Document ID" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__model +msgid "Related Document Model" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Request Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__requested_by +msgid "Requested By" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Requested by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +msgid "Res" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +msgid "Res Model" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Restart Validation" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_id +msgid "Reviewer" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +msgid "Reviews" +msgstr "" + +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +msgid "Sequence" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +msgid "Status" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "The review has been reset by %s." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" +"Please request a validation." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +msgid "Tier" +msgstr "" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +msgid "Tier Validation Accepted Notification" +msgstr "" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_validation_exception_action +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_validation_exception +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_form +msgid "Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation_exception +msgid "Tier Validation Exceptions" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +msgid "Tier Validation Rejected Notification" +msgstr "" + +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "" + +#. module: base_tier_validation +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_confirmation +msgid "Tier Validations" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__to_validate_message +msgid "To Validate Message" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__todo_by +msgid "Todo By" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Todo by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "User" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__valid_model_field_ids +msgid "Valid Model Field" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__valid_reviewer_field_ids +msgid "Valid Reviewer Field" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Validate" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__validated +msgid "Validated" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated_message +msgid "Validated Message" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__review_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__review_type +msgid "Validated by" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +msgid "Validation Date" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_formated_date +msgid "Validation Formated Date" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validation_status +msgid "Validation Status" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__waiting +msgid "Waiting" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__no +msgid "Without validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_after_validation +msgid "Write after Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write after validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_under_validation +msgid "Write under Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write under validation" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "e.g. Tier Validation for..." +msgstr "" diff --git a/base_tier_validation/i18n/es.po b/base_tier_validation/i18n/es.po new file mode 100644 index 00000000..308529a1 --- /dev/null +++ b/base_tier_validation/i18n/es.po @@ -0,0 +1,993 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-04-23 10:39+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: none\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" +"\n" +" Este registro debe ser\n" +" validado." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" rejected\n" +" ." +msgstr "" +"\n" +" La operación ha sido\n" +" rechazada\n" +" ." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" validated\n" +" !" +msgstr "" +"\n" +" La operación ha sido\n" +" validada\n" +" !" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "Nombre" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Bypass, if previous tier was validated by same reviewer" +msgstr "" +"Omitir, si el nivel anterior fue validado por el mismo revisor" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A record to be reviewed has been created by %s." +msgstr "Un registro a revisar ha sido creado por %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "A review has been requested %s days ago." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review has been requested by %s." +msgstr "Una revisión fue solicitada por %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted" +msgstr "Una revisión fue aceptada" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted. (%s)" +msgstr "Una revisión fue aceptada. (%s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "%(user)s rechazó una reseña. %(comment)s" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %s." +msgstr "Una revisión fue rechaza por %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A validation process is still open for at least one record." +msgstr "Un proceso de validación está aún abierto para al menos un registro." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "Activo" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "All" +msgstr "Todos" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Allowed groups to use this Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__group +msgid "Any user in a specific group" +msgstr "Cualquier usuario de un grupo específico" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Apply On" +msgstr "Aplicar en" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "Orden de aprobación por el número de secuencia especificado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "Approve Sequence Bypass" +msgstr "Aprobar Omisión de Secuencia" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence +msgid "Approve by sequence" +msgstr "Aprobar por secuencia" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__approved +msgid "Approved" +msgstr "Aprobado" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Archived" +msgstr "Archivado" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation_exception.py:0 +msgid "" +"At least one of these fields must be checked! Write under Validation, Write " +"after Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "" +"Bypassed (auto validated), if previous tier was validated by same reviewer" +msgstr "" +"Omitido (validado automático), si el mismo revisor validó el nivel anterior" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__can_review +msgid "Can Review" +msgstr "Puede revisar" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" +"Puede revisar será establecido si la revisión está pendiente y la\n" +" secuencia de aprobación se ha alcanzado" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "Cancelar" + +#. module: base_tier_validation +#. odoo-javascript +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Comment" +msgstr "Comentar" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "Wizard Comentario" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment +msgid "Comments" +msgstr "Comentarios" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__company_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Company" +msgstr "Compañía" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +msgid "Config Settings" +msgstr "Configuración de Ajustes" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "Create a new Validation Exception!" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_date +msgid "Created on" +msgstr "Creado en" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "Definición" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "Dominio de definición" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +msgid "Description" +msgstr "Descripción" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_status +msgid "Display Status" +msgstr "Mostrar Estado" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__definition_type__domain +msgid "Domain" +msgstr "Dominio" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__done_by +msgid "Done By" +msgstr "Hecho Por" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Done by" +msgstr "Hecho Por" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "Campo en el registro relacionado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__field_ids +msgid "Fields" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Group %s" +msgstr "Grupo %s" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "Agrupar por" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Groups" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "Ha comentado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__hide_reviews +msgid "Hide Reviews" +msgstr "Ocultar Reseñas" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__id +msgid "ID" +msgstr "ID" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation__has_comment +msgid "If set, Allow the reviewer to leave a comment on the review." +msgstr "" +"Si se establece, permite al revisor dejar un comentario sobre la reseña." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "" +"Si se establece, todos los posibles revisores serán notificados por correo " +"electrónico cuando se active esta definición." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_pending +msgid "" +"If set, all possible reviewers will be notified by email when this status is " +"reached.Usefull in an Approve by sequence scenario. An notification request " +"to review is sent out when it's their turn to review." +msgstr "" +"Si se establece, todos los posibles revisores recibirán una notificación por " +"correo electrónico cuando se alcance este estado. Es útil en un escenario de " +"aprobación por secuencia. Se envía una solicitud de notificación de revisión " +"cuando les toca revisar." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is accepted." +msgstr "" +"Si se establece, los revisores recibirán una notificación por correo " +"electrónico cuando se acepte una revisión relacionada con esta definición." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is rejected." +msgstr "" +"Si se establece, los revisores recibirán una notificación por correo " +"electrónico cuando se rechace una revisión relacionada con esta definición." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "" +"If set, reviewers will be notified by email when a reviews related to this " +"definition are restarted." +msgstr "" +"Si se establece, los revisores recibirán una notificación por correo " +"electrónico cuando se reinicie una revisión relacionada con esta definición." + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's fully validated" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's in the validation process" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_uid +msgid "Last Updated by" +msgstr "Última actualización de" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_date +msgid "Last Updated on" +msgstr "Última actualización en" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Model" +msgstr "Modelo" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +msgid "Model Name" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "Más opciones" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name +msgid "Name" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__need_validation +msgid "Need Validation" +msgstr "Necesita validación" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "New Tier Validation" +msgstr "Nueva Validación de Nivel" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "Siguiente Revisión" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "Next: %s" +msgstr "Siguiente: %s" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +msgid "No reviews to do." +msgstr "No hay revisiones a realizar." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "Notify Reviewers on Accepted" +msgstr "Notificar la Aceptación a los Revisores" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "Notificar a los revisores en la creación" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "Notify Reviewers on Rejected" +msgstr "Notificar el Rechazo a los Revisores" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "Notify Reviewers on Restarted" +msgstr "Notificar a los Revisores al Reiniciar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_pending +msgid "Notify Reviewers on reaching Pending" +msgstr "Notificar a los Revisores sobre la recepción de Pendientes" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" +"Opción de utilizar una fórmula python para obtener revisores y encontrar " +"documentos" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__pending +msgid "Pending" +msgstr "Pendiente" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "Modelo referenciado" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "Rechazar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__rejected +msgid "Rejected" +msgstr "Rechazado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected_message +msgid "Rejected Message" +msgstr "Mensaje rechazado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__res_id +msgid "Related Document ID" +msgstr "ID del Documento Relacionado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__model +msgid "Related Document Model" +msgstr "Modelo del Documento Relacionado" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Request Validation" +msgstr "Solicitar validación" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__requested_by +msgid "Requested By" +msgstr "Solicitado Por" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Requested by" +msgstr "Solicitado Por" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +msgid "Res" +msgstr "Recurso" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +msgid "Res Model" +msgstr "Modelo Res" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Restart Validation" +msgstr "Reiniciar la Validación" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "Revisor" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_id +msgid "Reviewer" +msgstr "Revisor" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "Campo revisor" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "Grupo revisor" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "Revisores" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +msgid "Reviews" +msgstr "Revisiones" + +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +msgid "Sequence" +msgstr "Secuencia" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "Usuario específico" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +msgid "Status" +msgstr "Estado" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "The review has been reset by %s." +msgstr "La revisión ha sido reiniciada por %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" +"Please request a validation." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +msgid "Tier" +msgstr "Nivel" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "Definición de Nivel" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "Fórmula de niveles" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "Revisión de Nivel" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "Validación por niveles" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "Validaciones de Nivel (abstracto)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +msgid "Tier Validation Accepted Notification" +msgstr "Notificación de Validación de Nivel Aceptada" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_validation_exception_action +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_validation_exception +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_form +msgid "Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation_exception +msgid "Tier Validation Exceptions" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +msgid "Tier Validation Rejected Notification" +msgstr "Validación de nivel Notificación rechazada" + +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "Validación de nivel solicitada" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "Validación de nivel reiniciada" + +#. module: base_tier_validation +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_confirmation +msgid "Tier Validations" +msgstr "Validaciones de Nivel" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__to_validate_message +msgid "To Validate Message" +msgstr "Para validar el mensaje" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__todo_by +msgid "Todo By" +msgstr "Por hacer por" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Todo by" +msgstr "Para hacer por" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "User" +msgstr "usuario" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__valid_model_field_ids +msgid "Valid Model Field" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__valid_reviewer_field_ids +msgid "Valid Reviewer Field" +msgstr "Campo Revisor válido" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Validate" +msgstr "Validar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "Validar Rechazar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__validated +msgid "Validated" +msgstr "Validado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated_message +msgid "Validated Message" +msgstr "Mensaje Validado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__review_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__review_type +msgid "Validated by" +msgstr "Validado por" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +msgid "Validation Date" +msgstr "Fecha de Validación" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_formated_date +msgid "Validation Formated Date" +msgstr "Fecha de Validación Formateada" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validation_status +msgid "Validation Status" +msgstr "Estado de validación" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +msgstr "Validaciones" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__waiting +msgid "Waiting" +msgstr "Esperando" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__no +msgid "Without validation" +msgstr "Sin validación" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_after_validation +msgid "Write after Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write after validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_under_validation +msgid "Write under Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write under validation" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "e.g. Tier Validation for..." +msgstr "ej. Validación de Nivel por..." + +#~ msgid "There are no res.users in the selected field" +#~ msgstr "No hay res.usuarios en el campo seleccionado" + +#, python-format +#~ msgid "Activity" +#~ msgstr "Actividades" + +#, python-format +#~ msgid "Operation has been rejected." +#~ msgstr "La operación ha sido rechazada." + +#, python-format +#~ msgid "Operation has been validated!" +#~ msgstr "¡La operación ha sido validada!" + +#, python-format +#~ msgid "This %s needs to be validated" +#~ msgstr "Este %s necesita ser validado" + +#, python-format +#~ msgid "" +#~ "This action needs to be validated for at least one record. \n" +#~ "Please request a validation." +#~ msgstr "" +#~ "Esta acción necesita ser validada para algún registro.\n" +#~ "Por favor, solicita una validación." + +#, python-format +#~ msgid "The operation is under validation." +#~ msgstr "Esta operación está en proceso de validación." + +#~ msgid "" +#~ "\n" +#~ " This Record needs to be\n" +#~ " validated." +#~ msgstr "" +#~ "\n" +#~ " Este registro debe ser\n" +#~ " validado." + +#~ msgid "" +#~ "\n" +#~ " Operation has been\n" +#~ " rejected\n" +#~ " ." +#~ msgstr "" +#~ "\n" +#~ " La operación ha sido\n" +#~ " rechazada\n" +#~ " ." + +#~ msgid "" +#~ "\n" +#~ " Operation has been\n" +#~ " validated\n" +#~ " !" +#~ msgstr "" +#~ "\n" +#~ " La operación ha sido\n" +#~ " validada\n" +#~ " !" + +#~ msgid "" +#~ "Bypassed, if previous tier was validated by same reviewer" +#~ msgstr "" +#~ "Omitido, si el nivel anterior fue validado por el mismo revisor" + +#, python-format +#~ msgid "0 Pending" +#~ msgstr "0 Pendientes" + +#~ msgid "Last Modified on" +#~ msgstr "Última modificación en" + +#~ msgid "Option to forward a tier validation to other reviewer, and backward" +#~ msgstr "" +#~ "Opción de reenviar una validación de nivel a otro revisor, y hacia atrás" + +#~ msgid "Tier Forward & Backward" +#~ msgstr "Nivel hacia delante y hacia atrás" diff --git a/base_tier_validation/i18n/es_MX.po b/base_tier_validation/i18n/es_MX.po new file mode 100644 index 00000000..6483283e --- /dev/null +++ b/base_tier_validation/i18n/es_MX.po @@ -0,0 +1,949 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2021-08-16 22:50+0000\n" +"Last-Translator: Jesús Alan Ramos Rodríguez \n" +"Language-Team: none\n" +"Language: es_MX\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.3.2\n" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" rejected\n" +" ." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" validated\n" +" !" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "Nombre" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Bypass, if previous tier was validated by same reviewer" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A record to be reviewed has been created by %s." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "A review has been requested %s days ago." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review has been requested by %s." +msgstr "%s ha solicitado una revisión." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted" +msgstr "Se aceptó una revisión" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted. (%s)" +msgstr "Se aceptó una revisión. (%s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %s." +msgstr "%s rechazó una revisión." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A validation process is still open for at least one record." +msgstr "" +"Todavía hay un proceso de validación abierto para al menos un registro." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "Activo" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "All" +msgstr "Todos" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Allowed groups to use this Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__group +msgid "Any user in a specific group" +msgstr "Cualquier usuario de un grupo específico" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Apply On" +msgstr "Aplicar en" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "Orden de aprobación por el número de secuencia especificado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "Approve Sequence Bypass" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence +msgid "Approve by sequence" +msgstr "Aprobar por secuencia" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__approved +msgid "Approved" +msgstr "Aprobado" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Archived" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation_exception.py:0 +msgid "" +"At least one of these fields must be checked! Write under Validation, Write " +"after Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "" +"Bypassed (auto validated), if previous tier was validated by same reviewer" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__can_review +msgid "Can Review" +msgstr "Puede revisar" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" +"Puede revisar se marcará si la revisión está pendiente y\n" +" se ha logrado aprobar la secuencia" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "Cancelado" + +#. module: base_tier_validation +#. odoo-javascript +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Comment" +msgstr "Comentario" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "Asistente de comentarios" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment +msgid "Comments" +msgstr "Comentarios" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__company_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Company" +msgstr "Empresa" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "Create a new Validation Exception!" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_date +msgid "Created on" +msgstr "Creado en" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "Definición de Nivel" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "Dominio de definición" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +msgid "Description" +msgstr "Descripción" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_status +msgid "Display Status" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__definition_type__domain +msgid "Domain" +msgstr "Dominio" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__done_by +msgid "Done By" +msgstr "Realizado por" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Done by" +msgstr "Realizado por" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "Campo en registro relacionado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__field_ids +msgid "Fields" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Group %s" +msgstr "Grupo %s" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "Agrupar por" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Groups" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "Tiene comentario" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__hide_reviews +msgid "Hide Reviews" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__id +msgid "ID" +msgstr "Identificación" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation__has_comment +msgid "If set, Allow the reviewer to leave a comment on the review." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "" +"Si se establece, todos los posibles revisores serán notificados por correo " +"electrónico cuando se active esta definición." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_pending +msgid "" +"If set, all possible reviewers will be notified by email when this status is " +"reached.Usefull in an Approve by sequence scenario. An notification request " +"to review is sent out when it's their turn to review." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is accepted." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is rejected." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "" +"If set, reviewers will be notified by email when a reviews related to this " +"definition are restarted." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's fully validated" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's in the validation process" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_uid +msgid "Last Updated by" +msgstr "Última modificación por" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_date +msgid "Last Updated on" +msgstr "Última modificación en" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Model" +msgstr "Modelo" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +msgid "Model Name" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "Más opciones" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name +msgid "Name" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__need_validation +msgid "Need Validation" +msgstr "Necesita validación" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "New Tier Validation" +msgstr "Nueva Definición de Nivel" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "Next: %s" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +msgid "No reviews to do." +msgstr "No hay revisiones que hacer." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "Notify Reviewers on Accepted" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "Notificar a los revisores sobre la creación" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "Notify Reviewers on Rejected" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "Notify Reviewers on Restarted" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_pending +msgid "Notify Reviewers on reaching Pending" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__pending +msgid "Pending" +msgstr "Pendiente" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "Modelo referenciado" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "Rechazar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__rejected +msgid "Rejected" +msgstr "Rechazado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected_message +msgid "Rejected Message" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__res_id +msgid "Related Document ID" +msgstr "ID de documento relacionado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__model +msgid "Related Document Model" +msgstr "Modelo de documento relacionado" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Request Validation" +msgstr "Solicitar Validación" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__requested_by +msgid "Requested By" +msgstr "Solicitado por" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Requested by" +msgstr "Solicitado por" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +msgid "Res" +msgstr "Res" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +msgid "Res Model" +msgstr "Modelo Res" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Restart Validation" +msgstr "Reiniciar la validación" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "Revisión" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_id +msgid "Reviewer" +msgstr "Evaluador" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "Campo de revisor" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "Grupo de revisores" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "Revisores" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +msgid "Reviews" +msgstr "Comentarios" + +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +msgid "Sequence" +msgstr "Secuencia" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "Usuario específico" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +msgid "Status" +msgstr "Estatus" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "The review has been reset by %s." +msgstr "%s ha restablecido la revisión." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" +"Please request a validation." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +msgid "Tier" +msgstr "" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "Definición de Nivel" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "Revisión de niveles" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "Validación de nivel (resumen)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +msgid "Tier Validation Accepted Notification" +msgstr "Notificación de validación de nivel aceptada" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_validation_exception_action +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_validation_exception +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_form +msgid "Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation_exception +msgid "Tier Validation Exceptions" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +msgid "Tier Validation Rejected Notification" +msgstr "Notificación de rechazo de validación de nivel" + +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "Validación de nivel solicitada" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "Se reinició la validación de nivel" + +#. module: base_tier_validation +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_confirmation +msgid "Tier Validations" +msgstr "Validaciones de nivel" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__to_validate_message +msgid "To Validate Message" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__todo_by +msgid "Todo By" +msgstr "Por Hacer por" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Todo by" +msgstr "Por Hacer por" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "User" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__valid_model_field_ids +msgid "Valid Model Field" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__valid_reviewer_field_ids +msgid "Valid Reviewer Field" +msgstr "Campo de revisor válido" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Validate" +msgstr "Validar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "Validar Rechazar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__validated +msgid "Validated" +msgstr "Validado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated_message +msgid "Validated Message" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__review_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__review_type +msgid "Validated by" +msgstr "Validado por" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +msgid "Validation Date" +msgstr "Fecha de validación" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_formated_date +msgid "Validation Formated Date" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validation_status +msgid "Validation Status" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +msgstr "Validaciones" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__waiting +msgid "Waiting" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__no +msgid "Without validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_after_validation +msgid "Write after Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write after validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_under_validation +msgid "Write under Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write under validation" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "e.g. Tier Validation for..." +msgstr "p.ej. Validación de nivel para ..." + +#~ msgid "There are no res.users in the selected field" +#~ msgstr "No hay res.users en el campo seleccionado" + +#, python-format +#~ msgid "" +#~ "This action needs to be validated for at least one record. \n" +#~ "Please request a validation." +#~ msgstr "" +#~ "Esta acción debe validarse para al menos un registro.\n" +#~ "Solicite una validación." + +#, python-format +#~ msgid "The operation is under validation." +#~ msgstr "La operación está en proceso de validación." + +#~ msgid "" +#~ "\n" +#~ " This Record needs to be\n" +#~ " validated." +#~ msgstr "" +#~ "\n" +#~ " Este registro necesita ser\n" +#~ " validado." + +#~ msgid "" +#~ "\n" +#~ " Operation has been\n" +#~ " rejected\n" +#~ " ." +#~ msgstr "" +#~ "\n" +#~ " La operación ha sido\n" +#~ " rechazada\n" +#~ " ." + +#~ msgid "" +#~ "\n" +#~ " Operation has been\n" +#~ " validated\n" +#~ " !" +#~ msgstr "" +#~ "\n" +#~ " ¡La operación ha sido\n" +#~ " validada\n" +#~ " !" + +#, python-format +#~ msgid "0 Pending" +#~ msgstr "0 Pendientes" + +#~ msgid "Last Modified on" +#~ msgstr "Última modificación el" + +#, python-format +#~ msgid "Activities" +#~ msgstr "Actividades" + +#~ msgid "Users" +#~ msgstr "Usuarios" + +#~ msgid "A review was rejected by {}. ({})" +#~ msgstr "{} rechazó una revisión. ({})" diff --git a/base_tier_validation/i18n/fr.po b/base_tier_validation/i18n/fr.po new file mode 100644 index 00000000..8d6b934d --- /dev/null +++ b/base_tier_validation/i18n/fr.po @@ -0,0 +1,980 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-10-19 12:51+0000\n" +"Last-Translator: Houzéfa Abbasbhay \n" +"Language-Team: none\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" rejected\n" +" ." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" validated\n" +" !" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "Nom" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Bypass, if previous tier was validated by same reviewer" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A record to be reviewed has been created by %s." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "A review has been requested %s days ago." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review has been requested by %s." +msgstr "Une revue a été demandée par %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted" +msgstr "Une revue a été acceptée" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted. (%s)" +msgstr "Une revue a été acceptée. (%s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "Une revue a été refusée par %(user)s. (%(comment)s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %s." +msgstr "Une revue a été refusée par %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A validation process is still open for at least one record." +msgstr "" +"Un processus de validation est toujours en cours pour au moins un " +"enregistrement." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "Actif" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "All" +msgstr "Tout" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Allowed groups to use this Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__group +msgid "Any user in a specific group" +msgstr "Tout utilisateur d'un groupe spécifique" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Apply On" +msgstr "Appliquer sur" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "Ordre d'approbation suivant le numéro de séquence spécifié" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "Approve Sequence Bypass" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence +msgid "Approve by sequence" +msgstr "Approuver dans l'ordre" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__approved +msgid "Approved" +msgstr "Approuvé" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Archived" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation_exception.py:0 +msgid "" +"At least one of these fields must be checked! Write under Validation, Write " +"after Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "" +"Bypassed (auto validated), if previous tier was validated by same reviewer" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__can_review +msgid "Can Review" +msgstr "Revue possible" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" +"La revue est marquée possible lorsqu'elle est en attente et\n" +" qu'une séquence d'approbation a été effectuée" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "Annuler" + +#. module: base_tier_validation +#. odoo-javascript +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Comment" +msgstr "Commentaire" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "Assistant de saisie de commentaire" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment +msgid "Comments" +msgstr "Commentaires" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__company_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Company" +msgstr "Société" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +msgid "Config Settings" +msgstr "Paramètres de configuration" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "Create a new Validation Exception!" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_uid +msgid "Created by" +msgstr "Créé par" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_date +msgid "Created on" +msgstr "Créé le" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "Définition" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "Domaine de la définition" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +msgid "Description" +msgstr "Description" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__display_name +msgid "Display Name" +msgstr "Nom d'affichage" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_status +msgid "Display Status" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__definition_type__domain +msgid "Domain" +msgstr "Domaine" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__done_by +msgid "Done By" +msgstr "Fait par" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Done by" +msgstr "Fait par" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "Champ dans l'enregistrement rattaché" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__field_ids +msgid "Fields" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Group %s" +msgstr "Groupe %s" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "Regrouper par" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Groups" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "Avec commentaire" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__hide_reviews +msgid "Hide Reviews" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__id +msgid "ID" +msgstr "ID" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation__has_comment +msgid "If set, Allow the reviewer to leave a comment on the review." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "" +"Avec cette option, tous les réviseurs autorisés seront notifiés par email " +"lors du déclenchement de cette définition." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_pending +msgid "" +"If set, all possible reviewers will be notified by email when this status is " +"reached.Usefull in an Approve by sequence scenario. An notification request " +"to review is sent out when it's their turn to review." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is accepted." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is rejected." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "" +"If set, reviewers will be notified by email when a reviews related to this " +"definition are restarted." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's fully validated" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's in the validation process" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_uid +msgid "Last Updated by" +msgstr "Dernière mise à jour par" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_date +msgid "Last Updated on" +msgstr "Dernière mise à jour le" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Model" +msgstr "Modèle" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +msgid "Model Name" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "Plus d'options" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name +msgid "Name" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__need_validation +msgid "Need Validation" +msgstr "Validation requise" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "New Tier Validation" +msgstr "Nouveau niveau de validation" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "Revue suivante" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "Next: %s" +msgstr "Suivante : %s" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +msgid "No reviews to do." +msgstr "Aucune revue n'est nécessaire." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "Notify Reviewers on Accepted" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "Notifier les réviseurs à la création" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "Notify Reviewers on Rejected" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "Notify Reviewers on Restarted" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_pending +msgid "Notify Reviewers on reaching Pending" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" +"Option pour utiliser une formule python pour calculer les réviseurs et " +"déterminer les enregistrements" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__pending +msgid "Pending" +msgstr "En attente" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "Modèle rattaché" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "Rejeter" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__rejected +msgid "Rejected" +msgstr "Rejeté" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected_message +msgid "Rejected Message" +msgstr "Message de rejet" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__res_id +msgid "Related Document ID" +msgstr "ID de l'enregistrement rattaché" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__model +msgid "Related Document Model" +msgstr "Modèle de l'enregistrement rattaché" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Request Validation" +msgstr "Demander validation" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__requested_by +msgid "Requested By" +msgstr "Demandé par" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Requested by" +msgstr "Demandé par" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +msgid "Res" +msgstr "Enregistrement" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +msgid "Res Model" +msgstr "Modèle de l'enregistrement" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Restart Validation" +msgstr "Recommencer la validation" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "Revue" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_id +msgid "Reviewer" +msgstr "Réviseur" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "Champ du réviseur" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "Groupe des réviseurs" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "Réviseurs" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +msgid "Reviews" +msgstr "Revues" + +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +msgid "Sequence" +msgstr "Séquence" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "Utilisateur spécifique" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +msgid "Status" +msgstr "Statut" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "The review has been reset by %s." +msgstr "Cette revue a été réinitialisée par %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" +"Please request a validation." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +msgid "Tier" +msgstr "" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "Définition de niveau" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "Formules sur les niveaux" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "Revue d'un niveau" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "Validation par niveau" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "Validation d'un niveau (modèle abstrait)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +msgid "Tier Validation Accepted Notification" +msgstr "Validation par niveau - Notification - Acceptée" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_validation_exception_action +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_validation_exception +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_form +msgid "Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation_exception +msgid "Tier Validation Exceptions" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +msgid "Tier Validation Rejected Notification" +msgstr "Validation par niveau - Notification - Rejetée" + +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "Validation par niveau - Demandée" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "Validation par niveau - Redémarrée" + +#. module: base_tier_validation +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_confirmation +msgid "Tier Validations" +msgstr "Validations par niveau" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__to_validate_message +msgid "To Validate Message" +msgstr "Message de demande de validation" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__todo_by +msgid "Todo By" +msgstr "À faire par" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Todo by" +msgstr "À faire par" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "User" +msgstr "Utilisateur" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__valid_model_field_ids +msgid "Valid Model Field" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__valid_reviewer_field_ids +msgid "Valid Reviewer Field" +msgstr "Champs réviseur valides" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Validate" +msgstr "Valider" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "Validation / Rejet" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__validated +msgid "Validated" +msgstr "Validé" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated_message +msgid "Validated Message" +msgstr "Message de validation" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__review_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__review_type +msgid "Validated by" +msgstr "Validé par" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +msgid "Validation Date" +msgstr "Date de validation" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_formated_date +msgid "Validation Formated Date" +msgstr "Date de validation formatée" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validation_status +msgid "Validation Status" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +msgstr "Validations" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__waiting +msgid "Waiting" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__no +msgid "Without validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_after_validation +msgid "Write after Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write after validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_under_validation +msgid "Write under Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write under validation" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "e.g. Tier Validation for..." +msgstr "par ex Niveau de validation pour..." + +#~ msgid "There are no res.users in the selected field" +#~ msgstr "Le champ sélectionné ne référence pas des res.users" + +#, python-format +#~ msgid "Activity" +#~ msgstr "Activité" + +#, python-format +#~ msgid "Operation has been rejected." +#~ msgstr "L'opération a été rejetée." + +#, python-format +#~ msgid "Operation has been validated!" +#~ msgstr "L'opération a été validée !" + +#, python-format +#~ msgid "This %s needs to be validated" +#~ msgstr "%s : Cet enregistrement requiert une validation" + +#, python-format +#~ msgid "" +#~ "This action needs to be validated for at least one record. \n" +#~ "Please request a validation." +#~ msgstr "" +#~ "Cette action requiert une validation pour au moins un des " +#~ "enregistrements. \n" +#~ "Veuillez demander cette validation." + +#, python-format +#~ msgid "The operation is under validation." +#~ msgstr "Cette opération est en cours de validation." + +#~ msgid "" +#~ "\n" +#~ " This Record needs to be\n" +#~ " validated." +#~ msgstr "" +#~ "\n" +#~ " Cet enregistrement.\n" +#~ " requiert une validation" + +#~ msgid "" +#~ "\n" +#~ " Operation has been\n" +#~ " rejected\n" +#~ " ." +#~ msgstr "" +#~ "\n" +#~ " L'opération a été\n" +#~ " rejetée\n" +#~ " ." + +#~ msgid "" +#~ "\n" +#~ " Operation has been\n" +#~ " validated\n" +#~ " !" +#~ msgstr "" +#~ "\n" +#~ " L'opération a été\n" +#~ " validée\n" +#~ " !" + +#, python-format +#~ msgid "0 Pending" +#~ msgstr "0 en attente" + +#~ msgid "Last Modified on" +#~ msgstr "Dernière modification le" + +#~ msgid "Option to forward a tier validation to other reviewer, and backward" +#~ msgstr "" +#~ "Option pour transmettre le niveau de validation à un autre réviseur, et " +#~ "inversement" + +#~ msgid "Tier Forward & Backward" +#~ msgstr "Délégation des niveaux" + +#, python-format +#~ msgid "Activities" +#~ msgstr "Activités" + +#~ msgid "Users" +#~ msgstr "Utilisateurs" + +#~ msgid "A review was rejected by {}. ({})" +#~ msgstr "Une vérification a été refusée par {}. ({})" + +#~ msgid "Any user in a specific group." +#~ msgstr "Tout utilisateur d'un groupe spécifique." diff --git a/base_tier_validation/i18n/it.po b/base_tier_validation/i18n/it.po new file mode 100644 index 00000000..3a83bb7b --- /dev/null +++ b/base_tier_validation/i18n/it.po @@ -0,0 +1,1050 @@ +# 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: 2025-11-06 13:42+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.10.4\n" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" +"\n" +" Questo record necessita di\n" +" approvazione." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" rejected\n" +" ." +msgstr "" +"\n" +" L'operazione è stata\n" +" rifiutata\n" +" ." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" validated\n" +" !" +msgstr "" +"\n" +" L'operazione è stata\n" +" approvata\n" +" !" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "Nome" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Bypass, if previous tier was validated by same reviewer" +msgstr "" +"Aggira, se il livello precedente è stato validato dallo stesso " +"revisore" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A record to be reviewed has been created by %s." +msgstr "Un record a revisionare è stato creato da %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "A review has been requested %s days ago." +msgstr "Una revisione è stata richiesta %s giorni fa." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review has been requested by %s." +msgstr "Un'approvazione è stata richiesta da %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted" +msgstr "Un'approvazione è stata accettata" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted. (%s)" +msgstr "Un'approvazione è stata accettata. (%s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "È stata rifiutata una revisione da %(user)s. (%(comment)s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %s." +msgstr "Un'approvazione è stata rifiutata da %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A validation process is still open for at least one record." +msgstr "Un processo di approvazione è ancora aperto per almeno un record." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "Attivo" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "All" +msgstr "Tutto" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +msgstr "Permetti scrittura ai revisori" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Allowed groups to use this Tier Validation Exception" +msgstr "Grupi autorizzati ad utilizzare questa eccezione validazione livello" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__group +msgid "Any user in a specific group" +msgstr "Qualunque utente in un gruppo specifico" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Apply On" +msgstr "Applica a" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "Ordine di approvazione specificato da numero sequenza" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "Approve Sequence Bypass" +msgstr "Approva salto sequenza" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence +msgid "Approve by sequence" +msgstr "Approva in sequenza" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__approved +msgid "Approved" +msgstr "Approvato" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Archived" +msgstr "In archivio" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation_exception.py:0 +msgid "" +"At least one of these fields must be checked! Write under Validation, Write " +"after Validation" +msgstr "" +"Almeno uno di questi campi deve essere selezionato! Scrivi in valutazione, " +"Scrivi dopo validazione" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "" +"Bypassed (auto validated), if previous tier was validated by same reviewer" +msgstr "" +"Saltato (auto validato), se il livello precedente è stato validato dallo " +"stesso revisore" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__can_review +msgid "Can Review" +msgstr "Può revisionare" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" +"\"Può approvare\" sarà attivo se l'approvazione è in sospeso e la\n" +" sequenza di approvazione è archiviata" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "Annulla" + +#. module: base_tier_validation +#. odoo-javascript +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Comment" +msgstr "Commento" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "Wizard Commento" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment +msgid "Comments" +msgstr "Commenti" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__company_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Company" +msgstr "Azienda" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +msgid "Config Settings" +msgstr "Impostazioni configurazione" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "Create a new Validation Exception!" +msgstr "Crea una nuova eccezione di validazione!" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "Definizione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "Dominio Definizione" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +msgid "Description" +msgstr "Descrizione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_status +msgid "Display Status" +msgstr "Visualizza stato" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__definition_type__domain +msgid "Domain" +msgstr "Dominio" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__done_by +msgid "Done By" +msgstr "Eseguito da" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Done by" +msgstr "Eseguito da" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "Campo in record collegato" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__field_ids +msgid "Fields" +msgstr "Campi" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Group %s" +msgstr "Gruppo %s" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "Raggruppa per" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Groups" +msgstr "Gruppi" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "Ha commenti" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__hide_reviews +msgid "Hide Reviews" +msgstr "Nascondi revisioni" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__id +msgid "ID" +msgstr "ID" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation__has_comment +msgid "If set, Allow the reviewer to leave a comment on the review." +msgstr "" +"Se attivata, consente al revisore di lasciare un commento nella revisione." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "" +"Se impostata, tutti i possibili revisori saranno avvisati via e-mail quando " +"la definizione è attivata." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_pending +msgid "" +"If set, all possible reviewers will be notified by email when this status is " +"reached.Usefull in an Approve by sequence scenario. An notification request " +"to review is sent out when it's their turn to review." +msgstr "" +"Se impostata, tutti i possibili revisori verranno avvisati per e-mail quando " +"questo stato è raggiunto. Utile in uno scenario di approvazione in sequenza. " +"Una notifica di revisione è inviata quando è il turno di revisione." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is accepted." +msgstr "" +"Se impostata, i revisori verranno avvisati con e-mail quando una revisione " +"relativa a questa definizione viene accettata." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is rejected." +msgstr "" +"Se impostata, i revisori verranno avvisati con e-mail quando una revisione " +"relativa a questa definizione viene respinta." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "" +"If set, reviewers will be notified by email when a reviews related to this " +"definition are restarted." +msgstr "" +"Se impostata, i revisori verranno avvisati con e-mail quando una revisione " +"relativa a questa definizione viene riavviata." + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's fully validated" +msgstr "Completamente validato" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's in the validation process" +msgstr "È nel processo di validazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "Data ultimo promemoria" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Model" +msgstr "Modello" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +msgid "Model Name" +msgstr "Nome modello" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "Più Opzioni" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name +msgid "Name" +msgstr "Nome" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__need_validation +msgid "Need Validation" +msgstr "Richiede conferma" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "New Tier Validation" +msgstr "Nuovo Livello Approvazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "Prossima revisione" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "Next: %s" +msgstr "Prossimo: %s" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +msgid "No reviews to do." +msgstr "Nessuna approvazione da fare." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "Notify Reviewers on Accepted" +msgstr "Notifica revisori all'accettazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "Notifica Approvatori su Creazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "Notify Reviewers on Rejected" +msgstr "Notifica revisori quando respinta" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "Notify Reviewers on Restarted" +msgstr "Notifica revisori al riavvio" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_pending +msgid "Notify Reviewers on reaching Pending" +msgstr "Notifica i revisori quando passa a \"In sospeso\"" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" +"Numero di giorni dopo i quali un messaggio deve essere inviato per ricordare " +"della valutazione in attesa (0 = nessun promemoria)" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +msgstr "" +"Una volta creato, si può decidere quali campi si vogliono modificare quando " +"il record:" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" +"Opzione per usare una formula python per ottenere revisori e trovare " +"documenti" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__pending +msgid "Pending" +msgstr "In attesa" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "Modello referenziato" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "Rifiuta" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__rejected +msgid "Rejected" +msgstr "Rifiutato" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected_message +msgid "Rejected Message" +msgstr "Messaggio di rifiuto" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__res_id +msgid "Related Document ID" +msgstr "ID documento correlato" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__model +msgid "Related Document Model" +msgstr "Modello documento correlato" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Request Validation" +msgstr "Richiedi validazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__requested_by +msgid "Requested By" +msgstr "Richiesta da" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Requested by" +msgstr "Richiesta da" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +msgid "Res" +msgstr "Res" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +msgid "Res Model" +msgstr "Modello res" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Restart Validation" +msgstr "Riavvia validazione" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "Approvazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_id +msgid "Reviewer" +msgstr "Revisore" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "Campo approvatore" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "Gruppo approvatore" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "Revisori" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +msgid "Reviews" +msgstr "Revisioni" + +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "Invia promemoria revisione livello" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "Invia messaggio promemoria per le revisioni in attesa" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +msgid "Sequence" +msgstr "Sequenza" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "Utente specifico" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +msgid "Status" +msgstr "Stato" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "The review has been reset by %s." +msgstr "L'approvazione è stata riavviata da %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" +"Please request a validation." +msgstr "" +"Quest'azione deve essere approvata per almeno un record. Approvazioni in " +"sospeso:\n" +" - %s \n" +"Richiedere un'approvazione." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +msgid "Tier" +msgstr "Livello" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "Definizione livello" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "Formula livello" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "Revisione livello" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "Conferma livello" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "Validazione livello (sintesi)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +msgid "Tier Validation Accepted Notification" +msgstr "Notifica Accettazione Livello Approvazione" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_validation_exception_action +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_validation_exception +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_form +msgid "Tier Validation Exception" +msgstr "Eccezione validazione livello" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation_exception +msgid "Tier Validation Exceptions" +msgstr "Eccezioni validazione livello" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +msgid "Tier Validation Rejected Notification" +msgstr "Notifica Rifiuto Livello Approvazione" + +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "Promemoria valutazione livello" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "Approvazione Richiesta" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "Approvazione Riavviata" + +#. module: base_tier_validation +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_confirmation +msgid "Tier Validations" +msgstr "Livelli di Approvazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__to_validate_message +msgid "To Validate Message" +msgstr "Messaggio per 'Da validare'" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__todo_by +msgid "Todo By" +msgstr "Incaricati" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Todo by" +msgstr "Incaricati" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "User" +msgstr "Utente" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__valid_model_field_ids +msgid "Valid Model Field" +msgstr "Campo modello valido" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__valid_reviewer_field_ids +msgid "Valid Reviewer Field" +msgstr "Campo revisore valido" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Validate" +msgstr "Approva" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "Rifiuta Approvazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__validated +msgid "Validated" +msgstr "Approvato" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated_message +msgid "Validated Message" +msgstr "Messaggio per 'Validato'" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__review_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__review_type +msgid "Validated by" +msgstr "Approvato da" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +msgid "Validation Date" +msgstr "Data approvazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_formated_date +msgid "Validation Formated Date" +msgstr "Data formattata validazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validation_status +msgid "Validation Status" +msgstr "Stato validazione" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "Il campo del revisore di convalida deve essere del tipo appropriato" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +msgstr "Validazioni" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__waiting +msgid "Waiting" +msgstr "In attesa" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__no +msgid "Without validation" +msgstr "Senza validazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_after_validation +msgid "Write after Validation" +msgstr "Scrivi dopo validazione" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write after validation" +msgstr "Scrivi dopo validazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_under_validation +msgid "Write under Validation" +msgstr "Scrivi in validazione" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write under validation" +msgstr "Scrivi in validazione" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" +"Non è consentito scrivere quei campi dopo la convalida.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Solo quei campi possono essere modificati:\n" +"- %(allowed_fields_str)s" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" +"Non è consentito scrivere quei campi sotto convalida.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Solo quei campi possono essere modificati:\n" +"- %(allowed_fields_str)s" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "e.g. Tier Validation for..." +msgstr "es. Validazione livello per ..." + +#~ msgid "There are no res.users in the selected field" +#~ msgstr "Non ci sono res.users nel campo selezionato" + +#, python-format +#~ msgid "Activity" +#~ msgstr "Attività" + +#, python-format +#~ msgid "Operation has been rejected." +#~ msgstr "L'operazione è stata rifiutata." + +#, python-format +#~ msgid "Operation has been validated!" +#~ msgstr "L'operazione è stata validata!" + +#, python-format +#~ msgid "This %s needs to be validated" +#~ msgstr "Questo %s deve essere approvato" + +#, python-format +#~ msgid "" +#~ "You are not allowed to write those fields after validation.\n" +#~ "- %(not_allowed_fields)s\n" +#~ "\n" +#~ "Only those fields can be modified:\n" +#~ "- %(allowed_fields)s" +#~ msgstr "" +#~ "Non si è abilitati a scrivere questi campi dopo la validazione.\n" +#~ "- %(not_allowed_fields)s\n" +#~ "\n" +#~ "Solo questi campi possono essere modificati:\n" +#~ "- %(allowed_fields)s" + +#, python-format +#~ msgid "" +#~ "You are not allowed to write those fields under validation.\n" +#~ "- %(not_allowed_fields)s\n" +#~ "\n" +#~ "Only those fields can be modified:\n" +#~ "- %(allowed_fields)s" +#~ msgstr "" +#~ "Non si è abilitati a modificare questi campi in validazione.\n" +#~ "- %(not_allowed_fields)s\n" +#~ "\n" +#~ "Solo questi campi possono essere modificati:\n" +#~ "- %(allowed_fields)s" + +#, python-format +#~ msgid "" +#~ "This action needs to be validated for at least one record. \n" +#~ "Please request a validation." +#~ msgstr "" +#~ "Questa azione richiede di essere approvata per almeno un record.\n" +#~ "Prego richiedere un'approvazione." + +#~ msgid "Model" +#~ msgstr "Modello" + +#, python-format +#~ msgid "" +#~ "The model already exists for this company with this Write Validation " +#~ "configuration!" +#~ msgstr "" +#~ "Il modello esiste già per questa azienda con questa configurazione di " +#~ "scrittura validazione!" + +#, python-format +#~ msgid "The operation is under validation." +#~ msgstr "L'operazione è sotto approvazione." + +#~ msgid "" +#~ "\n" +#~ " This Record needs to be\n" +#~ " validated." +#~ msgstr "" +#~ "\n" +#~ " Questo Record necessita di\n" +#~ " approvazione." + +#~ msgid "" +#~ "\n" +#~ " Operation has been\n" +#~ " rejected\n" +#~ " ." +#~ msgstr "" +#~ "\n" +#~ " L'operazione è stata\n" +#~ " rifiutata\n" +#~ " ." + +#~ msgid "" +#~ "\n" +#~ " Operation has been\n" +#~ " validated\n" +#~ " !" +#~ msgstr "" +#~ "\n" +#~ " L'operazione è stata\n" +#~ " approvata\n" +#~ " !" + +#, python-format +#~ msgid "0 Pending" +#~ msgstr "0 In attesa" + +#~ msgid "Last Modified on" +#~ msgstr "Ultima Modifica il" + +#, python-format +#~ msgid "Activities" +#~ msgstr "Attività" + +#~ msgid "Users" +#~ msgstr "Utenti" + +#~ msgid "A review was rejected by {}. ({})" +#~ msgstr "Un'approvazione è stata rifiutata da {}. ({})" diff --git a/base_tier_validation/i18n/nl.po b/base_tier_validation/i18n/nl.po new file mode 100644 index 00000000..96229640 --- /dev/null +++ b/base_tier_validation/i18n/nl.po @@ -0,0 +1,938 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-06-20 22:25+0000\n" +"Last-Translator: Bosd \n" +"Language-Team: none\n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.10.4\n" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" +"\n" +" Dit Record dient te worden\n" +" beoordeeld." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" rejected\n" +" ." +msgstr "" +"\n" +" Aanvraag is \n" +" afgewezen\n" +" ." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" validated\n" +" !" +msgstr "" +"\n" +" Aanvraag is\n" +" Gevalideerd\n" +" !" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "Naam" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Bypass, if previous tier was validated by same reviewer" +msgstr "" +"Overslaan, indien het vorige niveau door dezelfde beoordelaar is " +"gevalideerd" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A record to be reviewed has been created by %s." +msgstr "Een record dat beoordeeld moet worden, is aangemaakt door %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "A review has been requested %s days ago." +msgstr "Een beoordeling is %s dagen geleden aangevraagd." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review has been requested by %s." +msgstr "Een beoordeling is aangevraagd door %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted" +msgstr "Een beoordeling is geaccepteerd" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted. (%s)" +msgstr "Een beoordeling is geaccepteerd. (%s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "Een beoordeling is afgewezen door %(user)s. (%(comment)s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %s." +msgstr "Een beoordeling is afgewezen door %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A validation process is still open for at least one record." +msgstr "Er is nog een validatieproces open voor ten minste één record." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "Actief" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "All" +msgstr "Alle" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +msgstr "Schrijven toestaan voor beoordelaars" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Allowed groups to use this Tier Validation Exception" +msgstr "Toegestane groepen om deze Tier Validatie Uitzondering te gebruiken" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__group +msgid "Any user in a specific group" +msgstr "Elke gebruiker in een specifieke groep" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Apply On" +msgstr "Toepassen op" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "Goedkeuringsvolgorde op basis van het opgegeven volgnummer" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "Approve Sequence Bypass" +msgstr "Goedkeuringsvolgorde Omzeilen" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence +msgid "Approve by sequence" +msgstr "Goedkeuren op volgorde" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__approved +msgid "Approved" +msgstr "Goedgekeurd" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Archived" +msgstr "Gearchiveerd" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation_exception.py:0 +msgid "" +"At least one of these fields must be checked! Write under Validation, Write " +"after Validation" +msgstr "" +"Minstens één van deze velden moet aangevinkt zijn! Schrijven tijdens " +"Validatie, Schrijven na Validatie" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "" +"Bypassed (auto validated), if previous tier was validated by same reviewer" +msgstr "" +"Overgeslagen (automatisch gevalideerd), indien het vorige niveau door " +"dezelfde beoordelaar is gevalideerd" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__can_review +msgid "Can Review" +msgstr "Kan Beoordelen" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" +"Kan beoordelen wordt gemarkeerd als de beoordeling in behandeling is en de\n" +" goedkeuringssequentie is bereikt" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "Annuleren" + +#. module: base_tier_validation +#. odoo-javascript +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Comment" +msgstr "Opmerking" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "Opmerking Wizard" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment +msgid "Comments" +msgstr "Opmerkingen" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__company_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Company" +msgstr "Bedrijf" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +msgid "Config Settings" +msgstr "Configuratie Instellingen" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "Create a new Validation Exception!" +msgstr "Maak een nieuwe Validatie Uitzondering aan!" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_uid +msgid "Created by" +msgstr "Aangemaakt door" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_date +msgid "Created on" +msgstr "Aangemaakt op" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "Definitie" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "Definitiedomein" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +msgid "Description" +msgstr "Omschrijving" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__display_name +msgid "Display Name" +msgstr "Weergavenaam" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_status +msgid "Display Status" +msgstr "Weergavestatus" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__definition_type__domain +msgid "Domain" +msgstr "Domein" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__done_by +msgid "Done By" +msgstr "Gedaan door" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Done by" +msgstr "Gedaan door" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "Veld in gerelateerd record" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__field_ids +msgid "Fields" +msgstr "Velden" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Group %s" +msgstr "Groep %s" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "Groeperen op" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Groups" +msgstr "Groepen" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "Heeft opmerking" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__hide_reviews +msgid "Hide Reviews" +msgstr "Verberg Beoordelingen" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__id +msgid "ID" +msgstr "ID" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation__has_comment +msgid "If set, Allow the reviewer to leave a comment on the review." +msgstr "" +"Indien ingesteld, staat de beoordelaar toe een opmerking achter te laten bij " +"de beoordeling." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "" +"Indien ingesteld, worden alle mogelijke beoordelaars per e-mail op de hoogte " +"gebracht wanneer deze definitie wordt geactiveerd." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_pending +msgid "" +"If set, all possible reviewers will be notified by email when this status is " +"reached.Usefull in an Approve by sequence scenario. An notification request " +"to review is sent out when it's their turn to review." +msgstr "" +"Indien ingesteld, worden alle mogelijke beoordelaars per e-mail op de hoogte " +"gebracht wanneer deze status is bereikt. Handig in een 'Goedkeuren op " +"volgorde' scenario. Een verzoek om beoordeling wordt verstuurd wanneer zij " +"aan de beurt zijn om te beoordelen." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is accepted." +msgstr "" +"Indien ingesteld, worden beoordelaars per e-mail op de hoogte gebracht " +"wanneer een beoordeling met betrekking tot deze definitie wordt geaccepteerd." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is rejected." +msgstr "" +"Indien ingesteld, worden beoordelaars per e-mail op de hoogte gebracht " +"wanneer een beoordeling met betrekking tot deze definitie wordt afgewezen." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "" +"If set, reviewers will be notified by email when a reviews related to this " +"definition are restarted." +msgstr "" +"Indien ingesteld, worden beoordelaars per e-mail op de hoogte gebracht " +"wanneer beoordelingen met betrekking tot deze definitie opnieuw worden " +"gestart." + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's fully validated" +msgstr "Het is volledig gevalideerd" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's in the validation process" +msgstr "Het bevindt zich in het validatieproces" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "Datum laatste herinnering" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_uid +msgid "Last Updated by" +msgstr "Laatst bijgewerkt door" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_date +msgid "Last Updated on" +msgstr "Laatst bijgewerkt op" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Model" +msgstr "Model" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +msgid "Model Name" +msgstr "Model naam" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "Meer Opties" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name +msgid "Name" +msgstr "Naam" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__need_validation +msgid "Need Validation" +msgstr "Validatie nodig" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "New Tier Validation" +msgstr "Nieuwe Tier-validatie" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "Volgende Beoordeling" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "Next: %s" +msgstr "Volgende: %s" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +msgid "No reviews to do." +msgstr "Geen beoordelingen te doen." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "Notify Reviewers on Accepted" +msgstr "Breng reviewers op de hoogte indien geaccepteerd" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "Informeer beoordelaar bij het maken" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "Notify Reviewers on Rejected" +msgstr "Waarschuw reviewers bij afwijzing" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "Notify Reviewers on Restarted" +msgstr "Waarschuw reviewers bij herstart" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_pending +msgid "Notify Reviewers on reaching Pending" +msgstr "Informeer reviewers over het bereiken van de status In behandeling" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" +"Aantal dagen waarna een bericht moet worden geplaatst om te herinneren aan " +"de in behandeling zijnde validatie (0 = geen herinnering)" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +msgstr "" +"Nadat u het record hebt aangemaakt, kunt u bepalen welke velden u bewerkbaar " +"wilt maken wanneer het record:" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" +"Optie om pythonformule te gebruiken om beoordelaars te krijgen en documenten " +"te vinden" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__pending +msgid "Pending" +msgstr "In afwachting" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "Referentiemodel" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "Weiger" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__rejected +msgid "Rejected" +msgstr "Afgekeurd" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected_message +msgid "Rejected Message" +msgstr "Afgewezen bericht" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__res_id +msgid "Related Document ID" +msgstr "Gerelateerde document-ID" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__model +msgid "Related Document Model" +msgstr "Verwant documentmodel" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Request Validation" +msgstr "Verzoek tot validatie" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__requested_by +msgid "Requested By" +msgstr "Aangevraagd door" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Requested by" +msgstr "Aangevraagd door" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +msgid "Res" +msgstr "Res" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +msgid "Res Model" +msgstr "Res model" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Restart Validation" +msgstr "Herstart Validatie" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "Beoordeling" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_id +msgid "Reviewer" +msgstr "Beoordelaar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "Beoordelaar veld" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "Beoordeel groep" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "Beoordelaars" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +msgid "Reviews" +msgstr "Beoordelingen" + +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "Verzend Tier Beoordeling Herinnering" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "Stuur herinneringsbericht voor openstaande beoordelingen" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +msgid "Sequence" +msgstr "Volgorde" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "Specifieke gebruiker" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +msgid "Status" +msgstr "Status" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "The review has been reset by %s." +msgstr "De beoordeling is opnieuw ingesteld door %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" +"Please request a validation." +msgstr "" +"Deze actie moet worden gevalideerd voor ten minste één record. Beoordelingen " +"in afwachting:\n" +" - %s \n" +"Vraag alstublieft een validatie aan." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +msgid "Tier" +msgstr "Niveau" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "Niveau Definitie" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "Niveau Formule" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "Niveau Beoordeling" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "Niveau Validatie" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "Niveau Validatie (abstract)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +msgid "Tier Validation Accepted Notification" +msgstr "Niveau Validatie Geaccepteerd Notificatie" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_validation_exception_action +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_validation_exception +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_form +msgid "Tier Validation Exception" +msgstr "Niveau Validatie Uitzondering" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation_exception +msgid "Tier Validation Exceptions" +msgstr "Niveau Validatie Uitzonderingen" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +msgid "Tier Validation Rejected Notification" +msgstr "Niveau Validatie Afgewezen Notificatie" + +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "Niveau Validatie Herinnering" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "Niveau Validatie Aangevraagd" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "Niveau Validatie Herstart" + +#. module: base_tier_validation +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_confirmation +msgid "Tier Validations" +msgstr "Niveau 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 "Te Valideren Bericht" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__todo_by +msgid "Todo By" +msgstr "Te Doen Door" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Todo by" +msgstr "Te doen door" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "User" +msgstr "Gebruiker" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__valid_model_field_ids +msgid "Valid Model Field" +msgstr "Geldig Modelveld" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__valid_reviewer_field_ids +msgid "Valid Reviewer Field" +msgstr "Geldig Beoordelaarsveld" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Validate" +msgstr "Valideren" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "Valideren Weigeren" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__validated +msgid "Validated" +msgstr "Gevalideerd" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated_message +msgid "Validated Message" +msgstr "Gevalideerd Bericht" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__review_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__review_type +msgid "Validated by" +msgstr "Gevalideerd door" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +msgid "Validation Date" +msgstr "Validatiedatum" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_formated_date +msgid "Validation Formated Date" +msgstr "Validatie Datum" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validation_status +msgid "Validation Status" +msgstr "Validatiestatus" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +msgstr "Validaties" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__waiting +msgid "Waiting" +msgstr "Wachtend" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__no +msgid "Without validation" +msgstr "Zonder validatie" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_after_validation +msgid "Write after Validation" +msgstr "Schrijven na Validatie" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write after validation" +msgstr "Schrijven na validatie" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_under_validation +msgid "Write under Validation" +msgstr "Schrijven tijdens Validatie" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write under validation" +msgstr "Schrijven tijdens validatie" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" +"U mag deze velden niet schrijven na validatie.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Alleen deze velden kunnen worden gewijzigd:\n" +"- %(allowed_fields_str)s" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" +"U mag deze velden niet schrijven tijdens validatie.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Alleen deze velden kunnen worden gewijzigd:\n" +"- %(allowed_fields_str)s" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "e.g. Tier Validation for..." +msgstr "bijv. Niveau Validatie voor..." + +#~ msgid "There are no res.users in the selected field" +#~ msgstr "Er zijn geen res.users in het geselecteerde veld" diff --git a/base_tier_validation/i18n/nl_NL.po b/base_tier_validation/i18n/nl_NL.po new file mode 100644 index 00000000..efb4b172 --- /dev/null +++ b/base_tier_validation/i18n/nl_NL.po @@ -0,0 +1,992 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-02-04 21:02+0000\n" +"Last-Translator: Bosd \n" +"Language-Team: none\n" +"Language: nl_NL\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.6.2\n" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" +"\n" +" Dit Record dient te worden\n" +" beoordeeld." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" rejected\n" +" ." +msgstr "" +"\n" +" Aanvraag is \n" +" afgewezen\n" +" ." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" validated\n" +" !" +msgstr "" +"\n" +" Aanvraag is\n" +" Gevalideerd\n" +" !" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "Naam" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Bypass, if previous tier was validated by same reviewer" +msgstr "" +"Overslaan, indien het vorige niveau door dezelfde beoordelaar is " +"gevalideerd" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A record to be reviewed has been created by %s." +msgstr "Een record dat beoordeeld moet worden, is aangemaakt door %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "A review has been requested %s days ago." +msgstr "Een beoordeling is %s dagen geleden aangevraagd." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review has been requested by %s." +msgstr "Een beoordeling is aangevraagd door %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted" +msgstr "Een beoordeling is geaccepteerd" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted. (%s)" +msgstr "Een beoordeling is geaccepteerd. (%s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "Een beoordeling is afgewezen door %(user)s. (%(comment)s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %s." +msgstr "Een beoordeling is afgewezen door %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A validation process is still open for at least one record." +msgstr "Er is nog een validatieproces open voor ten minste één record." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "Actief" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "All" +msgstr "Alle" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +msgstr "Schrijven toestaan voor beoordelaars" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Allowed groups to use this Tier Validation Exception" +msgstr "Toegestane groepen om deze Tier Validatie Uitzondering te gebruiken" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__group +msgid "Any user in a specific group" +msgstr "Elke gebruiker in een specifieke groep" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Apply On" +msgstr "Toepassen op" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "Goedkeuringsvolgorde op basis van het opgegeven volgnummer" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "Approve Sequence Bypass" +msgstr "Beoordeel volgorde omzeilen" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence +msgid "Approve by sequence" +msgstr "Goedkeuren op volgorde" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__approved +msgid "Approved" +msgstr "Goedgekeurd" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Archived" +msgstr "gearchiveerd" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation_exception.py:0 +msgid "" +"At least one of these fields must be checked! Write under Validation, Write " +"after Validation" +msgstr "" +"Minstens één van deze velden moet aangevinkt zijn! Schrijven tijdens " +"Validatie, Schrijven na Validatie" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "" +"Bypassed (auto validated), if previous tier was validated by same reviewer" +msgstr "" +"Overgeslagen (automatisch gevalideerd), als het vorige niveau door dezelfde " +"beoordelaar is gevalideerd" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__can_review +msgid "Can Review" +msgstr "Kan beoordelen" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" +"Kan beoordelen wordt gemarkeerd als de beoordeling in behandeling is en de\n" +" goedkeuringssequentie is bereikt" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "Annuleer" + +#. module: base_tier_validation +#. odoo-javascript +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Comment" +msgstr "Opmerking" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "Opmerking Wizard" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment +msgid "Comments" +msgstr "Opmerkingen" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__company_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Company" +msgstr "Bedrijf" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +msgid "Config Settings" +msgstr "Configuratie Instellingen" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "Create a new Validation Exception!" +msgstr "Maak een nieuwe Validatie Uitzondering aan!" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_uid +msgid "Created by" +msgstr "Bedrijf" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_date +msgid "Created on" +msgstr "Aangemaakt door" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "Definitie" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "Definitiedomein" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +msgid "Description" +msgstr "Omschrijving" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__display_name +msgid "Display Name" +msgstr "Weergavenaam" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_status +msgid "Display Status" +msgstr "Weergavestatus" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__definition_type__domain +msgid "Domain" +msgstr "Domein" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__done_by +msgid "Done By" +msgstr "Gedaan door" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Done by" +msgstr "Gedaan door" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "Veld in verwante record" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__field_ids +msgid "Fields" +msgstr "Velden" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Group %s" +msgstr "Groep %s" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "Groeperen op" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Groups" +msgstr "Groepen" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "Heeft commentaar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__hide_reviews +msgid "Hide Reviews" +msgstr "Verberg Beoordelingen" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__id +msgid "ID" +msgstr "ID" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation__has_comment +msgid "If set, Allow the reviewer to leave a comment on the review." +msgstr "" +"Indien ingesteld, staat de beoordelaar toe een opmerking achter te laten bij " +"de beoordeling." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "" +"Indien ingesteld, worden alle mogelijke reviewers per e-mail op de hoogte " +"gebracht wanneer deze definitie wordt geactiveerd." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_pending +msgid "" +"If set, all possible reviewers will be notified by email when this status is " +"reached.Usefull in an Approve by sequence scenario. An notification request " +"to review is sent out when it's their turn to review." +msgstr "" +"Indien ingesteld, worden alle mogelijke beoordelaars per e-mail op de hoogte " +"gebracht wanneer deze status is bereikt. Handig in een 'Goedkeuren op " +"volgorde' scenario. Een verzoek om beoordeling wordt verstuurd wanneer zij " +"aan de beurt zijn om te beoordelen." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is accepted." +msgstr "" +"Indien ingesteld, worden beoordelaars per e-mail op de hoogte gebracht " +"wanneer een beoordeling met betrekking tot deze definitie wordt geaccepteerd." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is rejected." +msgstr "" +"Indien ingesteld, worden beoordelaars per e-mail op de hoogte gebracht " +"wanneer een beoordeling met betrekking tot deze definitie wordt afgewezen." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "" +"If set, reviewers will be notified by email when a reviews related to this " +"definition are restarted." +msgstr "" +"Indien ingesteld, worden beoordelaars per e-mail op de hoogte gebracht " +"wanneer beoordelingen met betrekking tot deze definitie opnieuw worden " +"gestart." + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's fully validated" +msgstr "Het is volledig gevalideerd" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's in the validation process" +msgstr "Het bevindt zich in het validatieproces" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "Datum laatste herinnering" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_uid +msgid "Last Updated by" +msgstr "Laatst bijgewerkt door" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_date +msgid "Last Updated on" +msgstr "Laatst bijgewerkt op" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Model" +msgstr "Model" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +msgid "Model Name" +msgstr "Model naam" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "Meer Opties" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name +msgid "Name" +msgstr "Naam" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__need_validation +msgid "Need Validation" +msgstr "Validatie nodig" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "New Tier Validation" +msgstr "Nieuwe Tier-validatie" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "Volgende Beoordeling" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "Next: %s" +msgstr "Volgende: %s" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +msgid "No reviews to do." +msgstr "Geen beoordelingen te doen." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "Notify Reviewers on Accepted" +msgstr "Breng reviewers op de hoogte indien geaccepteerd" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "Informeer beoordelaar bij het maken" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "Notify Reviewers on Rejected" +msgstr "Waarschuw reviewers bij afwijzing" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "Notify Reviewers on Restarted" +msgstr "Waarschuw reviewers bij herstart" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_pending +msgid "Notify Reviewers on reaching Pending" +msgstr "Informeer reviewers over het bereiken van de status In behandeling" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" +"Aantal dagen waarna een bericht moet worden geplaatst om te herinneren aan " +"de in behandeling zijnde validatie (0 = geen herinnering)" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +msgstr "" +"Nadat u het record hebt aangemaakt, kunt u bepalen welke velden u bewerkbaar " +"wilt maken wanneer het record:" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" +"Optie om pythonformule te gebruiken om beoordelaars te krijgen en documenten " +"te vinden" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__pending +msgid "Pending" +msgstr "In afwachting" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "Referentiemodel" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "Weiger" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__rejected +msgid "Rejected" +msgstr "Afgekeurd" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected_message +msgid "Rejected Message" +msgstr "Afgewezen bericht" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__res_id +msgid "Related Document ID" +msgstr "Gerelateerde document-ID" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__model +msgid "Related Document Model" +msgstr "Verwant documentmodel" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Request Validation" +msgstr "Verzoek valideren" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__requested_by +msgid "Requested By" +msgstr "Aangevraagd door" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Requested by" +msgstr "Aangevraagd door" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +msgid "Res" +msgstr "Res" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +msgid "Res Model" +msgstr "Res model" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Restart Validation" +msgstr "Herstart Beoordeling" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "Beoordeling" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_id +msgid "Reviewer" +msgstr "Beoordelaar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "Beoordelaar veld" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "Beoordeel groep" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "Beoordelaars" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +msgid "Reviews" +msgstr "Beoordelingen" + +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "Verzend Tier Beoordeling Herinnering" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "Stuur herinneringsbericht voor openstaande beoordelingen" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +msgid "Sequence" +msgstr "Volgorde" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "Specifieke gebruiker" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +msgid "Status" +msgstr "Status" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "The review has been reset by %s." +msgstr "De beoordeling is opnieuw gestart door %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" +"Please request a validation." +msgstr "" +"Deze actie moet worden gevalideerd voor ten minste één record. Beoordelingen " +"in afwachting:\n" +" - %s \n" +"Vraag alstublieft een validatie aan." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +msgid "Tier" +msgstr "Tier" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "Tier definitie" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "Niveau Formule" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "Tier beoordeling" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "Niveauvalidatie" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "Tier-validatie (abstract)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +msgid "Tier Validation Accepted Notification" +msgstr "Tier-validatie (abstract)" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_validation_exception_action +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_validation_exception +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_form +msgid "Tier Validation Exception" +msgstr "Niveau Validatie Uitzondering" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation_exception +msgid "Tier Validation Exceptions" +msgstr "Niveau Validatie Uitzonderingen" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +msgid "Tier Validation Rejected Notification" +msgstr "Tier-validatie (abstract)" + +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "Niveau Validatie Herinnering" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "Niveau Validatie Aangevraagd" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "Niveauvalidatie opnieuw gestart" + +#. module: base_tier_validation +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_confirmation +msgid "Tier Validations" +msgstr "Tier-validaties" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__to_validate_message +msgid "To Validate Message" +msgstr "Bericht valideren" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__todo_by +msgid "Todo By" +msgstr "Te doen door" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Todo by" +msgstr "Te doen door" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "User" +msgstr "Gebruiker" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__valid_model_field_ids +msgid "Valid Model Field" +msgstr "Geldig Modelveld" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__valid_reviewer_field_ids +msgid "Valid Reviewer Field" +msgstr "Geldig beoordelaarsveld" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Validate" +msgstr "Valideer" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "Valideren weigeren" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__validated +msgid "Validated" +msgstr "Gevalideerd" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated_message +msgid "Validated Message" +msgstr "Gevalideerd bericht" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__review_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__review_type +msgid "Validated by" +msgstr "Gevalideerd door" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +msgid "Validation Date" +msgstr "Validatie datum" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_formated_date +msgid "Validation Formated Date" +msgstr "Validatie Datum" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validation_status +msgid "Validation Status" +msgstr "Validatie Status" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +msgstr "Validaties" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__waiting +msgid "Waiting" +msgstr "Wachtend" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__no +msgid "Without validation" +msgstr "Zonder validatie" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_after_validation +msgid "Write after Validation" +msgstr "Schrijven na Validatie" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write after validation" +msgstr "Schrijven na validatie" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_under_validation +msgid "Write under Validation" +msgstr "Schrijven tijdens Validatie" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write under validation" +msgstr "Schrijven tijdens validatie" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" +"U mag deze velden niet schrijven na validatie.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Alleen deze velden kunnen worden gewijzigd:\n" +"- %(allowed_fields_str)s" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" +"U mag deze velden niet schrijven tijdens validatie.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Alleen deze velden kunnen worden gewijzigd:\n" +"- %(allowed_fields_str)s" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "e.g. Tier Validation for..." +msgstr "bijv. Tier validatie voor..." + +#~ msgid "There are no res.users in the selected field" +#~ msgstr "Er zijn geen res.users in het geselecteerde veld" + +#, python-format +#~ msgid "Activity" +#~ msgstr "Activiteit" + +#, python-format +#~ msgid "Operation has been rejected." +#~ msgstr "Operatie is afgewezen." + +#, python-format +#~ msgid "Operation has been validated!" +#~ msgstr "Operation has been Goedgekeurd!" + +#, python-format +#~ msgid "This %s needs to be validated" +#~ msgstr "Dit %s dient te worden beoordeeld" + +#, python-format +#~ msgid "" +#~ "This action needs to be validated for at least one record. \n" +#~ "Please request a validation." +#~ msgstr "" +#~ "Deze actie moet voor ten minste één record gevalideerd worden.\n" +#~ "Vraag een validatie aan." + +#, python-format +#~ msgid "The operation is under validation." +#~ msgstr "De bewerking is onder validatie." + +#, python-format +#~ msgid "0 Pending" +#~ msgstr "0 In afwachting" + +#~ msgid "Last Modified on" +#~ msgstr "Laatst gewijzigd op" + +#, fuzzy, python-format +#~ msgid "Activities" +#~ msgstr "Actief" + +#~ msgid "Users" +#~ msgstr "Gebruikers" + +#~ msgid "A review was rejected by {}. ({})" +#~ msgstr "Een beoordeling is afgewezen door {}. ({})" + +#~ msgid "Any user in a specific group." +#~ msgstr "Elke gebruiker in een specifieke groep." + +#~ msgid "Object" +#~ msgstr "Object" + +#~ msgid "Approve Sequence" +#~ msgstr "Volgorde goedkeuren" diff --git a/base_tier_validation/i18n/sv.po b/base_tier_validation/i18n/sv.po new file mode 100644 index 00000000..d7d4ff13 --- /dev/null +++ b/base_tier_validation/i18n/sv.po @@ -0,0 +1,1014 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-06-12 12:39+0000\n" +"Last-Translator: jakobkrabbe \n" +"Language-Team: none\n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" +"\n" +" Denna post behöver\n" +" bekräftas." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" rejected\n" +" ." +msgstr "" +"\n" +" Operationen har blivit\n" +" avslås\n" +" ." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" validated\n" +" !" +msgstr "" +"\n" +" Operationen har blivit\n" +" bekräftad\n" +" !" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "Namn" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Bypass, if previous tier was validated by same reviewer" +msgstr "" +"Hoppa över, om föregående nivå bekräftades av samma granskare" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A record to be reviewed has been created by %s." +msgstr "En post som ska granskas har skapats av %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "A review has been requested %s days ago." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review has been requested by %s." +msgstr "En granskning har begärts av %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted" +msgstr "En granskning accepterades" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted. (%s)" +msgstr "En granskning accepterades. (%s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "En recension avvisades av %(user)s. (%(comment)s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %s." +msgstr "En granskning nekades av %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A validation process is still open for at least one record." +msgstr "En valideringsprocess är fortfarande öppen för minst en post." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "Aktiv" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "All" +msgstr "Alla" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Allowed groups to use this Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__group +msgid "Any user in a specific group" +msgstr "Alla användare i en specifik grupp" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Apply On" +msgstr "Applicera på" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "Godkännandeordning enligt angivet sekvensnummer" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "Approve Sequence Bypass" +msgstr "Godkänna förbikoppling av sekvens" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence +msgid "Approve by sequence" +msgstr "Godkänn efter sekvens" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__approved +msgid "Approved" +msgstr "Godkänd" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Archived" +msgstr "Arkiverad" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation_exception.py:0 +msgid "" +"At least one of these fields must be checked! Write under Validation, Write " +"after Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "" +"Bypassed (auto validated), if previous tier was validated by same reviewer" +msgstr "" +"Förbigås (bekräftas automatiskt), om föregående nivå bekräftades av samma " +"granskare" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__can_review +msgid "Can Review" +msgstr "Kan granska" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" +"Kan granska kommer att vara ikryssad om granskningen är väntande och\n" +" godkännandesekvensen har uppnåtts" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "Avbryt" + +#. module: base_tier_validation +#. odoo-javascript +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Comment" +msgstr "Kommentar" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "Kommentarsguide" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment +msgid "Comments" +msgstr "Kommentarer" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__company_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Company" +msgstr "Bolag" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +msgid "Config Settings" +msgstr "Konfigurationsinställningar" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "Create a new Validation Exception!" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_uid +msgid "Created by" +msgstr "Skapad av" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_date +msgid "Created on" +msgstr "Skapad den" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "Definition" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "Definitionsdomän" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +msgid "Description" +msgstr "Beskrivning" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__display_name +msgid "Display Name" +msgstr "Visningsnamn" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_status +msgid "Display Status" +msgstr "Visa status" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__definition_type__domain +msgid "Domain" +msgstr "Domän" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__done_by +msgid "Done By" +msgstr "Gjord av" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Done by" +msgstr "Gjord av" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "Fält i relaterad post" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__field_ids +msgid "Fields" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Group %s" +msgstr "Grupp %s" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "Gruppera efter" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Groups" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "Har kommentar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__hide_reviews +msgid "Hide Reviews" +msgstr "Dölj recensioner" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__id +msgid "ID" +msgstr "ID" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation__has_comment +msgid "If set, Allow the reviewer to leave a comment on the review." +msgstr "" +"Om inställd, Tillåt granskaren att lämna en kommentar till granskningen." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "" +"Om den är inställd kommer alla möjliga granskare att meddelas via e-post när " +"denna definition aktiveras." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_pending +msgid "" +"If set, all possible reviewers will be notified by email when this status is " +"reached.Usefull in an Approve by sequence scenario. An notification request " +"to review is sent out when it's their turn to review." +msgstr "" +"Om den är inställd kommer alla möjliga granskare att meddelas via e-post när " +"den här statusen uppnås.Användbar i ett Approve by sequence-scenario. Ett " +"meddelande med en begäran om granskning skickas ut när det är deras tur att " +"granska." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is accepted." +msgstr "" +"Om den är inställd kommer granskare att meddelas via e-post när en " +"granskning som är relaterad till denna definition accepteras." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is rejected." +msgstr "" +"Om den är inställd kommer granskare att meddelas via e-post när en " +"granskning som är relaterad till denna definition avvisas." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "" +"If set, reviewers will be notified by email when a reviews related to this " +"definition are restarted." +msgstr "" +"Om den är inställd kommer granskare att meddelas via e-post när en " +"granskning som är relaterad till denna definition startas om." + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's fully validated" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's in the validation process" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_uid +msgid "Last Updated by" +msgstr "Senast uppdaterad av" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_date +msgid "Last Updated on" +msgstr "Senast uppdaterad den" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Model" +msgstr "Modell" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +msgid "Model Name" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "Fler alternativ" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name +msgid "Name" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__need_validation +msgid "Need Validation" +msgstr "Behöver validering" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "New Tier Validation" +msgstr "Ny attestering" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "Nästa granskning" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "Next: %s" +msgstr "Nästa: %s" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +msgid "No reviews to do." +msgstr "Inga granskningar att göra." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "Notify Reviewers on Accepted" +msgstr "Meddela granskare om accepterad" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "Meddela granskare vid skapande" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "Notify Reviewers on Rejected" +msgstr "Meddela granskare om avvisade" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "Notify Reviewers on Restarted" +msgstr "Meddela granskare vid omstart" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_pending +msgid "Notify Reviewers on reaching Pending" +msgstr "Meddela granskare om att nå Pending" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" +"Alternativ för att använda python-formel för att få fram granskare och hitta " +"dokument" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__pending +msgid "Pending" +msgstr "Väntande" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "Refererad modell" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "Neka" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__rejected +msgid "Rejected" +msgstr "Nekad" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected_message +msgid "Rejected Message" +msgstr "Avvisat meddelande" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__res_id +msgid "Related Document ID" +msgstr "ID för relaterat dokument" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__model +msgid "Related Document Model" +msgstr "Modell för relaterat dokument" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Request Validation" +msgstr "Begär validering" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__requested_by +msgid "Requested By" +msgstr "Begärd av" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Requested by" +msgstr "Begärd av" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +msgid "Res" +msgstr "Res" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +msgid "Res Model" +msgstr "Res modell" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Restart Validation" +msgstr "Starta om validering" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "Granska" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_id +msgid "Reviewer" +msgstr "Granskare" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "Granskarfält" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "Granskargrupp" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "Granskare" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +msgid "Reviews" +msgstr "Granskningar" + +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +msgid "Sequence" +msgstr "Sekvens" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "Specifik användare" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +msgid "Status" +msgstr "Status" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "The review has been reset by %s." +msgstr "Granskningen har återställts av %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" +"Please request a validation." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +msgid "Tier" +msgstr "Djur" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "Attestdefinition" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "Attestformel" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "Attestgranskning" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "Attestering" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "Attestering (sammanfattning)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +msgid "Tier Validation Accepted Notification" +msgstr "Meddelande vid accepterad attestering" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_validation_exception_action +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_validation_exception +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_form +msgid "Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation_exception +msgid "Tier Validation Exceptions" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +msgid "Tier Validation Rejected Notification" +msgstr "Meddelande vid nekad attestering" + +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "Attestering begärd" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "Attestering omstartad" + +#. module: base_tier_validation +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_confirmation +msgid "Tier Validations" +msgstr "Attesteringar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__to_validate_message +msgid "To Validate Message" +msgstr "För att validera meddelandet" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__todo_by +msgid "Todo By" +msgstr "Att göra av" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Todo by" +msgstr "Att göra av" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "User" +msgstr "Användare" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__valid_model_field_ids +msgid "Valid Model Field" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__valid_reviewer_field_ids +msgid "Valid Reviewer Field" +msgstr "Giltigt fält för granskare" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Validate" +msgstr "Validera" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "Validera Neka" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__validated +msgid "Validated" +msgstr "Validerad" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated_message +msgid "Validated Message" +msgstr "Validerat meddelande" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__review_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__review_type +msgid "Validated by" +msgstr "Validerad av" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +msgid "Validation Date" +msgstr "Valideringsdatum" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_formated_date +msgid "Validation Formated Date" +msgstr "Validering Formated Date" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validation_status +msgid "Validation Status" +msgstr "Status för validering" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +msgstr "Valideringar" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__waiting +msgid "Waiting" +msgstr "Väntar på" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__no +msgid "Without validation" +msgstr "Utan validering" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_after_validation +msgid "Write after Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write after validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_under_validation +msgid "Write under Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write under validation" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "e.g. Tier Validation for..." +msgstr "t.ex. attestvalidering för..." + +#~ msgid "There are no res.users in the selected field" +#~ msgstr "Det finns inga res.users i det valda fältet" + +#, python-format +#~ msgid "Activity" +#~ msgstr "Aktivitet" + +#, python-format +#~ msgid "Operation has been rejected." +#~ msgstr "Operationen har avslagits." + +#, python-format +#~ msgid "Operation has been validated!" +#~ msgstr "Operationen har validerats!" + +#, python-format +#~ msgid "This %s needs to be validated" +#~ msgstr "Denna %s måste bekräftas" + +#, python-format +#~ msgid "" +#~ "This action needs to be validated for at least one record. \n" +#~ "Please request a validation." +#~ msgstr "" +#~ "Denna åtgärd måste bekräftas för minst en post.\n" +#~ "Vänligen begär en validering." + +#, python-format +#~ msgid "The operation is under validation." +#~ msgstr "Åtgärden håller på att bekräftas." + +#~ msgid "" +#~ "\n" +#~ " This Record needs to be\n" +#~ " validated." +#~ msgstr "" +#~ "\n" +#~ " Den här posten måste\n" +#~ " valideras." + +#~ msgid "" +#~ "\n" +#~ " Operation has been\n" +#~ " rejected\n" +#~ " ." +#~ msgstr "" +#~ "\n" +#~ " Åtgärden har\n" +#~ " nekats\n" +#~ " ." + +#~ msgid "" +#~ "\n" +#~ " Operation has been\n" +#~ " validated\n" +#~ " !" +#~ msgstr "" +#~ "\n" +#~ " Åtgärden har\n" +#~ " validerats\n" +#~ " !" + +#, python-format +#~ msgid "0 Pending" +#~ msgstr "0 väntande" + +#~ msgid "Last Modified on" +#~ msgstr "Senast ändrad den" + +#~ msgid "Option to forward a tier validation to other reviewer, and backward" +#~ msgstr "" +#~ "Alternativ för att vidarebefordra en attestering till en annan granskare " +#~ "och bakåt" + +#~ msgid "Tier Forward & Backward" +#~ msgstr "Attest framåt och bakåt" + +#, python-format +#~ msgid "Activities" +#~ msgstr "Aktiviteter" + +#~ msgid "More reports about tier validations, i.e., summary of all my reviews" +#~ msgstr "" +#~ "Fler rapporter om attesteringar, dvs. en sammanfattning av alla mina " +#~ "granskningar" + +#~ msgid "Option to trigger server actions on completion of tier reviews" +#~ msgstr "" +#~ "Alternativ för att utlösa serveråtgärder när attesteringar har slutförts" + +#~ msgid "Tier Reports" +#~ msgstr "Attestrapporter" + +#~ msgid "Tier Server Action" +#~ msgstr "Attestserveråtgärd" + +#~ msgid "Users" +#~ msgstr "Användare" + +#~ msgid "A review was rejected by {}. ({})" +#~ msgstr "En granskning nekades av {}. ({})" diff --git a/base_tier_validation/i18n/tr.po b/base_tier_validation/i18n/tr.po new file mode 100644 index 00000000..64dce357 --- /dev/null +++ b/base_tier_validation/i18n/tr.po @@ -0,0 +1,998 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-10-30 17:00+0000\n" +"Last-Translator: Betül Öğmen \n" +"Language-Team: none\n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.10.4\n" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" +"\n" +" Bu kaydın onaylanması\n" +" gerekmektedir." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" rejected\n" +" ." +msgstr "" +"\n" +" İşlem reddedildi\n" +" \n" +" ." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" validated\n" +" !" +msgstr "" +"\n" +" İşlem Onaylandı\n" +" \n" +" !" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "Adı" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Bypass, if previous tier was validated by same reviewer" +msgstr "" +"Önceki aşama aynı inceleyen tarafından doğrulandıysa atlandı" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A record to be reviewed has been created by %s." +msgstr "Gözden geçirilmesi gereken bir kayıt %s tarafından oluşturuldu." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "A review has been requested %s days ago." +msgstr "%s tarafından bir inceleme istendi." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review has been requested by %s." +msgstr "%s tarafından bir inceleme istendi." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted" +msgstr "Bir inceleme kabul edildi" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted. (%s)" +msgstr "Bir inceleme kabul edildi. (%s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "Bir inceleme %(user)s tarafından reddedildi. (%(comment)s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %s." +msgstr "Bir inceleme %s tarafından reddedildi." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A validation process is still open for at least one record." +msgstr "En az bir kayıt için hala bir doğrulama süreci açık." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "Etkin" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "All" +msgstr "Bütün" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +msgstr "İnceleyenler için yazmaya izin ver" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Allowed groups to use this Tier Validation Exception" +msgstr "Grupların bu Katman Doğrulama İstisnasını kullanmasına izin verildi" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__group +msgid "Any user in a specific group" +msgstr "Belirli bir gruptaki herhangi bir kullanıcı" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Apply On" +msgstr "Uygula" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "Belirtilen sıra numarasına göre onay sırası" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "Approve Sequence Bypass" +msgstr "Dizi Atlamasını Onayla" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence +msgid "Approve by sequence" +msgstr "Sıraya göre onayla" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__approved +msgid "Approved" +msgstr "Onaylı" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Archived" +msgstr "Arşivlendi" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation_exception.py:0 +msgid "" +"At least one of these fields must be checked! Write under Validation, Write " +"after Validation" +msgstr "" +"Bu alanlardan en az birinin işaretlenmesi gerekmektedir! Doğrulama Altında " +"Yaz, Doğrulama Sonrası Yaz\"" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "" +"Bypassed (auto validated), if previous tier was validated by same reviewer" +msgstr "" +"Önceki aşama aynı inceleyici tarafından doğrulandıysa atlandı (otomatik " +"olarak doğrulandı)" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__can_review +msgid "Can Review" +msgstr "Gözden Geçirebilir" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" +"İnceleme beklemedeyse ve gözden geçirilebilirse işaretlenebilir.\n" +" onay dizisi elde edildi" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "İptal" + +#. module: base_tier_validation +#. odoo-javascript +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Comment" +msgstr "Yorum" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "Yorum Sihirbazı" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment +msgid "Comments" +msgstr "Yorumlar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__company_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Company" +msgstr "Şirket" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +msgid "Config Settings" +msgstr "Yapılandırma Ayarları" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "Create a new Validation Exception!" +msgstr "Yeni bir Doğrulama İstisnası oluştur!" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_uid +msgid "Created by" +msgstr "Oluşturan" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_date +msgid "Created on" +msgstr "Oluşturulma" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "Tanım" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "Tanım Etki Alanı" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +msgid "Description" +msgstr "Açıklama" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__display_name +msgid "Display Name" +msgstr "Görünüm Adı" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_status +msgid "Display Status" +msgstr "Durumu Göster" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__definition_type__domain +msgid "Domain" +msgstr "Etki Alanı" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__done_by +msgid "Done By" +msgstr "Tamamlayan" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Done by" +msgstr "Tamamlayan" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "İlgili kayıttaki alan" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__field_ids +msgid "Fields" +msgstr "Alanlar" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Group %s" +msgstr "Grup %s" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "Grupla" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Groups" +msgstr "Gruplar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "Yorum Var" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__hide_reviews +msgid "Hide Reviews" +msgstr "İncelemeleri Gizle" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__id +msgid "ID" +msgstr "ID" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation__has_comment +msgid "If set, Allow the reviewer to leave a comment on the review." +msgstr "Ayarlanırsa, İnceleyenin inceleme üzerinde yorum yapmasına izin ver." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "" +"Ayarlanırsa, bu tanım tetiklendiğinde tüm olası gözden geçirenler e-posta " +"ile bilgilendirilecektir." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_pending +msgid "" +"If set, all possible reviewers will be notified by email when this status is " +"reached.Usefull in an Approve by sequence scenario. An notification request " +"to review is sent out when it's their turn to review." +msgstr "" +"Ayarlanırsa, bu duruma ulaşıldığında tüm olası inceleyenler e-posta ile " +"bildirilecektir. Sıraya göre onay senaryosunda kullanışlıdır. İnceleme " +"sırası kendilerine geldiğinde bir inceleme isteği gönderilir." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is accepted." +msgstr "" +"Ayarlanırsa, bu tanımla ilgili bir inceleme kabul edildiğinde inceleyiciler " +"e-postayla bilgilendirilecektir." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is rejected." +msgstr "" +"Ayarlanırsa, bu tanımla ilgili bir inceleme reddedildiğinde inceleyiciler e-" +"postayla bilgilendirilecektir." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "" +"If set, reviewers will be notified by email when a reviews related to this " +"definition are restarted." +msgstr "" +"Ayarlanırsa, bu tanımla ilgili bir inceleme yeniden başlatıldığında " +"inceleyiciler e-postayla bilgilendirilecektir." + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's fully validated" +msgstr "Tamamen Doğrulandı" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's in the validation process" +msgstr "Doğrulama Aşamasında" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "Son Bilgilendirme Tarihi" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_uid +msgid "Last Updated by" +msgstr "Son Güncelleyen" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_date +msgid "Last Updated on" +msgstr "Son Güncelleme" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Model" +msgstr "Modeli" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +msgid "Model Name" +msgstr "Model İsmi" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "Daha Fazla Seçenek" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name +msgid "Name" +msgstr "İsim" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__need_validation +msgid "Need Validation" +msgstr "Doğrulama Gerekiyor" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "New Tier Validation" +msgstr "Yeni Seviye Doğrulama" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "Sonraki İnceleme" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "Next: %s" +msgstr "Sonraki: %s" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +msgid "No reviews to do." +msgstr "Yapacak inceleme yok." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "Notify Reviewers on Accepted" +msgstr "Kabul Edilenleri İnceleyicilere Bildir" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "İncelemeleri Oluşturma Hakkında Bilgilendir" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "Notify Reviewers on Rejected" +msgstr "Red Edilenleri İnceleyicilere Bildir" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "Notify Reviewers on Restarted" +msgstr "Yeniden Başlatmayı İnceleyicilere Bildir" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_pending +msgid "Notify Reviewers on reaching Pending" +msgstr "Bekleme Durumuna ulaştıklarında İnceleyicilere Bildir" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" +"Bekleyen doğrulamayı hatırlatmak için bir mesajın gönderilmesi gereken gün " +"sayısı (0 = hatırlatma yok)" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +msgstr "" +"Oluşturulduktan sonra, kayıt sırasında hangi alanların düzenlenebilir " +"olmasını istediğinize karar verebilirsiniz:" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" +"Gözden geçirenleri almak ve belgeleri bulmak için python formülünü kullanma " +"seçeneği" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__pending +msgid "Pending" +msgstr "Bekleyen" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "Referans Model" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "Reddet" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__rejected +msgid "Rejected" +msgstr "Reddedildi" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected_message +msgid "Rejected Message" +msgstr "Reddedilen Mesaj" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__res_id +msgid "Related Document ID" +msgstr "İlgili Belge ID" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__model +msgid "Related Document Model" +msgstr "İlgili Belge Modeli" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Request Validation" +msgstr "Doğrulama İste" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__requested_by +msgid "Requested By" +msgstr "İsteyen" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Requested by" +msgstr "İsteyen" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +msgid "Res" +msgstr "Temsilci" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +msgid "Res Model" +msgstr "Res Model" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Restart Validation" +msgstr "Yeniden Doğrulama İste" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "İncele" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_id +msgid "Reviewer" +msgstr "İnceleyen" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "İnceleme alanı" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "İnceleme grubu" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "İnceleyenler" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +msgid "Reviews" +msgstr "İncelemeler" + +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "Katman İnceleme Hatırlatıcısı Gönder" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "Bekleyen incelemelerle ilgili hatırlatma mesajı gönder" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +msgid "Sequence" +msgstr "Sıra" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "Belirli kullanıcı" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +msgid "Status" +msgstr "Durumu" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "The review has been reset by %s." +msgstr "İnceleme %s tarafından sıfırlandı." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" +"Please request a validation." +msgstr "" +"Bu eylemin en az bir kayıt için doğrulanması gerekir. İnceleme bekliyor:\n" +" - %s \n" +"Lütfen doğrulama isteğinde bulunun." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +msgid "Tier" +msgstr "Seviye" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "Seviye Tanımı" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "Seviye Formülü" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "Seviye İncelemesi" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "Katman Doğrulama" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "Seviye Doğrulaması (özet)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +msgid "Tier Validation Accepted Notification" +msgstr "Seviye Doğrulama Kabul Bildirimi" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_validation_exception_action +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_validation_exception +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_form +msgid "Tier Validation Exception" +msgstr "Katman Doğrulama İstisnası" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation_exception +msgid "Tier Validation Exceptions" +msgstr "Katman Doğrulama İstisnaları" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +msgid "Tier Validation Rejected Notification" +msgstr "Seviye Doğrulaması Reddedildi Bildirimi" + +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "Katman Doğrulama Hatırlatıcısı" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "Seviye Doğrulaması İstendi" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "Seviye Doğrulaması Yeniden Başlatıldı" + +#. module: base_tier_validation +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_confirmation +msgid "Tier Validations" +msgstr "Seviye Doğrulamaları" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__to_validate_message +msgid "To Validate Message" +msgstr "Mesajı Doğrulamak İçin" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__todo_by +msgid "Todo By" +msgstr "Yapılacak" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Todo by" +msgstr "Yapılacak" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "User" +msgstr "Kullanıcı" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__valid_model_field_ids +msgid "Valid Model Field" +msgstr "Geçerli Model Alanı" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__valid_reviewer_field_ids +msgid "Valid Reviewer Field" +msgstr "Geçerli İnceleme Alanı" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Validate" +msgstr "Doğrula" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "Reddetmeyi Doğrula" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__validated +msgid "Validated" +msgstr "Doğrulandı" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated_message +msgid "Validated Message" +msgstr "Doğrulanmış Mesaj" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__review_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__review_type +msgid "Validated by" +msgstr "Doğrulayan" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +msgid "Validation Date" +msgstr "Doğrulama Tarihi" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_formated_date +msgid "Validation Formated Date" +msgstr "Doğrulama Format Tarihi" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validation_status +msgid "Validation Status" +msgstr "Doğrulama Durumu" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "Doğrulama gözden geçiren alanı uygun türde olmalıdır" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +msgstr "Doğrulamalar" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__waiting +msgid "Waiting" +msgstr "Bekleyenler" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__no +msgid "Without validation" +msgstr "Doğrulama olmadan" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_after_validation +msgid "Write after Validation" +msgstr "Doğrulamadan sonra Yaz" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write after validation" +msgstr "Doğrulamadan sonra yaz" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_under_validation +msgid "Write under Validation" +msgstr "Doğrulama esnasında Yaz" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write under validation" +msgstr "Doğrulama esnasında yaz" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" +"Doğrulamadan sonra bu alanları yazmanıza izin verilmez.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Yalnızca bu alanlar değiştirilebilir:\n" +"- %(allowed_fields_str)s" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" +"Doğrulamadan sonra bu alanları yazmanıza izin verilmez.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Yalnızca bu alanlar değiştirilebilir:\n" +"- %(allowed_fields_str)s" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "e.g. Tier Validation for..." +msgstr "ör. Şunun için Seviye Doğrulaması..." + +#~ msgid "There are no res.users in the selected field" +#~ msgstr "Seçili alanda res.kullanıcı yok" + +#, python-format +#~ msgid "Activity" +#~ msgstr "Aktivite" + +#, python-format +#~ msgid "Operation has been rejected." +#~ msgstr "İşlem reddedildi." + +#, python-format +#~ msgid "Operation has been validated!" +#~ msgstr "İşlem doğrulandı!" + +#, python-format +#~ msgid "This %s needs to be validated" +#~ msgstr "Bu %s 'nin doğrulanması gerekiyor" + +#, python-format +#~ msgid "" +#~ "This action needs to be validated for at least one record. \n" +#~ "Please request a validation." +#~ msgstr "" +#~ "Bu eylemin en az bir kayıt için doğrulanması gerekir.\n" +#~ "Lütfen doğrulama isteğinde bulunun." + +#, python-format +#~ msgid "The operation is under validation." +#~ msgstr "İşlem doğrulama aşamasındadır." + +#~ msgid "" +#~ "\n" +#~ " This Record needs to be\n" +#~ " validated." +#~ msgstr "" +#~ "\n" +#~ " Bu kaydın olması gerekiyor\n" +#~ " doğrulandı." + +#~ msgid "" +#~ "\n" +#~ " Operation has been\n" +#~ " rejected\n" +#~ " ." +#~ msgstr "" +#~ "\n" +#~ " operasyon yapıldı\n" +#~ " reddedildi\n" +#~ " ." + +#~ msgid "" +#~ "\n" +#~ " Operation has been\n" +#~ " validated\n" +#~ " !" +#~ msgstr "" +#~ "\n" +#~ " operasyon yapıldı\n" +#~ " doğrulandı\n" +#~ " !" + +#, python-format +#~ msgid "0 Pending" +#~ msgstr "0 Bekleyen" + +#~ msgid "Last Modified on" +#~ msgstr "Son Düzenleme" diff --git a/base_tier_validation/i18n/vi_VN.po b/base_tier_validation/i18n/vi_VN.po new file mode 100644 index 00000000..99e64c83 --- /dev/null +++ b/base_tier_validation/i18n/vi_VN.po @@ -0,0 +1,897 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-04-04 12:06+0000\n" +"Last-Translator: ductdm \n" +"Language-Team: none\n" +"Language: vi_VN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.10.2\n" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" +"\n" +" Bản ghi này cần được\n" +" xác thực." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" rejected\n" +" ." +msgstr "" +"\n" +" Hoạt động đã bị\n" +" từ chối\n" +" ." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" validated\n" +" !" +msgstr "" +"\n" +" Hoạt động này đã được\n" +" xác thực\n" +" !" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "Tên" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Bypass, if previous tier was validated by same reviewer" +msgstr "" +"Bỏ qua, nếu cấp độ trước đó đã được xác thực bởi cùng một người xem " +"xét" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A record to be reviewed has been created by %s." +msgstr "Một bản ghi cần được xem xét đã được tạo bởi %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "A review has been requested %s days ago." +msgstr "Một yêu cầu xem xét đã được tạo %s ngày trước." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review has been requested by %s." +msgstr "Một yêu cầu xem xét đã được tạo bởi %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted" +msgstr "Yêu cầu xem xét đã được chấp nhận" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted. (%s)" +msgstr "Yêu cầu xem xét đã được chấp nhận. (%s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "Yêu cầu xem xét đã bị từ chối bởi %(user)s. (%(comment)s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %s." +msgstr "Yêu cầu xem xét đã bị từ chối bởi %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A validation process is still open for at least one record." +msgstr "Quá trình xác thực vẫn mở cho ít nhất một bản ghi." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "All" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Allowed groups to use this Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__group +msgid "Any user in a specific group" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Apply On" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "Approve Sequence Bypass" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence +msgid "Approve by sequence" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__approved +msgid "Approved" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Archived" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation_exception.py:0 +msgid "" +"At least one of these fields must be checked! Write under Validation, Write " +"after Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "" +"Bypassed (auto validated), if previous tier was validated by same reviewer" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__can_review +msgid "Can Review" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Comment" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment +msgid "Comments" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__company_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Company" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "Create a new Validation Exception!" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_uid +msgid "Created by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_date +msgid "Created on" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +msgid "Description" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__display_name +msgid "Display Name" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_status +msgid "Display Status" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__definition_type__domain +msgid "Domain" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__done_by +msgid "Done By" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Done by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__field_ids +msgid "Fields" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Group %s" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Groups" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__hide_reviews +msgid "Hide Reviews" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__id +msgid "ID" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation__has_comment +msgid "If set, Allow the reviewer to leave a comment on the review." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_pending +msgid "" +"If set, all possible reviewers will be notified by email when this status is " +"reached.Usefull in an Approve by sequence scenario. An notification request " +"to review is sent out when it's their turn to review." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is accepted." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is rejected." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "" +"If set, reviewers will be notified by email when a reviews related to this " +"definition are restarted." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's fully validated" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's in the validation process" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_date +msgid "Last Updated on" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Model" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +msgid "Model Name" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name +msgid "Name" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__need_validation +msgid "Need Validation" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "New Tier Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "Next: %s" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +msgid "No reviews to do." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "Notify Reviewers on Accepted" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "Notify Reviewers on Rejected" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "Notify Reviewers on Restarted" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_pending +msgid "Notify Reviewers on reaching Pending" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__pending +msgid "Pending" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__rejected +msgid "Rejected" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected_message +msgid "Rejected Message" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__res_id +msgid "Related Document ID" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__model +msgid "Related Document Model" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Request Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__requested_by +msgid "Requested By" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Requested by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +msgid "Res" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +msgid "Res Model" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Restart Validation" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_id +msgid "Reviewer" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +msgid "Reviews" +msgstr "" + +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +msgid "Sequence" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +msgid "Status" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "The review has been reset by %s." +msgstr "Đánh giá đã được thiết lập lại bởi %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" +"Please request a validation." +msgstr "" +"Hành động này cần được xác thực cho ít nhất một bản ghi. Đang chờ đánh giá:\n" +" - %s \n" +"Please request a validation." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +msgid "Tier" +msgstr "" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +msgid "Tier Validation Accepted Notification" +msgstr "" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_validation_exception_action +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_validation_exception +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_form +msgid "Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation_exception +msgid "Tier Validation Exceptions" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +msgid "Tier Validation Rejected Notification" +msgstr "" + +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "" + +#. module: base_tier_validation +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_confirmation +msgid "Tier Validations" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__to_validate_message +msgid "To Validate Message" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__todo_by +msgid "Todo By" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Todo by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "User" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__valid_model_field_ids +msgid "Valid Model Field" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__valid_reviewer_field_ids +msgid "Valid Reviewer Field" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Validate" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__validated +msgid "Validated" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated_message +msgid "Validated Message" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__review_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__review_type +msgid "Validated by" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +msgid "Validation Date" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_formated_date +msgid "Validation Formated Date" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validation_status +msgid "Validation Status" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__waiting +msgid "Waiting" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__no +msgid "Without validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_after_validation +msgid "Write after Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write after validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_under_validation +msgid "Write under Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write under validation" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "e.g. Tier Validation for..." +msgstr "" diff --git a/base_tier_validation/i18n/zh_CN.po b/base_tier_validation/i18n/zh_CN.po new file mode 100644 index 00000000..21f90865 --- /dev/null +++ b/base_tier_validation/i18n/zh_CN.po @@ -0,0 +1,927 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-09-24 18:00+0000\n" +"Last-Translator: Dong \n" +"Language-Team: none\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 3.10\n" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" rejected\n" +" ." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" validated\n" +" !" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "名称" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Bypass, if previous tier was validated by same reviewer" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A record to be reviewed has been created by %s." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "A review has been requested %s days ago." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review has been requested by %s." +msgstr "%s 发起审批请求。" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted" +msgstr "审批已通过" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted. (%s)" +msgstr "审批已通过。 ( %s )" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %s." +msgstr "%s 驳回了审批。" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A validation process is still open for at least one record." +msgstr "当前记录存在待批复的审批流程。" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "有效" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "All" +msgstr "所有" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Allowed groups to use this Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__group +msgid "Any user in a specific group" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Apply On" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "审批按指定序号排序" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "Approve Sequence Bypass" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence +msgid "Approve by sequence" +msgstr "按顺序审批" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__approved +msgid "Approved" +msgstr "已批准" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Archived" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation_exception.py:0 +msgid "" +"At least one of these fields must be checked! Write under Validation, Write " +"after Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "" +"Bypassed (auto validated), if previous tier was validated by same reviewer" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__can_review +msgid "Can Review" +msgstr "可审批" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "取消" + +#. module: base_tier_validation +#. odoo-javascript +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Comment" +msgstr "审批意见" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "审批意见向导" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment +msgid "Comments" +msgstr "审批意见" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__company_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Company" +msgstr "公司" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "Create a new Validation Exception!" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_uid +msgid "Created by" +msgstr "创建人" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_date +msgid "Created on" +msgstr "创建时间" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "定义类型" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "定义域" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +msgid "Description" +msgstr "说明" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__display_name +msgid "Display Name" +msgstr "显示名称" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_status +msgid "Display Status" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__definition_type__domain +msgid "Domain" +msgstr "域" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__done_by +msgid "Done By" +msgstr "审批人" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Done by" +msgstr "审批人" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__field_ids +msgid "Fields" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Group %s" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "分组" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Groups" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "含审批意见" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__hide_reviews +msgid "Hide Reviews" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__id +msgid "ID" +msgstr "ID" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation__has_comment +msgid "If set, Allow the reviewer to leave a comment on the review." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "如果设置,则触发此定义规则时将通过电子邮件通知所有的审批人。" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_pending +msgid "" +"If set, all possible reviewers will be notified by email when this status is " +"reached.Usefull in an Approve by sequence scenario. An notification request " +"to review is sent out when it's their turn to review." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is accepted." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is rejected." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "" +"If set, reviewers will be notified by email when a reviews related to this " +"definition are restarted." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's fully validated" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's in the validation process" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_uid +msgid "Last Updated by" +msgstr "最近更新人" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_date +msgid "Last Updated on" +msgstr "最近更新时间" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Model" +msgstr "模型" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +msgid "Model Name" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name +msgid "Name" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__need_validation +msgid "Need Validation" +msgstr "需要审批" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "New Tier Validation" +msgstr "新建多层级审批" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "Next: %s" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +msgid "No reviews to do." +msgstr "没有待审批的项目。" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "Notify Reviewers on Accepted" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "创建时通知审批人" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "Notify Reviewers on Rejected" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "Notify Reviewers on Restarted" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_pending +msgid "Notify Reviewers on reaching Pending" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__pending +msgid "Pending" +msgstr "待审批" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "引用模型" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__rejected +msgid "Rejected" +msgstr "已驳回" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected_message +msgid "Rejected Message" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__res_id +msgid "Related Document ID" +msgstr "关联文档 ID" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__model +msgid "Related Document Model" +msgstr "关联文档模型" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Request Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__requested_by +msgid "Requested By" +msgstr "发起人" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Requested by" +msgstr "发起人" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +msgid "Res" +msgstr "资源" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +msgid "Res Model" +msgstr "资源模型" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Restart Validation" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "审批" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_id +msgid "Reviewer" +msgstr "审批人" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "审批组" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "审批者" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +msgid "Reviews" +msgstr "审批" + +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +msgid "Sequence" +msgstr "序号" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "指定用户" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +msgid "Status" +msgstr "状态" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "The review has been reset by %s." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" +"Please request a validation." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +msgid "Tier" +msgstr "层级" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "层级定义" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "多层级审批" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "多层级审批(抽象)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +#, fuzzy +msgid "Tier Validation Accepted Notification" +msgstr "多层级审批(抽象)" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_validation_exception_action +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_validation_exception +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_form +msgid "Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation_exception +msgid "Tier Validation Exceptions" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +#, fuzzy +msgid "Tier Validation Rejected Notification" +msgstr "多层级审批(抽象)" + +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "" + +#. module: base_tier_validation +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_confirmation +msgid "Tier Validations" +msgstr "多层级审批" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__to_validate_message +msgid "To Validate Message" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__todo_by +msgid "Todo By" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Todo by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "User" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__valid_model_field_ids +msgid "Valid Model Field" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__valid_reviewer_field_ids +msgid "Valid Reviewer Field" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Validate" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "驳回" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__validated +msgid "Validated" +msgstr "已批准" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated_message +msgid "Validated Message" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__review_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__review_type +msgid "Validated by" +msgstr "审批人" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +msgid "Validation Date" +msgstr "审批日期" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_formated_date +msgid "Validation Formated Date" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validation_status +msgid "Validation Status" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +msgstr "审批" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__waiting +msgid "Waiting" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__no +msgid "Without validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_after_validation +msgid "Write after Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write after validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_under_validation +msgid "Write under Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write under validation" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "e.g. Tier Validation for..." +msgstr "例如:审批层级用于..." + +#, python-format +#~ msgid "" +#~ "This action needs to be validated for at least one record. \n" +#~ "Please request a validation." +#~ msgstr "" +#~ "此操作需要至少对一条记录进行审批。\n" +#~ "请发起审批申请。" + +#, python-format +#~ msgid "The operation is under validation." +#~ msgstr "该操作正在审批中。" + +#, python-format +#~ msgid "0 Pending" +#~ msgstr "0 待审批" + +#~ msgid "Last Modified on" +#~ msgstr "最近修改时间" + +#, python-format +#~ msgid "Activities" +#~ msgstr "活动项目" + +#~ msgid "Users" +#~ msgstr "用户" + +#~ msgid "A review was rejected by {}. ({})" +#~ msgstr "{} 驳回了审批。 ( {} )" + +#~ msgid "Any user in a specific group." +#~ msgstr "指定权限组" + +#~ msgid "Object" +#~ msgstr "对象" + +#~ msgid "Approve Sequence" +#~ msgstr "批准顺序" + +#~ msgid "Formula" +#~ msgstr "公式" + +#~ msgid "Python Expression" +#~ msgstr "Python表达式" diff --git a/base_tier_validation/migrations/18.0.2.1.0/pre-migration.py b/base_tier_validation/migrations/18.0.2.1.0/pre-migration.py new file mode 100644 index 00000000..23721254 --- /dev/null +++ b/base_tier_validation/migrations/18.0.2.1.0/pre-migration.py @@ -0,0 +1,82 @@ +# Copyright 2025 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openupgradelib import openupgrade + + +@openupgrade.migrate() +def migrate(cr, version): + # Workaround to execute the migration script without errors + # see https://github.com/odoo/odoo/blob/2a839ef1ed09c36f27ce7536ca3052d9f65ceed9/odoo/modules/migration.py#L252-L256 + env = cr + env.cr.execute( + """ + SELECT imf.model + FROM ir_model_fields AS imf + WHERE imf.name = 'review_ids' + AND imf.ttype = 'one2many' + AND imf.model != 'tier.validation' + """ + ) + for (model_name,) in env.cr.fetchall(): + table_name = model_name.replace(".", "_") + # validation_status column + if not openupgrade.column_exists(env.cr, table_name, "validation_status"): + openupgrade.logged_query( + env.cr, + f""" + ALTER TABLE {table_name} + ADD COLUMN IF NOT EXISTS validation_status VARCHAR + """, + ) + openupgrade.logged_query( + env.cr, + f""" + UPDATE {table_name} SET validation_status = 'no' + """, + ) + openupgrade.logged_query( + env.cr, + f""" + UPDATE {table_name} SET validation_status = 'rejected' + WHERE validation_status = 'no' AND id IN ( + SELECT DISTINCT(tr.res_id) + FROM tier_review AS tr + WHERE tr.model = '{model_name}' AND tr.status = 'rejected' + ) + """, + ) + openupgrade.logged_query( + env.cr, + f""" + UPDATE {table_name} SET validation_status = 'pending' + WHERE validation_status = 'no' AND id IN ( + SELECT DISTINCT(tr.res_id) + FROM tier_review AS tr + WHERE tr.model = '{model_name}' AND tr.status = 'pending' + ) + """, + ) + openupgrade.logged_query( + env.cr, + f""" + UPDATE {table_name} SET validation_status = 'waiting' + WHERE validation_status = 'no' AND id IN ( + SELECT DISTINCT(tr.res_id) + FROM tier_review AS tr + WHERE tr.model = '{model_name}' AND tr.status = 'waiting' + ) + """, + ) + openupgrade.logged_query( + env.cr, + f""" + UPDATE {table_name} SET validation_status = 'validated' + WHERE validation_status = 'no' AND id IN ( + SELECT DISTINCT(tr.res_id) + FROM tier_review AS tr + WHERE tr.model = '{model_name}' + AND tr.status IN ('approved', 'forwarded') + ) + """, + ) diff --git a/base_tier_validation/models/__init__.py b/base_tier_validation/models/__init__.py new file mode 100644 index 00000000..5cf03dbb --- /dev/null +++ b/base_tier_validation/models/__init__.py @@ -0,0 +1,8 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import tier_definition +from . import tier_validation_exception +from . import tier_review +from . import tier_validation +from . import res_users +from . import res_config_settings diff --git a/base_tier_validation/models/res_config_settings.py b/base_tier_validation/models/res_config_settings.py new file mode 100644 index 00000000..6ca8844a --- /dev/null +++ b/base_tier_validation/models/res_config_settings.py @@ -0,0 +1,14 @@ +# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + # Activate me back when modules are migrated + + module_base_tier_validation_formula = fields.Boolean(string="Tier Formula") + # module_base_tier_validation_forward = fields.Boolean("Tier Forward & Backward") + # module_base_tier_validation_server_action = fields.Boolean("Tier Server Action") + # module_base_tier_validation_report = fields.Boolean("Tier Reports") diff --git a/base_tier_validation/models/res_users.py b/base_tier_validation/models/res_users.py new file mode 100644 index 00000000..8415a82e --- /dev/null +++ b/base_tier_validation/models/res_users.py @@ -0,0 +1,55 @@ +# 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 = {} + user = self.env.user + domain = [ + ("status", "=", "pending"), + ("can_review", "=", True), + ("id", "in", user.review_ids.ids), + ] + review_groups = self.env["tier.review"]._read_group( + domain=domain, + groupby=["model"], + aggregates=["id:recordset"], + ) + for model, tier_review in review_groups: + Model = self.env[model] + # Skip Models not having Tier Validation enabled (example: was unistalled) + if tier_review and hasattr(Model, "can_review"): + records_domain = [ + ("id", "in", tier_review.mapped("res_id")), + ("validation_status", "!=", "rejected"), + ("can_review", "=", True), + ] + records = ( + Model.with_user(user) + .with_context(active_test=False) + .search(records_domain) + ) + # Excludes any cancelled records depending on the structure of the model + if Model._state_field in Model._fields: + records = records.filtered( + lambda x: x[x._state_field] != x._cancel_state + ) + if records: + user_reviews[model] = { + "id": records[0].id, + "name": Model._description, + "model": model, + "active_field": "active" in Model._fields, + "icon": modules.module.get_module_icon(Model._original_module), + "type": "tier_review", + "pending_count": len(records), + } + return list(user_reviews.values()) diff --git a/base_tier_validation/models/tier_definition.py b/base_tier_validation/models/tier_definition.py new file mode 100644 index 00000000..7bd7c394 --- /dev/null +++ b/base_tier_validation/models/tier_definition.py @@ -0,0 +1,166 @@ +# 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 self.env._("New Tier Validation") + + @api.model + def _get_tier_validation_model_names(self): + res = [] + return res + + name = fields.Char( + string="Description", + required=True, + default=lambda self: self._get_default_name(), + translate=True, + ) + model_id = fields.Many2one( + comodel_name="ir.model", + string="Referenced Model", + domain=lambda self: [("model", "in", self._get_tier_validation_model_names())], + ) + model = fields.Char(related="model_id.model", index=True, store=True) + review_type = fields.Selection( + string="Validated by", + default="individual", + selection=[ + ("individual", "Specific user"), + ("group", "Any user in a specific group"), + ("field", "Field in related record"), + ], + ) + allow_write_for_reviewer = fields.Boolean( + string="Allow Write For Reviewers", + default=False, + ) + reviewer_id = fields.Many2one(comodel_name="res.users", string="Reviewer") + reviewer_group_id = fields.Many2one( + comodel_name="res.groups", string="Reviewer group" + ) + reviewer_field_id = fields.Many2one( + comodel_name="ir.model.fields", + string="Reviewer field", + domain="[('id', 'in', valid_reviewer_field_ids)]", + ) + valid_reviewer_field_ids = fields.One2many( + comodel_name="ir.model.fields", + compute="_compute_domain_reviewer_field", + ) + definition_type = fields.Selection( + string="Definition", selection=[("domain", "Domain")], default="domain" + ) + definition_domain = fields.Char() + active = fields.Boolean(default=True) + sequence = fields.Integer(default=30) + company_id = fields.Many2one( + comodel_name="res.company", + string="Company", + default=lambda self: self.env.company, + ) + notify_on_create = fields.Boolean( + string="Notify Reviewers on Creation", + help="If set, all possible reviewers will be notified by email when " + "this definition is triggered.", + ) + notify_on_pending = fields.Boolean( + string="Notify Reviewers on reaching Pending", + help="If set, all possible reviewers will be notified by email when " + "this status is reached." + "Usefull in an Approve by sequence scenario. " + "An notification request to review is sent out when it's their turn to review.", + ) + notify_on_accepted = fields.Boolean( + string="Notify Reviewers on Accepted", + help="If set, reviewers will be notified by email when a review related " + "to this definition is accepted.", + ) + notify_on_rejected = fields.Boolean( + string="Notify Reviewers on Rejected", + help="If set, reviewers will be notified by email when a review related " + "to this definition is rejected.", + ) + notify_on_restarted = fields.Boolean( + string="Notify Reviewers on Restarted", + help="If set, reviewers will be notified by email when a reviews related " + "to this definition are restarted.", + ) + has_comment = fields.Boolean(string="Comment", default=False) + notify_reminder_delay = fields.Integer( + string="Send reminder message on pending reviews", + help="Number of days after which a message must be posted to remind about " + "pending validation (0 = no reminder)", + ) + approve_sequence = fields.Boolean( + string="Approve by sequence", + default=False, + help="Approval order by the specified sequence number", + ) + approve_sequence_bypass = fields.Boolean( + help="Bypassed (auto validated), if previous tier was validated " + "by same reviewer", + ) + + @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): + models = self.mapped("model") + IrModelFields = self.env["ir.model.fields"].sudo() + valid_reviewer_fields = dict( + IrModelFields._read_group( + domain=[ + ("model", "in", models), + "|", + ("relation", "=", "res.users"), + ("relation", "=", "res.groups"), + ], + groupby=["model"], + aggregates=["id:array_agg"], + ) + ) + for rec in self: + rec.valid_reviewer_field_ids = valid_reviewer_fields.get( + rec.model, IrModelFields + ) + + def _get_review_needing_reminder(self): + """Return all the reviews that have the reminder setup.""" + self.ensure_one() + if not self.notify_reminder_delay: + return self.env["tier.review"] + review_date = fields.Datetime.subtract( + fields.Datetime.now(), days=self.notify_reminder_delay + ) + return self.env["tier.review"].search( + [ + ("definition_id", "=", self.id), + ("status", "in", ["waiting", "pending"]), + "|", + "&", + ("create_date", "<", review_date), + ("last_reminder_date", "=", False), + ("last_reminder_date", "<", review_date), + ], + limit=1, + ) + + def _cron_send_review_reminder(self): + definition_with_reminder = self.env["tier.definition"].search( + [("notify_reminder_delay", ">", 0)] + ) + for record in definition_with_reminder: + review_to_remind = record._get_review_needing_reminder() + if review_to_remind: + review_to_remind._send_review_reminder() diff --git a/base_tier_validation/models/tier_review.py b/base_tier_validation/models/tier_review.py new file mode 100644 index 00000000..644189cf --- /dev/null +++ b/base_tier_validation/models/tier_review.py @@ -0,0 +1,208 @@ +# Copyright 2017-19 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import logging + +import pytz + +from odoo import api, fields, models +from odoo.exceptions import ValidationError + +_logger = logging.getLogger(__name__) + + +class TierReview(models.Model): + _name = "tier.review" + _description = "Tier Review" + + name = fields.Char(related="definition_id.name") + status = fields.Selection( + [ + ("waiting", "Waiting"), + ("pending", "Pending"), + ("rejected", "Rejected"), + ("approved", "Approved"), + ], + default="waiting", + ) + model = fields.Char(string="Related Document Model", index=True) + res_id = fields.Many2oneReference( + string="Related Document ID", + index=True, + model_field="model", + ) + definition_id = fields.Many2one(comodel_name="tier.definition") + company_id = fields.Many2one( + related="definition_id.company_id", + store=True, + ) + review_type = fields.Selection(related="definition_id.review_type") + reviewer_id = fields.Many2one(related="definition_id.reviewer_id") + reviewer_group_id = fields.Many2one(related="definition_id.reviewer_group_id") + reviewer_field_id = fields.Many2one(related="definition_id.reviewer_field_id") + reviewer_ids = fields.Many2many( + string="Reviewers", + comodel_name="res.users", + compute="_compute_reviewer_ids", + store=True, + ) + display_status = fields.Char(compute="_compute_display_status") + sequence = fields.Integer(string="Tier") + todo_by = fields.Char(compute="_compute_todo_by", store=True) + done_by = fields.Many2one(comodel_name="res.users") + requested_by = fields.Many2one(comodel_name="res.users") + reviewed_date = fields.Datetime(string="Validation Date") + reviewed_formated_date = fields.Char( + string="Validation Formated Date", compute="_compute_reviewed_formated_date" + ) + has_comment = fields.Boolean(related="definition_id.has_comment") + comment = fields.Char(string="Comments") + can_review = fields.Boolean( + compute="_compute_can_review", + store=True, + help="""Can review will be marked if the review is pending and the + approve sequence has been achieved""", + ) + approve_sequence = fields.Boolean(related="definition_id.approve_sequence") + approve_sequence_bypass = fields.Boolean( + related="definition_id.approve_sequence_bypass" + ) + last_reminder_date = fields.Datetime(readonly=True) + + @api.depends("status") + def _compute_display_status(self): + """ + Compute the display status based on the current status value to get the + translated status value. + """ + selection = self.fields_get(["status"])["status"]["selection"] + selection_dict = dict(selection) + for record in self: + record.display_status = selection_dict[record.status] + + @api.depends_context("tz") + def _compute_reviewed_formated_date(self): + timezone = self._context.get("tz") or self.env.user.partner_id.tz or "UTC" + for review in self: + if not review.reviewed_date: + review.reviewed_formated_date = False + continue + reviewed_date_utc = pytz.timezone("UTC").localize(review.reviewed_date) + reviewed_date_tz = reviewed_date_utc.astimezone(pytz.timezone(timezone)) + review.reviewed_formated_date = reviewed_date_tz.replace(tzinfo=None) + + @api.depends("definition_id.approve_sequence") + def _compute_can_review(self): + reviews = self.filtered(lambda rev: rev.status in ["waiting", "pending"]) + if reviews: + # get minimum sequence of all to prevent jumps + next_seq = min(reviews.mapped("sequence")) + for record in reviews: + # if approve by sequence, check sequence has been reached + if record.approve_sequence: + if record.sequence == next_seq: + record.status = "pending" + # if there is no approval sequence go directly to pending state + elif not record.approve_sequence: + record.status = "pending" + if record.status == "pending": + if record.definition_id.notify_on_pending: + record._notify_pending_status(record) + for record in self: + record.can_review = record._can_review_value() + + def _can_review_value(self): + if self.status not in ("pending", "waiting"): + return False + if not self.approve_sequence: + return True + resource = self.env[self.model].browse(self.res_id) + reviews = resource.review_ids.filtered(lambda r: r.status == "pending") + if not reviews: + return True + sequence = min(reviews.mapped("sequence")) + return self.sequence == sequence + + @api.model + def _get_reviewer_fields(self): + return ["reviewer_id", "reviewer_group_id", "reviewer_group_id.user_ids"] + + @api.depends(lambda self: self._get_reviewer_fields()) + def _compute_reviewer_ids(self): + for rec in self: + rec.reviewer_ids = rec._get_reviewers() + + @api.depends("reviewer_ids") + def _compute_todo_by(self): + """Show by group or by abbrev list of names""" + num_show = 3 # Max number of users to display + for rec in self: + todo_by = False + if rec.reviewer_group_id: + todo_by = self.env._("Group %s", rec.reviewer_group_id.name) + else: + todo_by = ", ".join(rec.reviewer_ids[:num_show].mapped("display_name")) + num_users = len(rec.reviewer_ids) + if num_users > num_show: + todo_by = f"{todo_by} (and {num_users - num_show} more)" + rec.todo_by = todo_by + + def _get_reviewers(self): + if self.reviewer_id or self.reviewer_group_id.user_ids: + return self.reviewer_id + self.reviewer_group_id.user_ids + 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 reviewer_field: + if reviewer_field._name == "res.groups": + return reviewer_field.users + elif reviewer_field._name == "res.users": + return reviewer_field + else: + raise ValidationError( + self.env._( + "Validation reviewer field " + "should be of the appropriate type" + ) + ) + return self.env["res.users"] + + def _notify_pending_status(self, review_ids): + """Method to call and reuse abstract notification method""" + resource = self.env[self.model].browse(self.res_id) + resource._notify_review_available(review_ids) + + def _get_reminder_notification_subtype(self): + return "base_tier_validation.mt_tier_validation_reminder" + + def _get_reminder_activity_type(self): + return "base_tier_validation.mail_act_tier_validation_reminder" + + def _notify_review_reminder_body(self): + delay = (fields.Datetime.now() - self.create_date).days + return self.env._("A review has been requested %s days ago.", delay) + + def _send_review_reminder(self): + record = self.env[self.model].browse(self.res_id) + # Only schedule activity if reviewer is a single user and model has activities + if len(self.reviewer_ids) == 1 and hasattr(record, "activity_ids"): + self._schedule_review_reminder_activity(record) + elif hasattr(record, "message_post"): + self._notify_review_reminder(record) + else: + msg = f"Could not send reminder for record {record}" + _logger.exception(msg) + self.last_reminder_date = fields.Datetime.now() + + def _notify_review_reminder(self, record): + record.message_post( + subtype_xmlid=self._get_reminder_notification_subtype(), + body=self._notify_review_reminder_body(), + ) + + def _schedule_review_reminder_activity(self, record): + record.activity_schedule( + act_type_xmlid=self._get_reminder_activity_type(), + note=self._notify_review_reminder_body(), + user_id=self.reviewer_ids.id, + ) diff --git a/base_tier_validation/models/tier_validation.py b/base_tier_validation/models/tier_validation.py new file mode 100644 index 00000000..caa29d8d --- /dev/null +++ b/base_tier_validation/models/tier_validation.py @@ -0,0 +1,952 @@ +# Copyright 2017-19 ForgeFlow S.L. (https://www.forgeflow.com) +# Copyright 2024 Moduon Team (https://www.moduon.team) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from ast import literal_eval + +from lxml import etree +from psycopg2.extensions import AsIs +from odoo import api, fields, models +from odoo.exceptions import ValidationError +from odoo.tools import SQL +from odoo.tools.misc import frozendict + +BASE_EXCEPTION_FIELDS = [ + "message_follower_ids", + "access_token", + "message_main_attachment_id", +] + + +class TierValidation(models.AbstractModel): + _name = "tier.validation" + _description = "Tier Validation (abstract)" + + _tier_validation_buttons_xpath = "/form/header/button[last()]" + _tier_validation_manual_config = True + _tier_validation_state_field_is_computed = False + _tier_validation_company_field = "company_id" + + _state_field = "state" + _state_from = ["draft"] + _state_to = ["confirmed"] + _cancel_state = "cancel" + + review_ids = fields.One2many( + comodel_name="tier.review", + inverse_name="res_id", + string="Validations", + domain=lambda self: [("model", "=", self._name)], + auto_join=True, + ) + # TODO: Delete in v19 in favor of validation_status field + validated = fields.Boolean( + compute="_compute_validated_rejected", search="_search_validated" + ) + to_validate_message = fields.Html(compute="_compute_to_validate_message") + validated_message = fields.Html(compute="_compute_validated_message") + need_validation = fields.Boolean(compute="_compute_need_validation") + # TODO: Delete in v19 in favor of validation_status field + rejected = fields.Boolean( + compute="_compute_validated_rejected", search="_search_rejected" + ) + rejected_message = fields.Html(compute="_compute_rejected_message") + validation_status = fields.Selection( + selection=[ + ("no", "Without validation"), + ("waiting", "Waiting"), + ("pending", "Pending"), + ("rejected", "Rejected"), + ("validated", "Validated"), + ], + default="no", + compute="_compute_validation_status", + store=True, + ) + reviewer_ids = fields.Many2many( + string="Reviewers", + comodel_name="res.users", + compute="_compute_reviewer_ids", + search="_search_reviewer_ids", + ) + can_review = fields.Boolean( + compute="_compute_can_review", search="_search_can_review" + ) + has_comment = fields.Boolean( + compute="_compute_has_comment", + help="If set, Allow the reviewer to leave a comment on the review.", + ) + next_review = fields.Char(compute="_compute_next_review") + hide_reviews = fields.Boolean(compute="_compute_hide_reviews") + + def _compute_has_comment(self): + for rec in self: + has_comment = rec.review_ids.filtered( + lambda r: r.status in ("waiting", "pending") + and self.env.user in r.reviewer_ids + ).mapped("has_comment") + rec.has_comment = True in has_comment + + def _get_sequences_to_approve(self, user): + all_reviews = self.review_ids.filtered( + lambda r: r.status in ("waiting", "pending") + ) + my_reviews = all_reviews.filtered(lambda r: user in r.reviewer_ids) + # Include all my_reviews with approve_sequence = False + sequences = my_reviews.filtered(lambda r: not r.approve_sequence).mapped( + "sequence" + ) + # Include only my_reviews with approve_sequence = True + approve_sequences = my_reviews.filtered("approve_sequence").mapped("sequence") + if approve_sequences: + my_sequence = min(approve_sequences) + min_sequence = min(all_reviews.mapped("sequence")) + if my_sequence <= min_sequence: + sequences.append(my_sequence) + return sequences + + @api.depends_context("uid") + @api.depends("review_ids.status") + def _compute_can_review(self): + for rec in self: + rec.can_review = rec._get_sequences_to_approve(self.env.user) + + @api.model + def _search_can_review(self, operator, value): + domain = [ + ("review_ids.reviewer_ids", "=", self.env.user.id), + ("review_ids.status", "in", ["pending", "waiting"]), + ("review_ids.can_review", "=", True), + ("validation_status", "!=", "rejected"), + ] + if "active" in self._fields: + domain.append(("active", "in", [True, False])) + res_ids = self.search(domain).filtered("can_review").ids + return [("id", "in", res_ids)] + + @api.depends("review_ids") + def _compute_reviewer_ids(self): + for rec in self: + rec.reviewer_ids = rec.review_ids.filtered( + lambda r: r.status in ("waiting", "pending") + ).mapped("reviewer_ids") + + # TODO: delete in 19.0 migration in favor of validation_status field + @api.model + def _search_validated(self, operator, value): + assert operator in ("=", "!="), "Invalid domain operator" + assert value in (True, False), "Invalid domain value" + operator_equal = (operator == "=" and value) or (operator == "!=" and not value) + return [("validation_status", operator_equal and "=" or "!=", "validated")] + + # TODO: delete in 19.0 migration in favor of validation_status field + @api.model + def _search_rejected(self, operator, value): + assert operator in ("=", "!="), "Invalid domain operator" + assert value in (True, False), "Invalid domain value" + operator_equal = (operator == "=" and value) or (operator == "!=" and not value) + return [("validation_status", operator_equal and "=" or "!=", "rejected")] + + @api.model + def _search_reviewer_ids(self, operator, value): + model_operator = "in" + if operator == "=" and value in ("[]", False): + # Search for records that have not yet been through a validation + # process. + operator = "!=" + model_operator = "not in" + reviews = self.env["tier.review"].search( + [ + ("model", "=", self._name), + ("reviewer_ids", operator, value), + ("can_review", "=", True), + ] + ) + return [("id", model_operator, list(set(reviews.mapped("res_id"))))] + + def _get_to_validate_message_name(self): + return self._description + + def _get_to_validate_message(self): + return f""" {self.env._( + "This %s needs to be validated", + self._get_to_validate_message_name() + )}""" + + def _get_validated_message(self): + msg = f""" {self.env._( + "Operation has been validated!" + )}""" + return self.validation_status == "validated" and msg or "" + + def _get_rejected_message(self): + msg = f""" {self.env._( + "Operation has been rejected." + )}""" + return self.validation_status == "rejected" and msg or "" + + # TODO: delete in 19.0 migration in favor of validation_status field + @api.depends("validation_status") + def _compute_validated_rejected(self): + for rec in self: + for field in ("validated", "rejected"): + rec[field] = rec.validation_status == field + + @api.depends("validation_status") + def _compute_to_validate_message(self): + for rec in self: + rec.to_validate_message = rec._get_to_validate_message() + + def _validated_states(self): + """Override for different validation policy.""" + return ["approved"] + + @api.depends("validation_status") + def _compute_validated_message(self): + for rec in self: + rec.validated_message = rec._get_validated_message() + + def _rejected_states(self): + """Override for different rejected policy.""" + return ["rejected"] + + @api.depends("validation_status") + def _compute_rejected_message(self): + for rec in self: + rec.rejected_message = rec._get_rejected_message() + + @api.depends("review_ids", "review_ids.status") + def _compute_validation_status(self): + validated_states = self._validated_states() + rejected_states = self._rejected_states() + for item in self: + reviews = item.review_ids + any_rejected = any(reviews.filtered(lambda x: x.status in rejected_states)) + any_pending = any(reviews.filtered(lambda x: x.status == "pending")) + any_waiting = any(item.review_ids.filtered(lambda x: x.status == "waiting")) + if reviews and all(x.status in validated_states for x in reviews): + item.validation_status = "validated" + elif any_rejected: + item.validation_status = "rejected" + elif any_pending: + item.validation_status = "pending" + elif any_waiting: + item.validation_status = "waiting" + else: + item.validation_status = "no" + + def _compute_next_review(self): + for rec in self: + review = rec.review_ids.sorted("sequence").filtered( + lambda x: x.status == "pending" + )[:1] + rec.next_review = review and self.env._("Next: %s", review.name or "") + + def _compute_hide_reviews(self): + for rec in self: + rec.hide_reviews = rec[self._state_field] not in self._state_from + + def _compute_need_validation(self): + for rec in self: + if isinstance(rec.id, api.NewId): + rec.need_validation = False + continue + tiers = ( + self.env["tier.definition"] + .with_context(active_test=True) + .search( + [ + ("model", "=", self._name), + ("company_id", "in", [False] + rec._get_company().ids), + ] + ) + ) + valid_tiers = any([rec.evaluate_tier(tier) for tier in tiers]) + rec.need_validation = ( + not rec.review_ids and valid_tiers and rec._check_state_from_condition() + ) + + def evaluate_tier(self, tier): + if tier.definition_domain: + domain = literal_eval(tier.definition_domain) + return self.filtered_domain(domain) + else: + return self + + @api.model + def _get_validation_exceptions(self, extra_domain=None, add_base_exceptions=True): + """Return Tier Validation Exception field names that matchs custom domain.""" + exception_fields = ( + self.env["tier.validation.exception"] + .sudo() + .search( + [ + ("model_name", "=", self._name), + ("company_id", "in", [False] + self._get_company().ids), + "|", + ("group_ids", "in", self.env.user.group_ids.ids), + ("group_ids", "=", False), + *(extra_domain or []), + ] + ) + .mapped("field_ids.name") + ) + if add_base_exceptions: + exception_fields += BASE_EXCEPTION_FIELDS + return list(set(exception_fields)) + + @api.model + def _get_all_validation_exceptions(self): + """Extend for more field exceptions to be written when on the entire + validation process.""" + return self._get_validation_exceptions() + + @api.model + def _get_under_validation_exceptions(self): + """Extend for more field exceptions to be written under validation.""" + return self._get_validation_exceptions( + extra_domain=[("allowed_to_write_under_validation", "=", True)] + ) + + @api.model + def _get_after_validation_exceptions(self): + """Extend for more field exceptions to be written after validation.""" + return self._get_validation_exceptions( + extra_domain=[("allowed_to_write_after_validation", "=", True)] + ) + + def _check_allow_write_under_validation(self, vals): + """Allow to add exceptions for fields that are allowed to be written + or for reviewers for all fields, even when the record is under + validation.""" + if ( + all(self.review_ids.mapped("definition_id.allow_write_for_reviewer")) + and self.env.user in self.reviewer_ids + ): + return True + exceptions = self._get_under_validation_exceptions() + for val in vals: + if val not in exceptions: + return False + return True + + def _check_allow_write_after_validation(self, vals): + """Allow to add exceptions for fields that are allowed to be written + even when the record is after validation.""" + exceptions = self._get_after_validation_exceptions() + for val in vals: + if val not in exceptions: + return False + return True + + def _get_fields_to_write_validation(self, vals, records_exception_function): + """Not allowed fields to write when validation depending + on the given function.""" + exceptions = records_exception_function() + not_allowed_fields = [] + for val in vals: + if val not in exceptions: + not_allowed_fields.append(val) + if not not_allowed_fields: + return [] + + not_allowed_field_names, allowed_field_names = [], [] + for fld_name, fld_data in self.fields_get( + not_allowed_fields + exceptions + ).items(): + if fld_name in not_allowed_fields: + not_allowed_field_names.append(fld_data["string"]) + else: + allowed_field_names.append(fld_data["string"]) + return allowed_field_names, not_allowed_field_names + + def _check_tier_state_transition(self, vals): + """ + Check we are in origin state and not destination state + """ + self.ensure_one() + return getattr(self, self._state_field) in self._state_from and vals.get( + self._state_field + ) not in (self._state_to + [self._cancel_state]) + + def write(self, vals): + self._tier_validation_check_state_on_write(vals) + self._tier_validation_check_write_allowed(vals) + self._tier_validation_check_write_remove_reviews(vals) + return super().write(vals) + + def _write_multi(self, vals_list): + for rec, vals in zip(self, vals_list, strict=False): + if rec._tier_validation_state_field_is_computed: + rec._tier_validation_check_state_on_write(vals) + rec._tier_validation_check_write_remove_reviews(vals) + return super()._write_multi(vals_list) + + def _tier_validation_get_current_state_value(self): + """Get the current value from the cache or the database. + + If the field is set in a computed method, the value in the cache will + already be the updated value, so we need to revert to the raw data. + """ + self.ensure_one() + if self._tier_validation_state_field_is_computed and isinstance(self.id, int): + self.env.cr.execute( + SQL( + "select %(field)s from %(table)s where id = %(res_id)s", + field=AsIs(self._state_field), + table=AsIs(self._table), + res_id=self.id, + ) + ) + rows = self.env.cr.fetchall() + if rows: + return rows[0][0] + return self[self._state_field] + + def _tier_validation_check_state_on_write(self, vals): + for rec in self: + if rec._check_state_conditions(vals): + if rec.need_validation: + # try to validate operation + reviews = rec.request_validation() + rec._validate_tier(reviews) + if rec.validation_status != "validated": + pending_reviews = reviews.filtered( + lambda r: r.status == "pending" + ).mapped("name") + raise ValidationError( + self.env._( + "This action needs to be validated for at least " + "one record. Reviews pending:\n - %s " + "\nPlease request a validation.", + "\n - ".join(pending_reviews), + ) + ) + if rec.review_ids and rec.validation_status != "validated": + raise ValidationError( + self.env._( + "A validation process is still open for at least " + "one record." + ) + ) + + def _tier_validation_check_write_allowed(self, vals): + for rec in self: + # Write under validation + if ( + rec.review_ids + and rec._check_tier_state_transition(vals) + and not rec._check_allow_write_under_validation(vals) + and not rec._context.get("skip_validation_check") + ): + ( + allowed_fields, + not_allowed_fields, + ) = rec._get_fields_to_write_validation( + vals, rec._get_under_validation_exceptions + ) + not_allowed_fields_str = "\n- ".join(not_allowed_fields) + allowed_fields_str = "\n- ".join(allowed_fields) + raise ValidationError( + self.env._( + "You are not allowed to write those fields under validation.\n" + "- %(not_allowed_fields_str)s\n\n" + "Only those fields can be modified:\n- %(allowed_fields_str)s", + not_allowed_fields_str=not_allowed_fields_str, + allowed_fields_str=allowed_fields_str, + ) + ) + + # Write after validation. Check only if Tier Validation Exception is created + if ( + rec._get_validation_exceptions(add_base_exceptions=False) + and rec.validation_status == "validated" + and rec._tier_validation_get_current_state_value() + in (self._state_to + [self._cancel_state]) + and not rec._check_allow_write_after_validation(vals) + and not rec._context.get("skip_validation_check") + ): + ( + allowed_fields, + not_allowed_fields, + ) = rec._get_fields_to_write_validation( + vals, rec._get_after_validation_exceptions + ) + not_allowed_fields_str = "\n- ".join(not_allowed_fields) + allowed_fields_str = "\n- ".join(allowed_fields) + raise ValidationError( + self.env._( + "You are not allowed to write those fields after validation.\n" + "- %(not_allowed_fields_str)s\n\n" + "Only those fields can be modified:\n- %(allowed_fields_str)s", + not_allowed_fields_str=not_allowed_fields_str, + allowed_fields_str=allowed_fields_str, + ) + ) + + def _tier_validation_check_write_remove_reviews(self, vals): + for rec in self: + if rec._allow_to_remove_reviews(vals): + rec.mapped("review_ids").unlink() + + def _allow_to_remove_reviews(self, values): + """Method for deciding whether the elimination of revisions is necessary.""" + self.ensure_one() + state_to = values.get(self._state_field) + if not state_to: + return False + state_from = self._tier_validation_get_current_state_value() + # If you change to _cancel_state + if state_to in (self._cancel_state): + return True + # If it is changed to _state_from and it was not in _state_from + if state_to in self._state_from and state_from not in self._state_from: + return True + return False + + def _check_state_from_condition(self): + return self.env.context.get("skip_check_state_condition") or ( + self._state_field in self._fields + and self._tier_validation_get_current_state_value() in self._state_from + ) + + def _check_state_conditions(self, vals): + self.ensure_one() + return ( + self._check_state_from_condition() + and vals.get(self._state_field) in self._state_to + ) + + def _validate_tier(self, tiers=False): + self.ensure_one() + tier_reviews = tiers or self.review_ids + waiting_reviews = tier_reviews.filtered( + lambda r: r.status == "waiting" + or r.approve_sequence_bypass + and self.env.user in r.reviewer_ids + ) + if waiting_reviews: + waiting_reviews.write( + { + "status": "pending", + } + ) + + user_reviews = tier_reviews.filtered( + lambda r: r.status == "pending" and (self.env.user in r.reviewer_ids) + ) + user_reviews.write( + { + "status": "approved", + "done_by": self.env.user.id, + "reviewed_date": fields.Datetime.now(), + } + ) + reviews_to_notify = user_reviews.filtered( + lambda r: r.definition_id.notify_on_accepted + ) + # We need to notify all pending users if there is approve sequence + if tier_reviews and any(review.approve_sequence for review in tier_reviews): + reviews_to_notify = self.review_ids.filtered( + lambda r: r.status in ("waiting", "pending") + and r.definition_id.notify_on_accepted + ) + # If there are approve sequence, only the following should be + # considered to notify + if reviews_to_notify and any( + review.approve_sequence for review in reviews_to_notify + ): + reviews_to_notify = reviews_to_notify.filtered( + lambda x: x.approve_sequence + )[0] + if reviews_to_notify: + subscribe = "message_subscribe" + if hasattr(self, subscribe): + getattr(self, subscribe)( + partner_ids=reviews_to_notify.mapped("reviewer_ids") + .mapped("partner_id") + .ids, + subtype_ids=self.env.ref( + self._get_accepted_notification_subtype() + ).ids, + ) + for review in reviews_to_notify: + rec = self.env[review.model].browse(review.res_id) + rec._notify_accepted_reviews() + + def _get_requested_notification_subtype(self): + return "base_tier_validation.mt_tier_validation_requested" + + def _get_accepted_notification_subtype(self): + return "base_tier_validation.mt_tier_validation_accepted" + + def _get_rejected_notification_subtype(self): + return "base_tier_validation.mt_tier_validation_rejected" + + def _get_restarted_notification_subtype(self): + return "base_tier_validation.mt_tier_validation_restarted" + + def _notify_accepted_reviews(self): + post = "message_post" + if hasattr(self, post): + # Notify state change + getattr(self.sudo(), post)( + subtype_xmlid=self._get_accepted_notification_subtype(), + body=self._notify_accepted_reviews_body(), + ) + + def _notify_accepted_reviews_body(self): + has_comment = self.review_ids.filtered( + lambda r: (self.env.user in r.reviewer_ids) and r.comment + ) + if has_comment: + comment = has_comment.mapped("comment")[0] + return self.env._("A review was accepted. (%s)", comment) + return self.env._("A review was accepted") + + def _add_comment(self, validate_reject, reviews): + wizard = self.env.ref("base_tier_validation.view_comment_wizard") + return { + "name": self.env._("Comment"), + "type": "ir.actions.act_window", + "view_mode": "form", + "res_model": "comment.wizard", + "views": [(wizard.id, "form")], + "view_id": wizard.id, + "target": "new", + "context": { + "default_res_id": self.id, + "default_res_model": self._name, + "default_review_ids": reviews.ids, + "default_validate_reject": validate_reject, + }, + } + + def validate_tier(self): + self.ensure_one() + sequences = self._get_sequences_to_approve(self.env.user) + reviews = self.review_ids.filtered( + lambda x: x.sequence in sequences or x.approve_sequence_bypass + ) + if self.has_comment: + user_reviews = reviews.filtered( + lambda r: r.status == "pending" and (self.env.user in r.reviewer_ids) + ) + return self._add_comment("validate", user_reviews) + self._validate_tier(reviews) + self._update_counter({"review_deleted": True}) + + def reject_tier(self): + self.ensure_one() + sequences = self._get_sequences_to_approve(self.env.user) + reviews = self.review_ids.filtered(lambda x: x.sequence in sequences) + if self.has_comment: + return self._add_comment("reject", reviews) + self._rejected_tier(reviews) + self._update_counter({"review_deleted": True}) + + def _notify_rejected_review_body(self): + has_comment = self.review_ids.filtered( + lambda r: (self.env.user in r.reviewer_ids) and r.comment + ) + if has_comment: + comment = has_comment.mapped("comment")[0] + return self.env._( + "A review was rejected by %(user)s. (%(comment)s)", + user=self.env.user.name, + comment=comment, + ) + return self.env._("A review was rejected by %s.", self.env.user.name) + + def _notify_rejected_review(self): + post = "message_post" + if hasattr(self, post): + # Notify state change + getattr(self.sudo(), post)( + subtype_xmlid=self._get_rejected_notification_subtype(), + body=self._notify_rejected_review_body(), + ) + + def _rejected_tier(self, tiers=False): + self.ensure_one() + tier_reviews = tiers or self.review_ids + user_reviews = tier_reviews.filtered( + lambda r: r.status in ("waiting", "pending") + and self.env.user in r.reviewer_ids + ) + user_reviews.write( + { + "status": "rejected", + "done_by": self.env.user.id, + "reviewed_date": fields.Datetime.now(), + } + ) + + reviews_to_notify = user_reviews.filtered( + lambda r: r.definition_id.notify_on_rejected + ) + # We need to notify all pending users if there is approve sequence + if tier_reviews and any(review.approve_sequence for review in tier_reviews): + reviews_to_notify = self.review_ids.filtered( + lambda r: r.status == "pending" and r.definition_id.notify_on_rejected + ) + # If there are approve sequence, only the following should be + # considered to notify + if reviews_to_notify and any( + review.approve_sequence for review in reviews_to_notify + ): + reviews_to_notify = reviews_to_notify.filtered( + lambda x: x.approve_sequence + )[0] + if reviews_to_notify: + subscribe = "message_subscribe" + if hasattr(self, subscribe): + getattr(self, subscribe)( + partner_ids=reviews_to_notify.mapped("reviewer_ids") + .mapped("partner_id") + .ids, + subtype_ids=self.env.ref( + self._get_rejected_notification_subtype() + ).ids, + ) + for review in reviews_to_notify: + rec = self.env[review.model].browse(review.res_id) + rec._notify_rejected_review() + + def _notify_created_review_body(self): + return self.env._( + "A record to be reviewed has been created by %s.", + self.env.user.name, + ) + + def _notify_requested_review_body(self): + return self.env._("A review has been requested by %s.", self.env.user.name) + + def _notify_review_requested(self, tier_reviews): + """method to notify when tier validation is created""" + subscribe = "message_subscribe" + post = "message_post" + if hasattr(self, post) and hasattr(self, subscribe): + for rec in self.sudo(): + users_to_notify = tier_reviews.filtered( + lambda r, x=rec: r.definition_id.notify_on_create + and r.res_id == x.id + ).mapped("reviewer_ids") + # Subscribe reviewers and notify + if len(users_to_notify) > 0: + getattr(rec, subscribe)( + partner_ids=users_to_notify.mapped("partner_id").ids, + subtype_ids=self.env.ref( + self._get_requested_notification_subtype() + ).ids, + ) + getattr(rec, post)( + subtype_xmlid=self._get_requested_notification_subtype(), + body=rec._notify_created_review_body(), + ) + + def _prepare_tier_review_vals(self, definition, sequence): + return { + "model": self._name, + "res_id": self.id, + "definition_id": definition.id, + "requested_by": self.env.uid, + "sequence": sequence, + } + + @api.model + def _get_company(self): + company_id = self.env.company + if ( + self + and self._tier_validation_company_field in self.env[self._name] + and self[self._tier_validation_company_field] + ): + company_id = self[self._tier_validation_company_field] + return company_id + + def request_validation(self): + td_obj = self.env["tier.definition"] + tr_obj = self.env["tier.review"] + vals_list = [] + for rec in self: + if rec._check_state_from_condition() and rec.need_validation: + tier_definitions = td_obj.search( + [ + ("model", "=", self._name), + ("company_id", "in", [False] + rec._get_company().ids), + ], + order="sequence desc", + ) + sequence = 0 + for td in tier_definitions: + if rec.evaluate_tier(td): + sequence += 1 + vals_list.append(rec._prepare_tier_review_vals(td, sequence)) + created_trs = tr_obj.create(vals_list) + if any(self.mapped("can_review")): + self._update_counter({"review_created": True}) + self._notify_review_requested(created_trs) + return created_trs + + def _notify_restarted_review_body(self): + return self.env._("The review has been reset by %s.", self.env.user.name) + + def _notify_restarted_review(self): + post = "message_post" + if hasattr(self, post): + getattr(self.sudo(), post)( + subtype_xmlid=self._get_restarted_notification_subtype(), + body=self._notify_restarted_review_body(), + ) + + def restart_validation(self): + for rec in self: + partners_to_notify_ids = False + if getattr(rec, self._state_field) in self._state_from: + to_update_counter = ( + rec.mapped("review_ids").filtered( + lambda a: a.status in ("waiting", "pending") + ) + and True + or False + ) + reviews_to_notify = rec.review_ids.filtered( + lambda r: r.definition_id.notify_on_restarted + ) + if reviews_to_notify: + partners_to_notify_ids = ( + reviews_to_notify.mapped("reviewer_ids") + .mapped("partner_id") + .ids + ) + can_review = rec.can_review + rec.mapped("review_ids").unlink() + if to_update_counter and can_review: + self._update_counter({"review_deleted": True}) + if partners_to_notify_ids: + subscribe = "message_subscribe" + reviews_to_notify = rec.review_ids.filtered( + lambda r: r.definition_id.notify_on_restarted + ) + if hasattr(self, subscribe): + getattr(self, subscribe)( + partner_ids=partners_to_notify_ids, + subtype_ids=self.env.ref( + self._get_restarted_notification_subtype() + ).ids, + ) + rec._notify_restarted_review() + + @api.model + def _update_counter(self, review_counter): + self.review_ids._compute_can_review() + channel = "base.tier.validation/updated" + self.env.user.partner_id._bus_send(channel, review_counter) + + def unlink(self): + self.mapped("review_ids").unlink() + return super().unlink() + + def _add_tier_validation_buttons(self, node, params): + str_element = self.env["ir.qweb"]._render( + "base_tier_validation.tier_validation_buttons", params + ) + new_node = etree.fromstring(str_element) + return new_node + + def _add_tier_validation_label(self, node, params): + str_element = self.env["ir.qweb"]._render( + "base_tier_validation.tier_validation_label", params + ) + new_node = etree.fromstring(str_element) + return new_node + + def _add_tier_validation_reviews(self, node, params): + str_element = self.env["ir.qweb"]._render( + "base_tier_validation.tier_validation_reviews", params + ) + new_node = etree.fromstring(str_element) + return new_node + + def _get_tier_validation_readonly_domain(self): + return "bool(review_ids)" + + @api.model + def get_view(self, view_id=None, view_type="form", **options): + res = super().get_view(view_id=view_id, view_type=view_type, **options) + View = self.env["ir.ui.view"] + if view_type == "form" and not self._tier_validation_manual_config: + doc = etree.XML(res["arch"]) + params = {} + all_models = res["models"].copy() # {modelname(str) ➔ fields(tuple)} + for node in doc.xpath(self._tier_validation_buttons_xpath): + # By default, after the last button of the header + # _add_tier_validation_buttons process + new_node = self._add_tier_validation_buttons(node, params) + new_arch, new_models = View.postprocess_and_fields(new_node, self._name) + new_node = etree.fromstring(new_arch) + for new_element in new_node: + node.addnext(new_element) + _merge_view_fields(all_models, new_models) + for node in doc.xpath("/form/sheet"): + # _add_tier_validation_label process + new_node = self._add_tier_validation_label(node, params) + new_arch, new_models = View.postprocess_and_fields(new_node, self._name) + new_node = etree.fromstring(new_arch) + for new_element in new_node: + node.addprevious(new_element) + _merge_view_fields(all_models, new_models) + # _add_tier_validation_reviews process + new_node = self._add_tier_validation_reviews(node, params) + new_arch, new_models = View.postprocess_and_fields(new_node, self._name) + new_node = etree.fromstring(new_arch) + node.append(new_node) + _merge_view_fields(all_models, new_models) + excepted_fields = self._get_all_validation_exceptions() + all_fields = self.fields_get(attributes=("readonly",)) + for node in doc.xpath("//field[@name][not(ancestor::field)]"): + field_name = node.attrib.get("name") + if field_name in excepted_fields: + continue + new_r_modifier = self._get_tier_validation_readonly_domain() + old_r_modifier = node.attrib.get("readonly") + if old_r_modifier: + new_r_modifier = f"({old_r_modifier}) or ({new_r_modifier})" + elif all_fields.get(field_name, {}).get("readonly"): + # don't set dynamic readonly attribute for fields + # marked readonly in the ORM (ie computed fields) + # if the view doesn't set one + continue + node.attrib["readonly"] = new_r_modifier + res["arch"] = etree.tostring(doc) + res["models"] = frozendict(all_models) + return res + + def _notify_review_available(self, tier_reviews): + """method to notify when reaching pending""" + subscribe = "message_subscribe" + post = "message_post" + if hasattr(self, post) and hasattr(self, subscribe): + for rec in self.sudo(): + users_to_notify = tier_reviews.filtered( + lambda r, x=rec: r.definition_id.notify_on_pending + and r.res_id == x.id + ).mapped("reviewer_ids") + # Subscribe reviewers and notify + rec.message_subscribe( + partner_ids=users_to_notify.mapped("partner_id").ids + ) + rec.message_post( + subtype_xmlid=self._get_requested_notification_subtype(), + body=rec._notify_requested_review_body(), + ) + + +def _merge_view_fields(all_models: dict, new_models: dict): + """Merge new_models into all_models. Both are {modelname(str) ➔ fields(tuple)}.""" + for model, view_fields in new_models.items(): + if model in all_models: + all_models[model] = tuple(set(all_models[model]) | set(view_fields)) + else: + all_models[model] = tuple(view_fields) diff --git a/base_tier_validation/models/tier_validation_exception.py b/base_tier_validation/models/tier_validation_exception.py new file mode 100644 index 00000000..ad0f35dc --- /dev/null +++ b/base_tier_validation/models/tier_validation_exception.py @@ -0,0 +1,94 @@ +# Copyright 2024 Moduon Team (https://www.moduon.team) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, exceptions, fields, models + +from .tier_validation import BASE_EXCEPTION_FIELDS + + +class TierValidationException(models.Model): + _name = "tier.validation.exception" + _description = "Tier Validation Exceptions" + + @api.model + def _get_tier_validation_model_names(self): + return self.env["tier.definition"]._get_tier_validation_model_names() + + name = fields.Char( + required=True, + default="New Tier Validation Exception", + ) + model_id = fields.Many2one( + comodel_name="ir.model", + string="Model", + required=True, + ondelete="cascade", + domain=lambda self: [("model", "in", self._get_tier_validation_model_names())], + ) + model_name = fields.Char( + related="model_id.model", + string="Model Name", + store=True, + index=True, + ) + field_ids = fields.Many2many( + comodel_name="ir.model.fields", + string="Fields", + domain="[('id', 'in', valid_model_field_ids)]", + required=True, + ) + valid_model_field_ids = fields.One2many( + comodel_name="ir.model.fields", + compute="_compute_valid_model_field_ids", + ) + company_id = fields.Many2one( + comodel_name="res.company", + string="Company", + default=lambda self: self.env.company, + ) + allowed_to_write_under_validation = fields.Boolean( + string="Write under Validation", + default=True, + ) + allowed_to_write_after_validation = fields.Boolean( + string="Write after Validation", + default=True, + ) + group_ids = fields.Many2many( + comodel_name="res.groups", + string="Groups", + help="Allowed groups to use this Tier Validation Exception", + ) + + @api.depends("model_id") + def _compute_valid_model_field_ids(self): + model_names = self.mapped("model_name") + valid_model_fields = dict( + self.env["ir.model.fields"] + .sudo() + ._read_group( + domain=[ + ("model", "in", model_names), + ("name", "not in", BASE_EXCEPTION_FIELDS), + ], + groupby=["model"], + aggregates=["id:array_agg"], + ) + ) + for record in self: + record.valid_model_field_ids = valid_model_fields.get(record.model_name, []) + + @api.constrains( + "allowed_to_write_under_validation", "allowed_to_write_after_validation" + ) + def _check_allowed_to_write(self): + if ( + not self.allowed_to_write_under_validation + and not self.allowed_to_write_after_validation + ): + raise exceptions.ValidationError( + self.env._( + "At least one of these fields must be checked! " + "Write under Validation, Write after Validation" + ) + ) diff --git a/base_tier_validation/pyproject.toml b/base_tier_validation/pyproject.toml new file mode 100644 index 00000000..4231d0cc --- /dev/null +++ b/base_tier_validation/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/base_tier_validation/readme/CONFIGURE.md b/base_tier_validation/readme/CONFIGURE.md new file mode 100644 index 00000000..4bd817e6 --- /dev/null +++ b/base_tier_validation/readme/CONFIGURE.md @@ -0,0 +1,33 @@ +To configure this module, you need to: + +1. Go to *Settings \> Technical \> Tier Validations \> Tier + Definition*. +2. Create as many tiers as you want for any model having tier + validation functionality. + +**Note:** + +- If check *Notify Reviewers on Creation*, all possible reviewers will + be notified by email when this definition is triggered. +- If check *Notify reviewers on reaching pending* if you want to send a notification when pending status is reached. + This is usefull in a approve by sequence scenario to only notify reviewers when it is their turn in the sequence. +- If check *Comment*, reviewers can comment after click Validate or + Reject. +- If check *Approve by sequence*, reviewers is forced to review by + specified sequence. + +To configure Tier Validation Exceptions, you need to: + +1. Go to *Settings > Technical > Tier Validations > Tier Validation Exceptions*. +2. Create as many tiers validation exceptions as you want for any model + having tier validation functionality. +3. Add desired fields to be checked in *Fields*. +4. Add desired groups that can use this Exception in *Groups*. +5. You must check *Write under Validation*, *Write after Validation* or both. + +**Note:** + +* If you don't create any exception, the Validated record will be readonly and cannot be modified. +* If check *Write under Validation*, records will be able to be modified only in the defined fields when the Validation process is ongoing. +* If check *Write after Validation*, records will be able to be modified only in the defined fields when the Validation process is finished. +* If check *Write after Validation* and *Write under Validation*, records will be able to be modified defined fields always. diff --git a/base_tier_validation/readme/CONTRIBUTORS.md b/base_tier_validation/readme/CONTRIBUTORS.md new file mode 100644 index 00000000..13892857 --- /dev/null +++ b/base_tier_validation/readme/CONTRIBUTORS.md @@ -0,0 +1,18 @@ +- Lois Rilo \<\> +- Naglis Jonaitis \<\> +- Adrià Gil Sorribes \<\> +- Pimolnat Suntian \<\> +- Pedro Gonzalez \<\> +- Kitti U. \<\> +- Saran Lim. \<\> +- Carlos Lopez \<\> +- Javier Colmeiro \<\> +- bosd +- Evan Soh \<\> +- Manuel Regidor \<\> +- Eduardo de Miguel \<\> +- [XCG Consulting](https://xcg-consulting.fr): + - Houzéfa Abbasbhay +- Stefan Rijnhart \<\> +- Kevin Khao \<\> +- Do Anh Duy \<\> diff --git a/base_tier_validation/readme/CREDITS.md b/base_tier_validation/readme/CREDITS.md new file mode 100644 index 00000000..83b3ec91 --- /dev/null +++ b/base_tier_validation/readme/CREDITS.md @@ -0,0 +1 @@ +The migration of this module from 17.0 to 18.0 was financially supported by Camptocamp. diff --git a/base_tier_validation/readme/DESCRIPTION.md b/base_tier_validation/readme/DESCRIPTION.md new file mode 100644 index 00000000..6f5bd945 --- /dev/null +++ b/base_tier_validation/readme/DESCRIPTION.md @@ -0,0 +1,19 @@ +Validating some operations is a common need across different areas in a +company and sometimes it also involves several people and stages in the +process. With this module you will be able to define your custom +validation workflows for any Odoo document. + +This module does not provide a functionality by itself but an abstract +model to implement a validation process based on tiers on other models +(e.g. purchase orders, sales orders, budgets, expenses...). + +**Note:** To be able to use this module in a new model you will need +some development. + +See [purchase_tier_validation](https://github.com/OCA/purchase-workflow) +as an example of implementation. + +Additionally, if your state field is a (stored) computed field, you need to +set `_tier_validation_state_field_is_computed` to `True` in your model Python +file, and you will want to add the dependent fields of the compute method +in `_get_after_validation_exceptions` and `_get_under_validation_exceptions`. diff --git a/base_tier_validation/readme/HISTORY.md b/base_tier_validation/readme/HISTORY.md new file mode 100644 index 00000000..3d438da6 --- /dev/null +++ b/base_tier_validation/readme/HISTORY.md @@ -0,0 +1,85 @@ +## 17.0.1.0.0 (2024-01-10) + +Migrated to Odoo 17. +Merged module with tier_validation_waiting. +To support sending messages in a validation sequence when it is their turn to validate. + +## 14.0.1.0.0 (2020-11-19) + +Migrated to Odoo 14. + +## 13.0.1.2.2 (2020-08-30) + +Fixes: + +- When using approve_sequence option in any tier.definition there can be + inconsistencies in the systray notifications +- When using approve_sequence, still not approve only the needed + sequence, but also other sequence for the same approver + +## 12.0.3.3.1 (2019-12-02) + +Fixes: + +- Show comment on Reviews Table. +- Edit notification with approve_sequence. + +## 12.0.3.3.0 (2019-11-27) + +New features: + +- Add comment on Reviews Table. +- Approve by sequence. + +## 12.0.3.2.1 (2019-11-26) + +Fixes: + +- Remove message_subscribe_users + +## 12.0.3.2.0 (2019-11-25) + +New features: + +- Notify reviewers + +## 12.0.3.1.0 (2019-07-08) + +Fixes: + +- Singleton error + +## 12.0.3.0.0 (2019-12-02) + +Fixes: + +- Edit Reviews Table + +## 12.0.2.1.0 (2019-05-29) + +Fixes: + +- Edit drop-down style width and position + +## 12.0.2.0.0 (2019-05-28) + +New features: + +- Pass parameters as functions. +- Add Systray. + +## 12.0.1.0.0 (2019-02-18) + +Migrated to Odoo 12. + +## 11.0.1.0.0 (2018-05-09) + +Migrated to Odoo 11. + +## 10.0.1.0.0 (2018-03-26) + +Migrated to Odoo 10. + +## 9.0.1.0.0 (2017-12-02) + +First version. diff --git a/base_tier_validation/readme/ROADMAP.md b/base_tier_validation/readme/ROADMAP.md new file mode 100644 index 00000000..40f705c0 --- /dev/null +++ b/base_tier_validation/readme/ROADMAP.md @@ -0,0 +1,22 @@ +This is the list of known issues for this module. Any proposal for +improvement will be very valuable. + +- **Issue:** + + When using approve_sequence option in any tier.definition there can be + inconsistencies in the systray notifications. + + **Description:** + + Field can_review in tier.review is used to filter out, in the systray + notifications, the reviews a user can approve. This can_review field + is updated **in the database** in method review_user_count, this can + make it very inconsistent for databases with a lot of users and + recurring updates that can change the expected behavior. + +- **Migration to 15.0:** + + The parameter \_tier_validation_manual_config will become False, on + 14.0, the default value is True, as the change is applied after the + migration. In order to use the new behavior we need to modify the + value on our expected model. diff --git a/base_tier_validation/security/ir.model.access.csv b/base_tier_validation/security/ir.model.access.csv new file mode 100644 index 00000000..82c76c65 --- /dev/null +++ b/base_tier_validation/security/ir.model.access.csv @@ -0,0 +1,11 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_tier_review_group_public,access_tier_review_group_public,model_tier_review,base.group_public,1,0,0,0 +access_tier_definition_group_public,access_tier_definition_group_public,model_tier_definition,base.group_public,1,0,0,0 +access_tier_review_group_portal,access_tier_review_group_portal,model_tier_review,base.group_portal,1,0,0,0 +access_tier_definition_group_portal,access_tier_definition_group_portal,model_tier_definition,base.group_portal,1,0,0,0 +access_tier_review,access.tier.review,model_tier_review,base.group_user,1,1,1,1 +access_tier_definition_all,tier.definition.all,model_tier_definition,base.group_user,1,0,0,0 +access_tier_definition_settings,tier.definition.settings,model_tier_definition,base.group_erp_manager,1,1,1,1 +access_comment_wizard,access.comment.wizard,model_comment_wizard,base.group_user,1,1,1,1 +access_tier_validation_exceptions_all,tier.validation.exceptions,model_tier_validation_exception,base.group_user,1,0,0,0 +access_tier_validation_exceptions_settings,tier.validation.exceptions,model_tier_validation_exception,base.group_system,1,1,1,1 diff --git a/base_tier_validation/security/tier_validation_security.xml b/base_tier_validation/security/tier_validation_security.xml new file mode 100644 index 00000000..c11aa502 --- /dev/null +++ b/base_tier_validation/security/tier_validation_security.xml @@ -0,0 +1,15 @@ + + + + Tier Definition multi-company + + + [('company_id', 'in', company_ids + [False])] + + + Tier Review multi-company + + + [('company_id', 'in', company_ids + [False])] + + diff --git a/base_tier_validation/static/description/icon.png b/base_tier_validation/static/description/icon.png new file mode 100644 index 00000000..e4781126 Binary files /dev/null and b/base_tier_validation/static/description/icon.png differ diff --git a/base_tier_validation/static/description/icon.svg b/base_tier_validation/static/description/icon.svg new file mode 100644 index 00000000..a04a24bd --- /dev/null +++ b/base_tier_validation/static/description/icon.svg @@ -0,0 +1,70 @@ + + + + diff --git a/base_tier_validation/static/description/index.html b/base_tier_validation/static/description/index.html new file mode 100644 index 00000000..7b55c53b --- /dev/null +++ b/base_tier_validation/static/description/index.html @@ -0,0 +1,657 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

Base Tier Validation

+ +

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

+

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

+

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

+

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

+

See +purchase_tier_validation +as an example of implementation.

+

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

+

Table of contents

+ +
+

Configuration

+

To configure this module, you need to:

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

Note:

+
    +
  • If check Notify Reviewers on Creation, all possible reviewers will +be notified by email when this definition is triggered.
  • +
  • If check Notify reviewers on reaching pending if you want to send a +notification when pending status is reached. This is usefull in a +approve by sequence scenario to only notify reviewers when it is their +turn in the sequence.
  • +
  • If check Comment, reviewers can comment after click Validate or +Reject.
  • +
  • If check Approve by sequence, reviewers is forced to review by +specified sequence.
  • +
+

To configure Tier Validation Exceptions, you need to:

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

Note:

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

Known issues / Roadmap

+

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

+
    +
  • Issue:

    +

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

    +

    Description:

    +

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

    +
  • +
  • Migration to 15.0:

    +

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

    +
  • +
+
+
+

Changelog

+
+

17.0.1.0.0 (2024-01-10)

+

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

+
+
+

14.0.1.0.0 (2020-11-19)

+

Migrated to Odoo 14.

+
+
+

13.0.1.2.2 (2020-08-30)

+

Fixes:

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

12.0.3.3.1 (2019-12-02)

+

Fixes:

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

12.0.3.3.0 (2019-11-27)

+

New features:

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

12.0.3.2.1 (2019-11-26)

+

Fixes:

+
    +
  • Remove message_subscribe_users
  • +
+
+
+

12.0.3.2.0 (2019-11-25)

+

New features:

+
    +
  • Notify reviewers
  • +
+
+
+

12.0.3.1.0 (2019-07-08)

+

Fixes:

+
    +
  • Singleton error
  • +
+
+
+

12.0.3.0.0 (2019-12-02)

+

Fixes:

+
    +
  • Edit Reviews Table
  • +
+
+
+

12.0.2.1.0 (2019-05-29)

+

Fixes:

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

12.0.2.0.0 (2019-05-28)

+

New features:

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

12.0.1.0.0 (2019-02-18)

+

Migrated to Odoo 12.

+
+
+

11.0.1.0.0 (2018-05-09)

+

Migrated to Odoo 11.

+
+
+

10.0.1.0.0 (2018-03-26)

+

Migrated to Odoo 10.

+
+
+

9.0.1.0.0 (2017-12-02)

+

First version.

+
+
+
+

Bug Tracker

+

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

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • ForgeFlow
  • +
+
+
+

Contributors

+ +
+
+

Other credits

+

The migration of this module from 17.0 to 18.0 was financially supported +by Camptocamp.

+
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

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

+

Current maintainer:

+

LoisRForgeFlow

+

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

+

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

+
+
+
+
+ + diff --git a/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.esm.js b/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.esm.js new file mode 100644 index 00000000..553796b8 --- /dev/null +++ b/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.esm.js @@ -0,0 +1,74 @@ +import {Component, useState} from "@odoo/owl"; +import {Dropdown} from "@web/core/dropdown/dropdown"; +import {registry} from "@web/core/registry"; +import {useDiscussSystray} from "@mail/utils/common/hooks"; +import {useDropdownState} from "@web/core/dropdown/dropdown_hooks"; +import {useService} from "@web/core/utils/hooks"; + +export class TierReviewMenu extends Component { + static components = {Dropdown}; + static props = []; + static template = "base_tier_validation.TierReviewMenu"; + + setup() { + super.setup(); + this.discussSystray = useDiscussSystray(); + this.orm = useService("orm"); + this.store = useState(useService("mail.store")); + this.action = useService("action"); + this.dropdown = useDropdownState(); + this.fetchSystrayReviewer(); + } + + async fetchSystrayReviewer() { + const groups = await this.orm.call("res.users", "review_user_count"); + let total = 0; + for (const group of groups) { + total += group.pending_count || 0; + } + this.store.tierReviewCounter = total; + this.store.tierReviewGroups = groups; + } + + availableViews() { + return [ + [false, "kanban"], + [false, "list"], + [false, "form"], + [false, "activity"], + ]; + } + + openReviewGroup(group) { + this.dropdown.close(); + const context = {}; + const domain = [["can_review", "=", true]]; + if (group.active_field) { + domain.push(["active", "in", [true, false]]); + } + const views = this.availableViews(); + + this.action.doAction( + { + context, + domain, + name: group.name, + res_model: group.model, + search_view_id: [false], + type: "ir.actions.act_window", + views, + }, + { + clearBreadcrumbs: true, + } + ); + } +} + +export const systrayItem = { + Component: TierReviewMenu, +}; + +registry + .category("systray") + .add("base_tier_validation.ReviewerMenu", systrayItem, {sequence: 99}); diff --git a/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml b/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml new file mode 100644 index 00000000..f4b1c323 --- /dev/null +++ b/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml @@ -0,0 +1,71 @@ + + + + + + + +
+
+ No reviews to do. +
+
+ +
+ Review +
+
+
+ + Pending + +
+
+
+ +
+
+ + + + + diff --git a/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.esm.js b/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.esm.js new file mode 100644 index 00000000..b9b87135 --- /dev/null +++ b/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.esm.js @@ -0,0 +1,53 @@ +import {Component, useState} from "@odoo/owl"; +import {registry} from "@web/core/registry"; +import {useService} from "@web/core/utils/hooks"; + +export class ReviewsTable extends Component { + setup() { + super.setup(); + this.orm = useService("orm"); + this.state = useState({ + collapse: false, + }); + } + + _getReviewData() { + const records = this.props.record.data.review_ids.records; + return records.map((record) => record.data); + } + + onToggleCollapse(ev) { + const panelHeading = ev.currentTarget.closest(".panel-heading"); + const collapseDiv = panelHeading.nextElementSibling.matches("div#collapse1") + ? panelHeading.nextElementSibling + : null; + if (!collapseDiv) return; + if (this.state.collapse) { + collapseDiv.style.display = "none"; + } else { + collapseDiv.style.display = "block"; + } + this.state.collapse = !this.state.collapse; + } +} + +ReviewsTable.template = "base_tier_validation.Collapse"; + +export const reviewsTableComponent = { + component: ReviewsTable, + supportedTypes: ["one2many"], + relatedFields: [ + {name: "id", type: "integer"}, + {name: "sequence", type: "integer"}, + {name: "name", type: "char"}, + {name: "display_status", type: "char"}, + {name: "todo_by", type: "char"}, + {name: "status", type: "char"}, + {name: "reviewed_formated_date", type: "char"}, + {name: "comment", type: "char"}, + {name: "requested_by", type: "many2one", relation: "partner"}, + {name: "done_by", type: "many2one", relation: "partner"}, + ], +}; + +registry.category("fields").add("form.tier_validation", reviewsTableComponent); diff --git a/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.scss b/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.scss new file mode 100644 index 00000000..a42c166d --- /dev/null +++ b/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.scss @@ -0,0 +1,41 @@ +ul.o_review { + min-width: 600px; + max-width: 800px; +} + +.panel-group { + min-height: auto !important; + margin-top: -6px !important; + padding: 16px 16px 8px 16px !important; +} + +.panel-heading { + background-color: initial !important; +} + +.panel { + border: 0 !important; +} + +.panel-body { + overflow-y: hidden; + overflow-x: auto; +} + +.panel-title > a, +.panel-title > a:active { + display: block; +} + +.panel-heading a:before { + font-family: FontAwesome; + content: "\f0d7"; + float: right; + transition: all 0.5s; +} + +.panel-heading.active a:before { + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + transform: rotate(180deg); +} diff --git a/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml b/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml new file mode 100644 index 00000000..7716141f --- /dev/null +++ b/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml @@ -0,0 +1,112 @@ + + + +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SequenceRequested byDescriptionStatusTodo byDone byValidation DateComment
+ + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
diff --git a/base_tier_validation/static/src/js/services/tier_review_service.esm.js b/base_tier_validation/static/src/js/services/tier_review_service.esm.js new file mode 100644 index 00000000..bde257be --- /dev/null +++ b/base_tier_validation/static/src/js/services/tier_review_service.esm.js @@ -0,0 +1,33 @@ +import {reactive} from "@odoo/owl"; +import {registry} from "@web/core/registry"; + +export class TierReviewService { + constructor(env, services) { + this.env = env; + this.store = services["mail.store"]; + this.busService = services.bus_service; + } + setup() { + this.busService.subscribe("base.tier.validation/updated", (payload) => { + if (payload.review_created) { + this.store.tierReviewCounter++; + } + if (payload.review_deleted) { + this.store.tierReviewCounter--; + } + }); + this.busService.start(); + } +} + +export const tierReviewService = { + dependencies: ["bus_service", "mail.store"], + + start(env, services) { + const tier_review_service = reactive(new TierReviewService(env, services)); + tier_review_service.setup(); + return tier_review_service; + }, +}; + +registry.category("services").add("tierReviewService", tierReviewService); diff --git a/base_tier_validation/templates/tier_validation_templates.xml b/base_tier_validation/templates/tier_validation_templates.xml new file mode 100644 index 00000000..b63d94dd --- /dev/null +++ b/base_tier_validation/templates/tier_validation_templates.xml @@ -0,0 +1,97 @@ + + + + + + diff --git a/base_tier_validation/tests/__init__.py b/base_tier_validation/tests/__init__.py new file mode 100644 index 00000000..a07447da --- /dev/null +++ b/base_tier_validation/tests/__init__.py @@ -0,0 +1,5 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import test_tier_validation +from . import test_tier_validation_reminder +from . import test_tier diff --git a/base_tier_validation/tests/common.py b/base_tier_validation/tests/common.py new file mode 100644 index 00000000..ccac99bf --- /dev/null +++ b/base_tier_validation/tests/common.py @@ -0,0 +1,217 @@ +# Copyright 2018-19 ForgeFlow S.L. (https://www.forgeflow.com) +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from odoo_test_helper import FakeModelLoader + +from odoo import Command +from odoo.tests import new_test_user + +from odoo.addons.base.tests.common import BaseCommon + + +class CommonTierValidation(BaseCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.loader = FakeModelLoader(cls.env, cls.__module__) + cls.loader.backup_registry() + from .tier_validation_tester import ( + TierDefinition, + TierValidationTester, + TierValidationTester2, + TierValidationTesterComputed, + ) + + cls.loader.update_registry( + ( + TierValidationTester, + TierValidationTester2, + TierValidationTesterComputed, + TierDefinition, + ) + ) + + cls.test_model = cls.env[TierValidationTester._name] + cls.test_model_2 = cls.env[TierValidationTester2._name] + cls.test_model_computed = cls.env[TierValidationTesterComputed._name] + + cls.tester_model = cls.env["ir.model"].search( + [("model", "=", "tier.validation.tester")] + ) + cls.tester_model_2 = cls.env["ir.model"].search( + [("model", "=", "tier.validation.tester2")] + ) + cls.tester_model_computed = cls.env["ir.model"].search( + [("model", "=", "tier.validation.tester.computed")] + ) + # Create a multi-company + cls.main_company = cls.env.ref("base.main_company") + cls.other_company = cls.env["res.company"].create({"name": "My Company"}) + + models = ( + cls.tester_model, + cls.tester_model_2, + cls.tester_model_computed, + ) + for model in models: + # Access record: + cls.env["ir.model.access"].create( + { + "name": f"access {model.name}", + "model_id": model.id, + "perm_read": 1, + "perm_write": 1, + "perm_create": 1, + "perm_unlink": 1, + } + ) + + # Define views to avoid automatic views with all fields. + cls.env["ir.ui.view"].create( + { + "model": model.model, + "name": f"Demo view for {model}", + "arch": """
+
+
+ + + +
""", + } + ) + + # Create users: + cls.test_user_1 = new_test_user( + cls.env, name="John", login="test1", groups="base.group_system" + ) + cls.test_user_2 = new_test_user(cls.env, name="Mike", login="test2") + cls.test_user_3_multi_company = new_test_user( + cls.env, + name="Jane", + login="test3", + company_ids=[Command.set([cls.main_company.id, cls.other_company.id])], + ) + # Create groups + cls.test_group = cls.env["res.groups"].create( + { + "name": "TestGroup", + "users": [(4, cls.test_user_1.id), (4, cls.test_user_2.id)], + } + ) + # Create tier definitions: + cls.tier_def_obj = cls.env["tier.definition"] + cls.tier_definition = cls.tier_def_obj.create( + { + "model_id": cls.tester_model.id, + "review_type": "individual", + "reviewer_id": cls.test_user_1.id, + "definition_domain": "[('test_field', '=', 1.0)]", + "sequence": 30, + } + ) + + cls.test_record = cls.test_model.create({"test_field": 1.0}) + cls.test_record_2 = cls.test_model_2.create({"test_field": 1.0}) + cls.test_record_computed = cls.test_model_computed.create({"test_field": 1.0}) + + cls.tier_def_obj.create( + { + "model_id": cls.tester_model.id, + "review_type": "individual", + "reviewer_id": cls.test_user_1.id, + "definition_domain": "[('test_field', '>', 3.0)]", + "approve_sequence": True, + "notify_on_pending": False, + "sequence": 20, + "name": "Definition for test 19 - sequence - user 1", + } + ) + cls.tier_def_obj.create( + { + "model_id": cls.tester_model.id, + "review_type": "individual", + "reviewer_id": cls.test_user_2.id, + "definition_domain": "[('test_field', '>', 3.0)]", + "approve_sequence": True, + "notify_on_pending": True, + "sequence": 10, + "name": "Definition for test 19 - sequence - user 2", + } + ) + # Create definition for test 20 + cls.tier_def_obj.create( + { + "model_id": cls.tester_model.id, + "review_type": "individual", + "reviewer_id": cls.test_user_1.id, + "definition_domain": "[('test_field', '=', 0.9)]", + "approve_sequence": False, + "notify_on_pending": True, + "sequence": 10, + "name": "Definition for test 20 - no sequence - user 1 - no sequence", + } + ) + + cls.tier_def_obj.create( + { + "model_id": cls.tester_model_computed.id, + "review_type": "individual", + "reviewer_id": cls.test_user_1.id, + "definition_domain": "[]", + "approve_sequence": True, + "notify_on_pending": False, + "sequence": 20, + "name": "Definition for computed model", + } + ) + + # Create definition for test 30, 31 + # Main company tier definition + cls.tier_def_obj.create( + { + "model_id": cls.tester_model_2.id, + "review_type": "individual", + "reviewer_id": cls.test_user_1.id, + "definition_domain": "[('test_field', '>=', 1.0)]", + "approve_sequence": True, + "notify_on_pending": False, + "sequence": 30, + "name": "Definition for test 30 - sequence - user 1 - main company", + "company_id": cls.main_company.id, + } + ) + cls.tier_def_obj.create( + { + "model_id": cls.tester_model_2.id, + "review_type": "individual", + "reviewer_id": cls.test_user_3_multi_company.id, + "definition_domain": "[('test_field', '>=', 1.0)]", + "approve_sequence": True, + "notify_on_pending": False, + "sequence": 20, + "name": "Definition for test 30 - sequence - user 3 - main company", + "company_id": cls.main_company.id, + } + ) + # Other company tier definition + cls.tier_def_obj.create( + { + "model_id": cls.tester_model_2.id, + "review_type": "individual", + "reviewer_id": cls.test_user_3_multi_company.id, + "definition_domain": "[('test_field', '>=', 1.0)]", + "approve_sequence": True, + "notify_on_pending": False, + "sequence": 30, + "name": "Definition for test 30 - sequence - user 3 - other company", + "company_id": cls.other_company.id, + } + ) + + @classmethod + def tearDownClass(cls): + cls.loader.restore_registry() + super().tearDownClass() diff --git a/base_tier_validation/tests/test_tier.py b/base_tier_validation/tests/test_tier.py new file mode 100644 index 00000000..ad6ba3a4 --- /dev/null +++ b/base_tier_validation/tests/test_tier.py @@ -0,0 +1,193 @@ +# Copyright 2024 DOB +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo_test_helper import FakeModelLoader + +from odoo.tests import new_test_user +from odoo.tests.common import TransactionCase + +from .tier_validation_tester import ( + TierDefinition, + TierValidationTester, +) + + +class TestTierDefinition(TransactionCase): + """Tests for base_tier_validation: TierDefinition creation and workflow. + + Validates: Requirements 8.1, 8.2, 8.3, 8.4 + """ + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.loader = FakeModelLoader(cls.env, cls.__module__) + cls.loader.backup_registry() + cls.loader.update_registry((TierValidationTester, TierDefinition)) + + cls.test_model = cls.env[TierValidationTester._name] + cls.tester_model = cls.env["ir.model"].search( + [("model", "=", TierValidationTester._name)] + ) + + # Grant access to the fake model + cls.env["ir.model.access"].create( + { + "name": "access tier.validation.tester", + "model_id": cls.tester_model.id, + "perm_read": 1, + "perm_write": 1, + "perm_create": 1, + "perm_unlink": 1, + } + ) + + # Minimal form view to avoid auto-view issues + cls.env["ir.ui.view"].create( + { + "model": TierValidationTester._name, + "name": "test_tier_tester_form", + "arch": """
+
+
+ + + +
""", + } + ) + + # Users: reviewer (admin) and requester (regular) + cls.reviewer = new_test_user( + cls.env, + name="Reviewer", + login="tier_reviewer", + groups="base.group_system", + ) + cls.requester = new_test_user( + cls.env, + name="Requester", + login="tier_requester", + ) + + cls.tier_def_obj = cls.env["tier.definition"] + + @classmethod + def tearDownClass(cls): + cls.loader.restore_registry() + super().tearDownClass() + + def test_01_create_tier_definition(self): + """WHEN a TierDefinition is created for a model with approval levels, + base_tier_validation SHALL create the record without errors. + + Validates: Requirement 8.1 + """ + tier_def = self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.reviewer.id, + "definition_domain": "[]", + "sequence": 10, + } + ) + self.assertTrue(tier_def.id, "TierDefinition should be created without errors") + self.assertEqual(tier_def.model_id, self.tester_model) + self.assertEqual(tier_def.reviewer_id, self.reviewer) + + def test_02_request_validation_creates_tier_reviews(self): + """WHEN a document is submitted for approval, + base_tier_validation SHALL create TierReview records for each level. + + Validates: Requirement 8.2 + """ + # Create two tier definitions (two approval levels) + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.reviewer.id, + "definition_domain": "[('test_field', '>', 0.0)]", + "sequence": 10, + } + ) + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.reviewer.id, + "definition_domain": "[('test_field', '>', 0.0)]", + "sequence": 20, + } + ) + + record = self.test_model.create({"test_field": 1.0}) + self.assertFalse(record.review_ids, "No reviews before request") + + reviews = record.with_user(self.requester).request_validation() + + self.assertTrue(reviews, "Reviews should be created after request_validation") + self.assertEqual( + len(reviews), + 2, + "One TierReview should be created per approval level", + ) + + def test_03_approve_all_tiers_sets_validated_status(self): + """WHEN all approval levels are approved, + base_tier_validation SHALL set the document validation_status to 'validated'. + + Validates: Requirement 8.3 + """ + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.reviewer.id, + "definition_domain": "[('test_field', '>', 0.0)]", + "sequence": 10, + } + ) + + record = self.test_model.create({"test_field": 1.0}) + record.with_user(self.requester).request_validation() + + record_as_reviewer = record.with_user(self.reviewer) + record_as_reviewer.validate_tier() + + self.assertEqual( + record.validation_status, + "validated", + "validation_status should be 'validated' after all tiers approved", + ) + + def test_04_reject_tier_sets_rejected_status(self): + """IF one approval level is rejected, + base_tier_validation SHALL set the document validation_status to 'rejected'. + + Validates: Requirement 8.4 + """ + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.reviewer.id, + "definition_domain": "[('test_field', '>', 0.0)]", + "sequence": 10, + } + ) + + record = self.test_model.create({"test_field": 1.0}) + record.with_user(self.requester).request_validation() + + record_as_reviewer = record.with_user(self.reviewer) + record_as_reviewer.reject_tier() + + self.assertEqual( + record.validation_status, + "rejected", + "validation_status should be 'rejected' after a tier is rejected", + ) diff --git a/base_tier_validation/tests/test_tier_validation.py b/base_tier_validation/tests/test_tier_validation.py new file mode 100644 index 00000000..0dbaef3a --- /dev/null +++ b/base_tier_validation/tests/test_tier_validation.py @@ -0,0 +1,1285 @@ +# Copyright 2018-19 ForgeFlow S.L. (https://www.forgeflow.com) +# Copyright (c) 2022 brain-tec AG (https://braintec.com) +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from unittest import mock + +from lxml import etree + +from odoo.exceptions import ValidationError +from odoo.tests import Form +from odoo.tests.common import tagged + +from ..models.tier_validation import BASE_EXCEPTION_FIELDS as BEF +from ..models.tier_validation import TierValidation as TV +from .common import CommonTierValidation + + +@tagged("post_install", "-at_install") +class TierTierValidation(CommonTierValidation): + def test_01_auto_validation(self): + """When the user can validate all future reviews, it is not needed + to request a validation, the action can be done straight forward.""" + self.test_record.with_user(self.test_user_1.id).action_confirm() + self.assertEqual(self.test_record.state, "confirmed") + + def test_02_no_auto_validation(self): + """User with no right to validate future reviews must request a + validation.""" + with self.assertRaises(ValidationError): + self.test_record.with_user(self.test_user_2.id).action_confirm() + + def test_03_request_validation_approved(self): + """User 2 request a validation and user 1 approves it.""" + self.assertFalse(self.test_record.review_ids) + reviews = self.test_record.with_user(self.test_user_2.id).request_validation() + self.assertTrue(reviews) + record = self.test_record.with_user(self.test_user_1.id) + record.validate_tier() + self.assertEqual(record.validation_status, "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.reject_tier() + self.assertTrue(record.review_ids) + self.assertEqual(record.validation_status, "rejected") + record.restart_validation() + self.assertFalse(record.review_ids) + + def test_05_under_validation(self): + """Write is forbidden in a record under validation.""" + self.assertFalse(self.test_record.review_ids) + reviews = self.test_record.with_user(self.test_user_2.id).request_validation() + self.assertTrue(reviews) + record = self.test_record.with_user(self.test_user_1.id) + with self.assertRaises(ValidationError): + record.write({"test_field": 0.5}) + + def test_06_validation_process_open(self): + """Operation forbidden while a validation process is open.""" + self.assertFalse(self.test_record.review_ids) + reviews = self.test_record.with_user(self.test_user_2.id).request_validation() + self.assertTrue(reviews) + record = self.test_record.with_user(self.test_user_1.id) + with self.assertRaises(ValidationError): + record.action_confirm() + + def test_07_search_reviewers(self): + """Test search methods.""" + reviews = self.test_record.with_user(self.test_user_2.id).request_validation() + self.assertTrue(reviews) + record = self.test_record.with_user(self.test_user_1.id) + self.assertIn(self.test_user_1, record.reviewer_ids) + res = self.test_model.search([("reviewer_ids", "in", self.test_user_1.id)]) + self.assertTrue(res) + + def test_10_systray_counter(self): + # Create new test record + test_record = self.test_model.create({"test_field": 2.5}) + # Create tier definitions for both tester models + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + } + ) + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + } + ) + self.tier_def_obj.create( + { + "model_id": self.tester_model_2.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + } + ) + # Request validation + self.test_record.with_user(self.test_user_2.id).request_validation() + test_record.with_user(self.test_user_2.id).request_validation() + self.test_record_2.with_user(self.test_user_2.id).request_validation() + # Get review user count as systray icon would do and check count value + docs = self.test_user_1.with_user(self.test_user_1).review_user_count() + self.assertEqual( + next(filter(lambda doc: doc["model"] == "tier.validation.tester", docs))[ + "pending_count" + ], + 2, + ) + self.assertEqual( + next(filter(lambda doc: doc["model"] == "tier.validation.tester2", docs))[ + "pending_count" + ], + 1, + ) + + def test_11_add_comment(self): + # Create new test record + test_record = self.test_model.create({"test_field": 2.5}) + # Create tier definitions + 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) + # Let _compute_can_review assign status 'pending' instead of waiting + review.flush_recordset() + record = test_record.with_user(self.test_user_1.id) + res = record.validate_tier() + ctx = res.get("context") + wizard = Form(self.env["comment.wizard"].with_context(**ctx)) + wizard.comment = "Test Comment" + wiz = wizard.save() + wiz.add_comment() + self.assertTrue(test_record.review_ids.filtered("comment")) + # Check notify + comment = test_record.with_user( + self.test_user_1.id + )._notify_accepted_reviews_body() + self.assertEqual(comment, "A review was accepted. (Test Comment)") + comment = test_record.with_user( + self.test_user_1.id + )._notify_rejected_review_body() + self.assertEqual(comment, "A review was rejected by John. (Test Comment)") + + def test_11_add_comment_rejection(self): + # Create new test record + test_record = self.test_model.create({"test_field": 2.5}) + # Create tier definitions + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "has_comment": True, + } + ) + # Request validation + review = test_record.with_user(self.test_user_2.id).request_validation() + self.assertTrue(review) + record = test_record.with_user(self.test_user_1.id) + res = record.reject_tier() # Rejection + ctx = res.get("context") + wizard = Form(self.env["comment.wizard"].with_context(**ctx)) + wizard.comment = "Test Comment" + wiz = wizard.save() + wiz.add_comment() + self.assertTrue(test_record.review_ids.filtered("comment")) + # Check notify + comment = test_record.with_user( + self.test_user_1.id + )._notify_accepted_reviews_body() + self.assertEqual(comment, "A review was accepted. (Test Comment)") + comment = test_record.with_user( + self.test_user_1.id + )._notify_rejected_review_body() + self.assertEqual(comment, "A review was rejected by John. (Test Comment)") + + def test_12_approve_sequence(self): + # Create new test record + test_record = self.test_model.create({"test_field": 2.5}) + # Create tier definitions + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "approve_sequence": True, + "sequence": 30, + } + ) + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_2.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "approve_sequence": True, + "sequence": 10, + } + ) + # Request validation + self.assertFalse(self.test_record.review_ids) + reviews = test_record.with_user(self.test_user_2.id).request_validation() + self.assertTrue(reviews) + + docs1 = self.test_user_2.with_user(self.test_user_1).review_user_count() + for doc in docs1: + self.assertEqual(doc.get("pending_count"), 1) + docs2 = self.test_user_2.with_user(self.test_user_2).review_user_count() + for doc in docs2: + self.assertEqual(doc.get("pending_count"), 0) + + record1 = test_record.with_user(self.test_user_1.id) + self.assertTrue(record1.can_review) + record2 = test_record.with_user(self.test_user_2.id) + self.assertFalse(record2.can_review) + # User 1 validates the record, 2 review should be approved. + self.assertFalse(any(r.status == "approved" for r in record1.review_ids)) + record1.validate_tier() + self.assertTrue(any(r.status == "approved" for r in record1.review_ids)) + + def test_12_approve_sequence_same_user(self): + """Similar to test_12_approve_sequence, but all same users, + the approve_sequence still apply correctly""" + # Create new test record + test_record = self.test_model.create({"test_field": 2.5}) + # Create tier definitions + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "approve_sequence": True, + "sequence": 20, + } + ) + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "approve_sequence": True, + "sequence": 10, + } + ) + # Request validation + self.assertFalse(self.test_record.review_ids) + reviews = test_record.with_user(self.test_user_1.id).request_validation() + self.assertTrue(reviews) + + record1 = test_record.with_user(self.test_user_1.id) + self.assertTrue(record1.can_review) + # Validation will be all by sequence + self.assertEqual(len(record1.review_ids), 2) + self.assertEqual( + 1, len(record1.review_ids.filtered(lambda x: x.status == "waiting")) + ) + self.assertEqual( + 1, len(record1.review_ids.filtered(lambda x: x.status == "pending")) + ) + record1.validate_tier() + self.assertEqual( + 0, len(record1.review_ids.filtered(lambda x: x.status == "waiting")) + ) + self.assertEqual( + 1, len(record1.review_ids.filtered(lambda x: x.status == "pending")) + ) + self.assertEqual( + 1, len(record1.review_ids.filtered(lambda x: x.status == "approved")) + ) + record1.validate_tier() + self.assertEqual( + 0, len(record1.review_ids.filtered(lambda x: x.status == "waiting")) + ) + self.assertEqual( + 0, len(record1.review_ids.filtered(lambda x: x.status == "pending")) + ) + self.assertEqual( + 2, len(record1.review_ids.filtered(lambda x: x.status == "approved")) + ) + record1.validate_tier() + self.assertEqual( + 0, len(record1.review_ids.filtered(lambda x: x.status == "waiting")) + ) + self.assertEqual( + 0, len(record1.review_ids.filtered(lambda x: x.status == "pending")) + ) + self.assertEqual( + 2, len(record1.review_ids.filtered(lambda x: x.status == "approved")) + ) + + def test_12_approve_sequence_same_user_bypassed(self): + """Similar to test_12_approve_sequence, with all same users, + but approve_sequence_bypass is True""" + # Create new test record + test_record = self.test_model.create({"test_field": 2.5}) + # Create tier definitions + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "approve_sequence": True, + "approve_sequence_bypass": True, + "sequence": 20, + } + ) + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "approve_sequence": True, + "approve_sequence_bypass": True, + "sequence": 10, + } + ) + # Request validation + self.assertFalse(self.test_record.review_ids) + reviews = test_record.with_user(self.test_user_1.id).request_validation() + self.assertTrue(reviews) + + record1 = test_record.with_user(self.test_user_1.id) + self.assertTrue(record1.can_review) + # When the first tier is validated, all the rest will be approved. + self.assertEqual(len(record1.review_ids), 2) + self.assertEqual( + 1, len(record1.review_ids.filtered(lambda x: x.status == "waiting")) + ) + self.assertEqual( + 1, len(record1.review_ids.filtered(lambda x: x.status == "pending")) + ) + record1.validate_tier() + self.assertEqual( + 0, len(record1.review_ids.filtered(lambda x: x.status == "pending")) + ) + self.assertEqual( + 0, len(record1.review_ids.filtered(lambda x: x.status == "waiting")) + ) + self.assertEqual( + 2, len(record1.review_ids.filtered(lambda x: x.status == "approved")) + ) + + def test_13_onchange_review_type(self): + tier_def_id = self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "approve_sequence": True, + } + ) + self.assertTrue(tier_def_id.reviewer_id) + tier_def_id.review_type = "group" + tier_def_id.onchange_review_type() + self.assertFalse(tier_def_id.reviewer_id) + + def test_14_onchange_review_type(self): + tier_def_id = self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "approve_sequence": True, + } + ) + self.assertTrue(tier_def_id.reviewer_id) + tier_def_id.review_type = "group" + tier_def_id.onchange_review_type() + self.assertFalse(tier_def_id.reviewer_id) + + def test_15_review_user_count(self): + # Create new test record + test_record = self.test_model.create({"test_field": 2.5}) + # Create tier definitions + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "has_comment": True, + } + ) + # Request validation + review = test_record.with_user(self.test_user_2).request_validation() + self.assertTrue(review) + self.assertTrue(self.test_user_1.review_ids) + self.assertTrue(test_record.review_ids) + # Used by front-end + count = self.test_user_1.with_user(self.test_user_1).review_user_count() + self.assertEqual(len(count), 1) + # False Review - test notification message bodies + self.assertIn("created", self.test_record._notify_created_review_body()) + self.assertNotEqual(self.test_record.validation_status, "validated") + self.assertIn("requested", self.test_record._notify_requested_review_body()) + self.assertIn("rejected", self.test_record._notify_rejected_review_body()) + self.assertIn("accepted", self.test_record._notify_accepted_reviews_body()) + + def test_16_review_user_count_on_rejected(self): + """If document is rejected, it should always removed from tray""" + # Create new test record + test_record3 = self.test_model.create({"test_field": 1.0}) + # Create tier definitions + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_2.id, + "definition_domain": "[('test_field', '=', 1.0)]", + } + ) + test_record3.with_user(self.test_user_2).request_validation() + record1 = test_record3.with_user(self.test_user_1) + self.assertTrue(record1.can_review) + self.assertTrue( + self.test_user_1.with_user(self.test_user_1).review_user_count() + ) + self.assertTrue( + self.test_user_2.with_user(self.test_user_2).review_user_count() + ) + # user 1 reject first tier + record1.reject_tier() + self.assertFalse(record1.can_review) + # both user 1 and 2 has nothing left in tray + self.assertFalse( + self.test_user_1.with_user(self.test_user_1).review_user_count() + ) + self.assertFalse( + self.test_user_2.with_user(self.test_user_2).review_user_count() + ) + + def test_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() + self.test_record.with_user(self.test_user_1.id) + records = self.env["tier.validation.tester"].search( + [("reviewer_ids", "=", False)] + ) + self.assertEqual(len(records), 0) + + def test_18_test_review_by_res_users_field(self): + selected_field = self.env["ir.model.fields"].search( + [("model", "=", self.test_model._name), ("name", "=", "user_id")] + ) + test_record = self.test_model.create( + {"test_field": 2.5, "user_id": self.test_user_2.id} + ) + + definition = self.env["tier.definition"].create( + { + "model_id": self.tester_model.id, + "review_type": "field", + "reviewer_field_id": selected_field.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "approve_sequence": True, + } + ) + + reviews = test_record.request_validation() + review = reviews.filtered(lambda r: r.definition_id == definition) + self.assertTrue(review) + self.assertEqual(review.reviewer_ids, self.test_user_2) + + def test_19_waiting_tier(self): + # Create new test record + tier_review_obj = self.env["tier.review"] + test_record = self.test_model.create({"test_field": 3.5}) + # Request validation + review = test_record.request_validation() + + self.assertTrue(review) + # both reviews should be waiting when created + review_1 = tier_review_obj.browse(review.ids[0]) + review_2 = tier_review_obj.browse(review.ids[1]) + self.assertTrue(review_1.status == "waiting") + self.assertTrue(review_2.status == "waiting") + # and then normal workflow will follow... + review_1.invalidate_model() + review_1._compute_can_review() + self.assertTrue(review_1.status == "pending") + # first reviewer does not want notifications + # chatter should be empty + self.assertFalse(test_record.message_ids) + self.assertTrue(review_1.done_by.id is False) + self.assertTrue(review_1.reviewed_date is False) + self.assertTrue(review_2.status == "waiting") + self.assertTrue(review_2.done_by.id is False) + self.assertTrue(review_2.reviewed_date is False) + record = test_record.with_user(self.test_user_1.id) + record.invalidate_model() + record.validate_tier() + self.assertTrue(review_1.status == "approved") + self.assertFalse(review_1.reviewed_date is False) + self.assertTrue(review_1.done_by.id == self.test_user_1.id) + self.assertTrue(review_2.status == "pending") + self.assertTrue(review_2.done_by.id is False) + self.assertTrue(review_2.reviewed_date is False) + + def test_20_no_sequence(self): + # Create new test record + tier_review_obj = self.env["tier.review"] + test_record2 = self.test_model.create({"test_field": 0.9}) + # request validation + review = test_record2.request_validation() + self.assertTrue(review) + review_1 = tier_review_obj.browse(review.ids[0]) + self.assertTrue(review_1.status == "waiting") + review_1.invalidate_model() + review_1._compute_can_review() + self.assertTrue(review_1.status == "pending") + msg2 = test_record2.message_ids[0].body + request = test_record2._notify_requested_review_body() + self.assertIn(request, msg2) + + def test_21_notify_on_create(self): + # notify on create + tier_definition = self.env["tier.definition"].search([]) + tier_definition.write( + { + "notify_on_create": True, + "notify_on_accepted": False, + "notify_on_rejected": False, + "notify_on_restarted": False, + "review_type": "group", + "reviewer_group_id": self.env.ref("base.group_system").id, + } + ) + test_record_1 = self.test_model.create({"test_field": 1}) + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + test_record_1.request_validation() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1 + 1) + + # do not notify on create + tier_definition.write({"notify_on_create": False}) + test_record_2 = self.test_model.create({"test_field": 1}) + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + test_record_2.request_validation() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1) + + def test_22_notify_on_accepted(self): + self.test_user_2.write( + { + "group_ids": [(6, 0, self.env.ref("base.group_system").ids)], + } + ) + + # notify on accepted + tier_definition = self.env["tier.definition"].search([]) + tier_definition.write( + { + "notify_on_create": False, + "notify_on_accepted": True, + "notify_on_rejected": False, + "notify_on_restarted": False, + "review_type": "group", + "reviewer_group_id": self.env.ref("base.group_system").id, + } + ) + test_record_1 = self.test_model.create({"test_field": 1}) + test_record_1.request_validation() + record = test_record_1.with_user(self.test_user_2.id) + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + record.validate_tier() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1 + 1) + + # do not notify on accepted + tier_definition.write({"notify_on_accepted": False}) + test_record_2 = self.test_model.create({"test_field": 1}) + test_record_2.request_validation() + test_record_2.with_user(self.test_user_2.id) + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + test_record_2.validate_tier() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1) + + def test_23_notify_on_rejected(self): + self.test_user_2.write( + { + "group_ids": [(6, 0, self.env.ref("base.group_system").ids)], + } + ) + + # notify on rejected + tier_definition = self.env["tier.definition"].search([]) + tier_definition.write( + { + "notify_on_create": False, + "notify_on_accepted": False, + "notify_on_rejected": True, + "notify_on_restarted": False, + "review_type": "group", + "reviewer_group_id": self.env.ref("base.group_system").id, + } + ) + test_record_1 = self.test_model.create({"test_field": 1}) + test_record_1.request_validation() + record = test_record_1.with_user(self.test_user_2.id) + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + record.reject_tier() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1 + 1) + + # do not notify on rejected + tier_definition.write({"notify_on_rejected": False}) + test_record_2 = self.test_model.create({"test_field": 1}) + test_record_2.request_validation() + test_record_2.with_user(self.test_user_2.id) + + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + test_record_2.reject_tier() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1) + + def test_24_notify_on_restarted(self): + self.test_user_2.write( + { + "group_ids": [(6, 0, self.env.ref("base.group_system").ids)], + } + ) + + # notify on restarted + tier_definition = self.env["tier.definition"].search([]) + tier_definition.write( + { + "notify_on_create": False, + "notify_on_accepted": False, + "notify_on_rejected": False, + "notify_on_restarted": True, + "review_type": "group", + "reviewer_group_id": self.env.ref("base.group_system").id, + } + ) + test_record_1 = self.test_model.create({"test_field": 1}) + test_record_1.request_validation() + record = test_record_1.with_user(self.test_user_2.id) + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + record.restart_validation() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1 + 1) + + # do not notify on restarted + tier_definition.write({"notify_on_restarted": False}) + test_record_2 = self.test_model.create({"test_field": 1}) + test_record_2.request_validation() + test_record_2.with_user(self.test_user_2.id) + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + test_record_2.restart_validation() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1) + + def test_25_all_notification(self): + self.test_user_2.write( + { + "group_ids": [(6, 0, self.env.ref("base.group_system").ids)], + } + ) + + # notify on restarted + tier_definition = self.env["tier.definition"].search([]) + tier_definition.write( + { + "notify_on_create": True, + "notify_on_accepted": True, + "notify_on_rejected": True, + "notify_on_restarted": True, + "review_type": "group", + "reviewer_group_id": self.env.ref("base.group_system").id, + } + ) + + test_record = self.test_model.create({"test_field": 1}) + + # request validation + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + test_record.request_validation() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1 + 1) + + # accept validation + record = test_record.with_user(self.test_user_2.id) + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + record.validate_tier() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1 + 1) + + # restart validation + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + record.restart_validation() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1 + 1) + + # reject validation + record.request_validation() + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + record.reject_tier() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1 + 1) + + def test_26_no_notification(self): + self.test_user_2.write( + { + "group_ids": [(6, 0, self.env.ref("base.group_system").ids)], + } + ) + + # notify on restarted + tier_definition = self.env["tier.definition"].search([]) + tier_definition.write( + { + "notify_on_create": False, + "notify_on_accepted": False, + "notify_on_rejected": False, + "notify_on_restarted": False, + "review_type": "group", + "reviewer_group_id": self.env.ref("base.group_system").id, + } + ) + + test_record = self.test_model.create({"test_field": 1}) + + # request validation + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + test_record.request_validation() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1) + + # accept validation + record = test_record.with_user(self.test_user_2.id) + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + record.validate_tier() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1) + + # restart validation + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + record.restart_validation() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1) + + # reject validation + record.request_validation() + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + record.reject_tier() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1) + + def test_27_change_field_exception_validation(self): + """Test under and after validations""" + # Cannot create `tier.validation.exception` records because + # `tier.validation.tester` are fake model and its fields are + # not propagated to the DDBB and cannot read from `ir.model.fields`. + # We will use the mock.patch instead. + _tvf = ["test_validation_field"] + _rv = _tvf + BEF + self.assertEqual(self.test_record.test_validation_field, 0) + self.assertFalse(self.test_record.review_ids) + reviews = self.test_record.with_user(self.test_user_2.id).request_validation() + self.assertTrue(reviews) + self.assertTrue(self.test_record.review_ids) + # Unable to write test_validation_field under validation + with self.assertRaises(ValidationError): + self.test_record.with_user(self.test_user_2.id).write( + {"test_validation_field": 1} + ) + # Able to write test_validation_field under validation + with mock.patch.object( + TV, "_get_under_validation_exceptions", return_value=_rv + ): + self.test_record.with_user(self.test_user_2.id).write( + {"test_validation_field": 2} + ) + self.assertEqual(self.test_record.test_validation_field, 2) + # Validate record + record = self.test_record.with_user(self.test_user_1.id) + record.validate_tier() + record.action_confirm() + self.assertEqual(record.validation_status, "validated") + # Unable to write test_validation_field after validation + with self.assertRaises(ValidationError): + # Simulate there are fields, but not test_validation_field + with mock.patch.object(TV, "_get_validation_exceptions", return_value=BEF): + self.test_record.with_user(self.test_user_2.id).write( + {"test_validation_field": 3} + ) + # Able to write test_validation_field after validation + with mock.patch.multiple( + TV, + _get_validation_exceptions=mock.MagicMock(return_value=_tvf), + _get_after_validation_exceptions=mock.MagicMock(return_value=_rv), + ): + self.test_record.with_user(self.test_user_2.id).write( + {"test_validation_field": 4} + ) + self.assertEqual(self.test_record.test_validation_field, 4) + + def test_28_computed_state_field(self): + """Test the regular flow on a model where state is a computed field""" + # The record cannot be confirmed without validation + with self.assertRaisesRegex( + ValidationError, + "This action needs to be validated", + ): + with self.env.cr.savepoint(): + self.test_record_computed.action_confirm() + # Flush manually to trigger the _write + self.test_record_computed.flush_recordset() + self.assertEqual(self.test_record_computed.state, "draft") + # The validation is performed + self.test_record_computed.request_validation() + self.test_record_computed.invalidate_recordset() + self.assertEqual(self.test_record_computed.review_ids.status, "waiting") + self.test_record_computed.with_user(self.test_user_1).validate_tier() + self.test_record_computed.invalidate_recordset() + self.assertEqual(self.test_record_computed.review_ids.status, "approved") + # After validation, the record can be confirmed + self.test_record_computed.action_confirm() + self.test_record_computed.flush_recordset() + self.assertEqual(self.test_record_computed.state, "confirmed") + # After cancelling, the reviews are removed + self.test_record_computed.action_cancel() + self.test_record_computed.flush_recordset() + self.assertFalse(self.test_record_computed.review_ids) + self.test_record_computed.invalidate_recordset() + + def test_29_allow_write_for_reviewers(self): + reviews = self.test_record.with_user(self.test_user_2.id).request_validation() + record = self.test_record.with_user(self.test_user_1.id) + record.invalidate_recordset() + with self.assertRaises(ValidationError): + record.with_user(self.test_user_1.id).write({"test_field": 0.3}) + reviews.definition_id.with_user(self.test_user_1.id).write( + {"allow_write_for_reviewer": True} + ) + record.with_user(self.test_user_1.id).write({"test_field": 0.3}) + + def test_30_request_validation_diff_company(self): + """ + Test validation request behavior with multi-company setup. + + Setup: + - Main company has 2 tier definitions: + - One for User1 (sequence 30) + - One for User3 (sequence 20) + - Other company has 1 tier definition: + - One for User3 (sequence 30) + + When record's company is set to 'other company': + - Only User3's tier definition from other company should be applied + - Should create only 1 review + """ + self.assertFalse(self.test_record_2.review_ids) + self.assertFalse(self.test_record_2.company_id) + self.assertEqual(self.test_user_3_multi_company.env.company, self.main_company) + + self.test_record_2.company_id = self.other_company + + reviews = self.test_record_2.with_user( + self.test_user_3_multi_company.id + ).request_validation() + + self.assertEqual(len(reviews), 1) + + def test_31_request_validation_same_company(self): + """ + Test validation request behavior with multi-company setup. + + Setup: + - Main company has 2 tier definitions: + - One for User1 (sequence 30) + - One for User3 (sequence 20) + - Other company has 1 tier definition: + - One for User3 (sequence 30) + + When record's company is set to 'main company': + - Both User1 and User3's tier definitions from main company should be applied + - Should create 2 reviews + """ + self.assertFalse(self.test_record_2.review_ids) + self.assertFalse(self.test_record_2.company_id) + self.assertEqual(self.test_user_3_multi_company.env.company, self.main_company) + + self.test_record_2.company_id = self.main_company + + reviews = self.test_record_2.with_user( + self.test_user_3_multi_company.id + ).request_validation() + + self.assertEqual(len(reviews), 2) + + def test_30_request_validation(self): + # Create new test record + test_record = self.test_model.create({"test_field": 1.0}) + # Create tier definitions for both tester models + self.tier_definition.write( + { + "approve_sequence": True, + "notify_on_create": True, + } + ) + def_2 = self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_2.id, + "sequence": 20, + "approve_sequence": True, + "notify_on_create": False, + "notify_on_accepted": True, + } + ) + def_3 = self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_3_multi_company.id, + "sequence": 10, + "approve_sequence": True, + "notify_on_create": False, + "notify_on_accepted": True, + } + ) + mt_tier_validation_requested = self.env.ref( + "base_tier_validation.mt_tier_validation_requested" + ) + mt_tier_validation_accepted = self.env.ref( + "base_tier_validation.mt_tier_validation_accepted" + ) + test_record.request_validation() + review_1 = test_record.review_ids.filtered( + lambda x: x.definition_id == self.tier_definition + ) + self.assertEqual(review_1.status, "pending") + review_2 = test_record.review_ids.filtered(lambda x: x.definition_id == def_2) + self.assertEqual(review_2.status, "waiting") + review_3 = test_record.review_ids.filtered(lambda x: x.definition_id == def_3) + self.assertEqual(review_3.status, "waiting") + followers = test_record.message_follower_ids + self.assertIn(self.test_user_1.partner_id, followers.mapped("partner_id")) + follower_1 = followers.filtered( + lambda x: x.partner_id == self.test_user_1.partner_id + ) + self.assertIn(mt_tier_validation_requested, follower_1.subtype_ids) + self.assertNotIn(mt_tier_validation_accepted, follower_1.subtype_ids) + self.assertNotIn(self.test_user_2.partner_id, followers.mapped("partner_id")) + self.assertNotIn( + self.test_user_3_multi_company.partner_id, followers.mapped("partner_id") + ) + old_messages = test_record.message_ids + test_record.with_user(self.test_user_1).validate_tier() + new_messages = test_record.message_ids - old_messages + self.assertEqual(len(new_messages), 1) + self.assertEqual(new_messages.subtype_id, mt_tier_validation_accepted) + self.assertEqual(self.test_user_2.partner_id, new_messages.notified_partner_ids) + self.assertEqual(review_1.status, "approved") + self.assertEqual(review_2.status, "pending") + self.assertEqual(review_3.status, "waiting") + followers = test_record.message_follower_ids + self.assertIn(self.test_user_1.partner_id, followers.mapped("partner_id")) + self.assertIn(self.test_user_2.partner_id, followers.mapped("partner_id")) + follower_2 = followers.filtered( + lambda x: x.partner_id == self.test_user_2.partner_id + ) + self.assertNotIn(mt_tier_validation_requested, follower_2.subtype_ids) + self.assertIn(mt_tier_validation_accepted, follower_2.subtype_ids) + self.assertNotIn( + self.test_user_3_multi_company.partner_id, followers.mapped("partner_id") + ) + old_messages = test_record.message_ids + test_record.with_user(self.test_user_2).validate_tier() + new_messages = test_record.message_ids - old_messages + self.assertEqual(len(new_messages), 1) + self.assertEqual(new_messages.subtype_id, mt_tier_validation_accepted) + self.assertEqual( + self.test_user_3_multi_company.partner_id, new_messages.notified_partner_ids + ) + self.assertEqual(review_1.status, "approved") + self.assertEqual(review_2.status, "approved") + self.assertEqual(review_3.status, "pending") + followers = test_record.message_follower_ids + self.assertIn(self.test_user_1.partner_id, followers.mapped("partner_id")) + self.assertIn(self.test_user_2.partner_id, followers.mapped("partner_id")) + self.assertIn( + self.test_user_3_multi_company.partner_id, followers.mapped("partner_id") + ) + follower_3 = followers.filtered( + lambda x: x.partner_id == self.test_user_3_multi_company.partner_id + ) + self.assertNotIn(mt_tier_validation_requested, follower_3.subtype_ids) + self.assertIn(mt_tier_validation_accepted, follower_3.subtype_ids) + old_messages = test_record.message_ids + test_record.with_user(self.test_user_3_multi_company).validate_tier() + new_messages = test_record.message_ids - old_messages + self.assertEqual(len(new_messages), 0) + + def test_31_request_validation(self): + # Create new test record + test_record = self.test_model.create({"test_field": 1.0}) + # Create tier definitions for both tester models + self.tier_definition.write( + { + "approve_sequence": True, + "notify_on_create": True, + } + ) + def_2 = self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_2.id, + "sequence": 20, + "approve_sequence": True, + "notify_on_create": True, + "notify_on_accepted": True, + } + ) + def_3 = self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_3_multi_company.id, + "sequence": 10, + "approve_sequence": True, + "notify_on_create": True, + "notify_on_accepted": True, + } + ) + test_record.request_validation() + review_1 = test_record.review_ids.filtered( + lambda x: x.definition_id == self.tier_definition + ) + self.assertEqual(review_1.status, "pending") + review_2 = test_record.review_ids.filtered(lambda x: x.definition_id == def_2) + self.assertEqual(review_2.status, "waiting") + review_3 = test_record.review_ids.filtered(lambda x: x.definition_id == def_3) + self.assertEqual(review_3.status, "waiting") + followers = test_record.message_follower_ids + self.assertIn(self.test_user_1.partner_id, followers.mapped("partner_id")) + self.assertIn(self.test_user_2.partner_id, followers.mapped("partner_id")) + self.assertIn( + self.test_user_3_multi_company.partner_id, followers.mapped("partner_id") + ) + + def test_32_test_review_by_res_groups_field(self): + """Test using field-based validation with groups""" + selected_field = self.env["ir.model.fields"].search( + [("model", "=", self.test_model._name), ("name", "=", "group_id")] + ) + test_record = self.test_model.create( + {"test_field": 2.5, "group_id": self.test_group.id} + ) + + definition = self.env["tier.definition"].create( + { + "model_id": self.tester_model.id, + "review_type": "field", + "reviewer_field_id": selected_field.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "approve_sequence": True, + } + ) + + reviews = test_record.request_validation() + review = reviews.filtered(lambda r: r.definition_id == definition) + self.assertTrue(review) + self.assertEqual(review.reviewer_ids, self.test_user_2 | self.test_user_1) + + def test_33_test_review_by_wrong_field_type(self): + """Test using field-based validation with groups""" + selected_field = self.env["ir.model.fields"].search( + [("model", "=", self.test_model._name), ("name", "=", "menu_id")] + ) + test_record = self.test_model.create( + { + "test_field": 2.5, + "menu_id": self.env["ir.ui.menu"].search([], limit=1).id, + } + ) + self.assertTrue(test_record.menu_id) + self.env["tier.definition"].create( + { + "model_id": self.tester_model.id, + "review_type": "field", + "reviewer_field_id": selected_field.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "approve_sequence": True, + } + ) + with self.assertRaisesRegex( + ValidationError, + "Validation reviewer field should be of the appropriate type", + ): + test_record.request_validation() + + +@tagged("at_install") +class TierTierValidationView(CommonTierValidation): + def test_view_manual(self): + view = self.env[self.test_record._name].get_view(False, "form") + with Form(self.test_record) as f: + self.assertNotIn("review_ids", f._values) + form = etree.fromstring(view["arch"]) + self.assertFalse(form.xpath("//field[@name='review_ids']")) + self.assertFalse(form.xpath("//field[@name='can_review']")) + self.assertFalse(form.xpath("//button[@name='request_validation']")) + + def test_view_automatic(self): + view = self.env[self.test_record_2._name].get_view(False, "form") + with Form(self.test_record_2) as f: + self.assertIn("review_ids", f._values) + form = etree.fromstring(view["arch"]) + self.assertTrue(form.xpath("//field[@name='review_ids']")) + self.assertTrue(form.xpath("//field[@name='can_review']")) + self.assertTrue(form.xpath("//button[@name='request_validation']")) + + def test_get_view(self): + view = self.test_record_2.get_view() + model = "tier.validation.tester2" + self.assertEqual(view["model"], model) + self.assertEqual(view["models"].keys(), {model, "tier.review"}) + self.assertIn("id", view["models"][model]) + self.assertIn("need_validation", view["models"][model]) + self.assertIn("next_review", view["models"][model]) + self.assertIn("review_ids", view["models"][model]) diff --git a/base_tier_validation/tests/test_tier_validation_reminder.py b/base_tier_validation/tests/test_tier_validation_reminder.py new file mode 100644 index 00000000..08979a58 --- /dev/null +++ b/base_tier_validation/tests/test_tier_validation_reminder.py @@ -0,0 +1,46 @@ +# Copyright 2018-19 ForgeFlow S.L. (https://www.forgeflow.com) +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from freezegun import freeze_time + +from odoo import fields +from odoo.tests.common import tagged + +from .common import CommonTierValidation + + +@tagged("post_install", "-at_install") +class TierTierValidation(CommonTierValidation): + def test_validation_reminder(self): + """Check the posting of reminder to reviews.""" + tier_definition = self.tier_definition + tier_definition.notify_reminder_delay = 3 + + # Request a review today + self.test_record.with_user(self.test_user_2.id).request_validation() + review = self.env["tier.review"].search( + [("definition_id", "=", tier_definition.id)] + ) + self.assertTrue(review) + self.assertEqual(review.last_reminder_date, False) + + # 2 days later no reminder should be posted + in_2_days = fields.Datetime.add(fields.Datetime.now(), days=2) + with freeze_time(in_2_days): + tier_definition._cron_send_review_reminder() + self.assertEqual(review.last_reminder_date, False) + # 4 days later first reminder + in_4_days = fields.Datetime.add(fields.Datetime.now(), days=4) + with freeze_time(in_4_days): + self.tier_definition._cron_send_review_reminder() + self.assertEqual(review.last_reminder_date, in_4_days) + # 5 days later no new reminder + in_6_days = fields.Datetime.add(fields.Datetime.now(), days=6) + with freeze_time(in_6_days): + self.tier_definition._cron_send_review_reminder() + self.assertEqual(review.last_reminder_date, in_4_days) + # 9 days later second reminder + in_9_days = fields.Datetime.add(fields.Datetime.now(), days=9) + with freeze_time(in_9_days): + self.tier_definition._cron_send_review_reminder() + self.assertEqual(review.last_reminder_date, in_9_days) diff --git a/base_tier_validation/tests/tier_validation_tester.py b/base_tier_validation/tests/tier_validation_tester.py new file mode 100644 index 00000000..85cc08a8 --- /dev/null +++ b/base_tier_validation/tests/tier_validation_tester.py @@ -0,0 +1,118 @@ +# Copyright 2018-19 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class TierValidationTester(models.Model): + _name = "tier.validation.tester" + _description = "Tier Validation Tester" + _inherit = ["tier.validation", "mail.thread"] + _tier_validation_manual_config = True + + state = fields.Selection( + selection=[ + ("draft", "Draft"), + ("confirmed", "Confirmed"), + ("cancel", "Cancel"), + ], + default="draft", + ) + test_validation_field = fields.Integer(default=0) + test_field = fields.Float() + user_id = fields.Many2one(string="Assigned to:", comodel_name="res.users") + group_id = fields.Many2one("res.groups", string="Assigned to (group)") + menu_id = fields.Many2one( + "ir.ui.menu", help="For testing choosing a wrong field type" + ) + + def action_confirm(self): + self.write({"state": "confirmed"}) + + +class TierValidationTester2(models.Model): + _name = "tier.validation.tester2" + _description = "Tier Validation Tester 2" + _inherit = ["tier.validation"] + _tier_validation_manual_config = False + + state = fields.Selection( + selection=[ + ("draft", "Draft"), + ("confirmed", "Confirmed"), + ("cancel", "Cancel"), + ], + default="draft", + ) + test_field = fields.Float() + test_validation_field = fields.Float() + user_id = fields.Many2one(string="Assigned to:", comodel_name="res.users") + company_id = fields.Many2one(comodel_name="res.company") + + def action_confirm(self): + self.write({"state": "confirmed"}) + + +class TierValidationTesterComputed(models.Model): + _name = "tier.validation.tester.computed" + _description = "Tier Validation Tester Computed" + _inherit = ["tier.validation"] + _tier_validation_manual_config = False + _tier_validation_state_field_is_computed = True + + confirmed = fields.Boolean() + cancelled = fields.Boolean() + state = fields.Selection( + selection=[ + ("draft", "Draft"), + ("confirmed", "Confirmed"), + ("cancel", "Cancel"), + ], + compute="_compute_state", + store=True, + ) + test_field = fields.Float() + test_validation_field = fields.Float() + user_id = fields.Many2one(string="Assigned to:", comodel_name="res.users") + + @api.model + def _get_after_validation_exceptions(self): + return super()._get_after_validation_exceptions() + [ + "confirmed", + "cancelled", + ] + + @api.model + def _get_under_validation_exceptions(self): + return super()._get_under_validation_exceptions() + [ + "confirmed", + "cancelled", + ] + + @api.depends("confirmed", "cancelled") + def _compute_state(self): + for rec in self: + if rec.cancelled: + rec.state = "cancel" + elif rec.confirmed: + rec.state = "confirmed" + else: + rec.state = "draft" + + def action_confirm(self): + self.write({"confirmed": True}) + + def action_cancel(self): + self.write({"cancelled": True}) + + +class TierDefinition(models.Model): + _inherit = "tier.definition" + + @api.model + def _get_tier_validation_model_names(self): + res = super()._get_tier_validation_model_names() + res.append("tier.validation.tester") + res.append("tier.validation.tester2") + res.append("tier.validation.tester.computed") + return res diff --git a/base_tier_validation/views/res_config_settings_views.xml b/base_tier_validation/views/res_config_settings_views.xml new file mode 100644 index 00000000..0c3cbd92 --- /dev/null +++ b/base_tier_validation/views/res_config_settings_views.xml @@ -0,0 +1,54 @@ + + + + + + res.config.settings.view.form.budget + res.config.settings + + + + +
+ + + +
+ Option to use python formula to get reviewers and find documents +
+
+ + + +
+
+
+
+
+
diff --git a/base_tier_validation/views/tier_definition_view.xml b/base_tier_validation/views/tier_definition_view.xml new file mode 100644 index 00000000..26d7422e --- /dev/null +++ b/base_tier_validation/views/tier_definition_view.xml @@ -0,0 +1,162 @@ + + + + + tier.definition.list + tier.definition + + + + + + + + + + + + + + + + + + + tier.definition.form + tier.definition + +
+ +
+ +
+ Name +

+ +

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

Create a new Validation Exception!

+

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

+
    +
  • It's in the validation process
  • +
  • It's fully validated
  • +
+
+
+ + +
diff --git a/base_tier_validation/wizard/__init__.py b/base_tier_validation/wizard/__init__.py new file mode 100644 index 00000000..92bd0df5 --- /dev/null +++ b/base_tier_validation/wizard/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import comment_wizard diff --git a/base_tier_validation/wizard/comment_wizard.py b/base_tier_validation/wizard/comment_wizard.py new file mode 100644 index 00000000..5c5a6c93 --- /dev/null +++ b/base_tier_validation/wizard/comment_wizard.py @@ -0,0 +1,25 @@ +# Copyright 2019 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class CommentWizard(models.TransientModel): + _name = "comment.wizard" + _description = "Comment Wizard" + + validate_reject = fields.Char() + res_model = fields.Char() + res_id = fields.Integer() + review_ids = fields.Many2many(comodel_name="tier.review") + comment = fields.Char(required=True) + + def add_comment(self): + self.ensure_one() + rec = self.env[self.res_model].browse(self.res_id) + self.review_ids.write({"comment": self.comment}) + if self.validate_reject == "validate": + rec._validate_tier(self.review_ids) + if self.validate_reject == "reject": + rec._rejected_tier(self.review_ids) + rec._update_counter({"review_deleted": True}) diff --git a/base_tier_validation/wizard/comment_wizard_view.xml b/base_tier_validation/wizard/comment_wizard_view.xml new file mode 100644 index 00000000..70c1a928 --- /dev/null +++ b/base_tier_validation/wizard/comment_wizard_view.xml @@ -0,0 +1,26 @@ + + + + + Comment Wizard + comment.wizard + form + +
+ + + +
+
+
+
+
+
diff --git a/base_user_role/README.rst b/base_user_role/README.rst new file mode 100644 index 00000000..6ae4a1bd --- /dev/null +++ b/base_user_role/README.rst @@ -0,0 +1,179 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +========== +User roles +========== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:b3aa00f609d45dcd82a69b2a3e13b327096ab1d25883b543e3e45538e854d40c + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png + :target: https://odoo-community.org/page/development-status + :alt: Production/Stable +.. |badge2| image:: https://img.shields.io/badge/license-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--backend-lightgray.png?logo=github + :target: https://github.com/OCA/server-backend/tree/18.0/base_user_role + :alt: OCA/server-backend +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/server-backend-18-0/server-backend-18-0-base_user_role + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/server-backend&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module was written to extend the standard functionality regarding +users and groups management. It helps creating well-defined user roles +and associating them to users. + +It can become very hard to maintain a large number of user profiles over +time, juggling with many technical groups. For this purpose, this module +will help you to: + + - define functional roles by aggregating low-level groups, + - set user accounts with the predefined roles (roles are cumulative), + - update groups of all relevant user accounts (all at once), + - ensure that user accounts will have the groups defined in their + roles (nothing more, nothing less). In other words, you can not set + groups manually on a user as long as there is roles configured on + it, + - activate/deactivate roles depending on the date (useful to plan + holidays, etc) + - get a quick overview of roles and the related user accounts. + +That way you make clear the different responsabilities within a company, +and are able to add and update user accounts in a scalable and reliable +way. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To configure this module, you need to go to *Settings / Users / Roles*, +and create a new role. From there, you can add groups to compose your +role, and then associate users to it. + +You can also define default roles for a new user by editing the user +called "Default User". + +Roles: + +|image1| + +Add groups: + +|image2| + +Add users (with dates or not): + +|image3| + +Instead of creating roles from scratch, it is possible to create a role +based on the groups of an existing user: select or open the user and +choose "Create role from user" in the action menu. + +.. |image1| image:: https://raw.githubusercontent.com/OCA/server-backend/16.0/base_user_role/static/description/roles.png +.. |image2| image:: https://raw.githubusercontent.com/OCA/server-backend/16.0/base_user_role/static/description/role_groups.png +.. |image3| image:: https://raw.githubusercontent.com/OCA/server-backend/16.0/base_user_role/static/description/role_users.png + +Usage +===== + +To use this module, you need to: + +1. Go to Configuration / Users / Users choose user and set Roles: + +|image| + +.. |image| image:: https://raw.githubusercontent.com/OCA/server-backend/base_user_role/static/description/user_form.png + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* ABF OSIELL + +Contributors +------------ + +- Sébastien Alix +- Duc, Dao Dong + (https://komit-consulting.com) +- Jean-Charles Drubay + (https://komit-consulting.com) +- Alan Ramos (https://www.jarsa.com.mx) +- Harald Panten +- Kevin Khao +- Tatiana Deribina (https://sprintit.fi) +- Guillem Casassas +- Guillaume Pothier + +Do not contact contributors directly about support or help with +technical issues. + +Other credits +------------- + +Images +~~~~~~ + +- Oxygen Team: + `Icon `__ + (LGPL) + +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-sebalix| image:: https://github.com/sebalix.png?size=40px + :target: https://github.com/sebalix + :alt: sebalix +.. |maintainer-jcdrubay| image:: https://github.com/jcdrubay.png?size=40px + :target: https://github.com/jcdrubay + :alt: jcdrubay +.. |maintainer-novawish| image:: https://github.com/novawish.png?size=40px + :target: https://github.com/novawish + :alt: novawish + +Current `maintainers `__: + +|maintainer-sebalix| |maintainer-jcdrubay| |maintainer-novawish| + +This module is part of the `OCA/server-backend `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/base_user_role/__init__.py b/base_user_role/__init__.py new file mode 100644 index 00000000..aee8895e --- /dev/null +++ b/base_user_role/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizards diff --git a/base_user_role/__manifest__.py b/base_user_role/__manifest__.py new file mode 100644 index 00000000..624677cd --- /dev/null +++ b/base_user_role/__manifest__.py @@ -0,0 +1,30 @@ +# Copyright 2014 ABF OSIELL +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + + +{ + "name": "User roles", + "version": "19.0.1.0.5", + "category": "Tools", + "author": "ABF OSIELL, Odoo Community Association (OCA)", + "license": "LGPL-3", + "development_status": "Production/Stable", + "maintainers": ["sebalix", "jcdrubay", "novawish"], + "website": "https://github.com/OCA/server-backend", + "depends": ["base"], + "data": [ + "security/ir.model.access.csv", + "data/ir_cron.xml", + "data/ir_module_category.xml", + "wizards/role_add_users_wizard_views.xml", + "views/role.xml", + "views/user.xml", + "views/group.xml", + "wizards/create_from_user.xml", + "wizards/wizard_groups_into_role.xml", + ], + "demo": [ + "demo/demo.xml", + ], + "installable": True, +} diff --git a/base_user_role/data/ir_cron.xml b/base_user_role/data/ir_cron.xml new file mode 100644 index 00000000..a2950d69 --- /dev/null +++ b/base_user_role/data/ir_cron.xml @@ -0,0 +1,15 @@ + + + + + Update user roles + 3 + hours + True + + code + model.cron_update_users() + + diff --git a/base_user_role/data/ir_module_category.xml b/base_user_role/data/ir_module_category.xml new file mode 100644 index 00000000..21049378 --- /dev/null +++ b/base_user_role/data/ir_module_category.xml @@ -0,0 +1,15 @@ + + + + + + User roles + + diff --git a/base_user_role/demo/demo.xml b/base_user_role/demo/demo.xml new file mode 100644 index 00000000..9344780b --- /dev/null +++ b/base_user_role/demo/demo.xml @@ -0,0 +1,18 @@ + + + + + + + + Менеджер по продажам (демо) + + + + + Бухгалтер (демо) + + + + diff --git a/base_user_role/i18n/am.po b/base_user_role/i18n/am.po new file mode 100644 index 00000000..dd156b7f --- /dev/null +++ b/base_user_role/i18n/am.po @@ -0,0 +1,428 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Amharic (https://www.transifex.com/oca/teams/23907/am/)\n" +"Language: am\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Creado en" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Última actualización en" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" diff --git a/base_user_role/i18n/ar.po b/base_user_role/i18n/ar.po new file mode 100644 index 00000000..e572a5bd --- /dev/null +++ b/base_user_role/i18n/ar.po @@ -0,0 +1,434 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +# SaFi J. , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: SaFi J. , 2016\n" +"Language-Team: Arabic (https://www.transifex.com/oca/teams/23907/ar/)\n" +"Language: ar\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "أنشئ بواسطة" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "أنشئ في" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "اسم العرض" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "المعرف" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "آخر تحديث بواسطة" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "آخر تحديث في" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "الاسم" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "المستخدم" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "المستخدمون" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +#, fuzzy +msgid "Users list" +msgstr "المستخدمون" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "طرق العرض" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "آخر تعديل في" diff --git a/base_user_role/i18n/base_user_role.pot b/base_user_role/i18n/base_user_role.pot new file mode 100644 index 00000000..fe7fea4f --- /dev/null +++ b/base_user_role/i18n/base_user_role.pot @@ -0,0 +1,423 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.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_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to" +" this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is" +" inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" diff --git a/base_user_role/i18n/bg.po b/base_user_role/i18n/bg.po new file mode 100644 index 00000000..aa393864 --- /dev/null +++ b/base_user_role/i18n/bg.po @@ -0,0 +1,431 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Bulgarian (https://www.transifex.com/oca/teams/23907/bg/)\n" +"Language: bg\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Създадено от" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Създадено на" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Име за показване" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Последно обновено от" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Последно обновено на" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Име" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Изгледи" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Последно обновено на" diff --git a/base_user_role/i18n/bs.po b/base_user_role/i18n/bs.po new file mode 100644 index 00000000..be8d2802 --- /dev/null +++ b/base_user_role/i18n/bs.po @@ -0,0 +1,432 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Bosnian (https://www.transifex.com/oca/teams/23907/bs/)\n" +"Language: bs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Kreirao" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Kreirano" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Prikaži naziv" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Zadnji ažurirao" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Zadnje ažurirano" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Ime" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Korisnik" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Pogledi" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Zadnje mijenjano" diff --git a/base_user_role/i18n/ca.po b/base_user_role/i18n/ca.po new file mode 100644 index 00000000..19db5c20 --- /dev/null +++ b/base_user_role/i18n/ca.po @@ -0,0 +1,442 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-08-01 02:44+0000\n" +"PO-Revision-Date: 2022-04-13 12:05+0000\n" +"Last-Translator: pablontura \n" +"Language-Team: Catalan (https://www.transifex.com/oca/teams/23907/ca/)\n" +"Language: ca\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_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "Controls d'accés" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "Menú d'accés" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "Aplicació" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "Categoria associada" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "Grup associat" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "Categoria del grup associat" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "Índex de colors" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Creat per" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Creat el" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Veure el nom" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "Habilitat" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "De" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "Nom del grup" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" +"Grup creat per establir drets d'accés per compartir dades amb alguns usuaris." + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "Grups" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "Hereta" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "Notes internes" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Darrera Actualització per" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Darrera Actualització el" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Nom" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "Rol" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "Línies de rol" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "Normes" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "Comparteix el grup" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "A" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "Hereta transitivament" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "Actualitzar els rols d'usuari" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Usuari" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "Rols d'usuari" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "Usuaris" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "Usuaris associats a un rol" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "Llista d'usuaris" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "Els usuaris d'aquest grup hereten automàticament aquests grups" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Vistes" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Roles" +#~ msgstr "Rols" + +#~ msgid "Roles can be assigned to a user only once at a time" +#~ msgstr "Els rols es poden assignar a un usuari només una vegada a la vegada" + +#~ msgid "User role" +#~ msgstr "Rol d'usuari" + +#~ msgid "Last Modified on" +#~ msgstr "Darrera modificació el" diff --git a/base_user_role/i18n/cs.po b/base_user_role/i18n/cs.po new file mode 100644 index 00000000..0145397b --- /dev/null +++ b/base_user_role/i18n/cs.po @@ -0,0 +1,432 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +# Jaroslav Helemik Nemec , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: Jaroslav Helemik Nemec , 2016\n" +"Language-Team: Czech (https://www.transifex.com/oca/teams/23907/cs/)\n" +"Language: cs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Vytvořil(a)" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Vytvořeno" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Zobrazovaný název" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Naposled upraveno" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Naposled upraveno" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Název" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Uživatel" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Zobrazení" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Naposled upraveno" diff --git a/base_user_role/i18n/da.po b/base_user_role/i18n/da.po new file mode 100644 index 00000000..1e4ccc5a --- /dev/null +++ b/base_user_role/i18n/da.po @@ -0,0 +1,449 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2018-08-30 08:00+0000\n" +"Last-Translator: Hans Henrik Gabelgaard \n" +"Language-Team: Danish (https://www.transifex.com/oca/teams/23907/da/)\n" +"Language: da\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.1.1\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "Adgangskontrol" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "Menu adgang" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "Applikation" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +#, fuzzy +msgid "Associated category" +msgstr "Tilhørende gruppe" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "Tilhørende gruppe" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +#, fuzzy +msgid "Associated group's category" +msgstr "Tilhørende gruppe" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "Farve indeks" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "Kommentar" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Oprettet af" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Oprettet den" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Vist navn" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "Slået til" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "Fra" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "Gruppenavn" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" +"Gruppe oprettet for at sætte adgangsrettigheder for deling af data med " +"udvalgte brugere." + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "Grupper" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "Id" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "Arver" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Sidst opdateret af" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Sidst opdateret den" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Navn" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "Rolle" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "Rollelinier" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "Regler" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "Gruppe for data deling" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "Til" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "Transitivt arver" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "Opdater brugerroller" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Bruger" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "Brugerroller" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "Brugere" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "Brugere tilknyttet til en rolle" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +#, fuzzy +msgid "Users list" +msgstr "Brugerroller" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "Bruger af denne gruppe arver automatisk disse grupper" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Oversigter" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Roles" +#~ msgstr "Roller" + +#~ msgid "User role" +#~ msgstr "Brugerrolle" + +#~ msgid "Last Modified on" +#~ msgstr "Sidst ændret den" + +#~ msgid "If checked, this group is usable as a portal." +#~ msgstr "Hvis slået til kan denne gruppe anvendes som portal." + +#~ msgid "Portal" +#~ msgstr "Portal" diff --git a/base_user_role/i18n/de.po b/base_user_role/i18n/de.po new file mode 100644 index 00000000..93372312 --- /dev/null +++ b/base_user_role/i18n/de.po @@ -0,0 +1,445 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2017 +# Rudolf Schnapka , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-05-10 00:47+0000\n" +"PO-Revision-Date: 2025-10-28 12:42+0000\n" +"Last-Translator: c2cdidier \n" +"Language-Team: German (https://www.transifex.com/oca/teams/23907/de/)\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.10.4\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "Benutzerrollen" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "%s (Kopie)" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" +"Alle hier vorgenommenen Konfigurationsänderungen werden nicht dauerhaft " +"gespeichert." + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" +"Die Zugriffsrechte dieses Benutzers werden über Rollen verwaltet." + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "Maximale Gültigkeitsdauer von API-Schlüsseln in Tagen" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "Zugriffskontrolle" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "Zugriffsgruppen" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "Menüzugriff" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "Berechtigungen" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "Aktiv" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "Anwendung" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "Benutzer zuweisen" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "Zugewiesene Gruppe" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "Zugewiesene Gruppe" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "Kategorie der zugehörigen Gruppe" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "Abbrechen" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "Schliessen" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "Farbindex" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "Bemerkung" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "Erstellen" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "Rolle erstellen" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "Rolle aus Benutzer erstellen" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "Rolle aus Benutzerassistent erstellen" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Erstellt von" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Erstellt am" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" +"Legt die maximale Gültigkeitsdauer eines API-Schlüssels fest, der von einem " +"Benutzer dieser Gruppe erstellt wurde." + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Anzeigename" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "Aktiviert" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "Ab" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "Gruppenname" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" +"Gruppe erstellt, um Zugriffsrechte für die gemeinsame Nutzung von Daten mit " +"bestimmten Benutzern festzulegen." + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "Gruppen in eine Rolle gruppieren" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" +"Gruppen in eine Rolle gruppieren und einen Namen für diese Rolle festlegen" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "Gruppen" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "Erbt" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "Interne Notizen" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" +"Umgekehrte Beziehung für das Feld „Erbt von“. Die Gruppen, von denen diese " +"Gruppe erbt." + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Zuletzt geändert durch" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Zuletzt geändert am" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "Anzahl der Zugriffe auf das Modell" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Name" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "Elterngruppen" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "Eltern" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "Datensatzregeln" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "Beziehung für die Gruppen, die eine Rolle repräsentieren" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "Rolle" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "Rollenzeilen" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "Rollen, in denen die Gruppe involviert ist" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "Regeln" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "Regelnanzahl" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "Gruppe teilen" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "Warnung anzeigen" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "Bis" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "Transitiv vererbt" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "Benutzerrollen aktualisieren" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Benutzer" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "Benutzerrolle" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "Benutzerrollen" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "Benutzerrollen" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" +"Benutzerrollen können einem Benutzer jeweils nur einmal zugewiesen werden" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "Benutzer" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "Einer Rolle zugeordnete Anwender" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "Benutzerliste" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "Anwender dieser Gruppe erben automatisch jene Gruppen" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Ansichten" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "oder" + +#~ msgid "Last Modified on" +#~ msgstr "Zuletzt geändert am" diff --git a/base_user_role/i18n/el_GR.po b/base_user_role/i18n/el_GR.po new file mode 100644 index 00000000..187d61cf --- /dev/null +++ b/base_user_role/i18n/el_GR.po @@ -0,0 +1,431 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +# Kostas Goutoudis , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: Kostas Goutoudis , 2016\n" +"Language-Team: Greek (Greece) (https://www.transifex.com/oca/teams/23907/" +"el_GR/)\n" +"Language: el_GR\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Δημιουργήθηκε από " + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Δημιουργήθηκε στις" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "Από" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "Κωδικός" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Τελευταία ενημέρωση από" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Τελευταία ενημέρωση στις" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Ονομασία" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "Χρήστες" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +#, fuzzy +msgid "Users list" +msgstr "Χρήστες" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Προβολές" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" diff --git a/base_user_role/i18n/en_GB.po b/base_user_role/i18n/en_GB.po new file mode 100644 index 00000000..273f900c --- /dev/null +++ b/base_user_role/i18n/en_GB.po @@ -0,0 +1,432 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: English (United Kingdom) (https://www.transifex.com/oca/" +"teams/23907/en_GB/)\n" +"Language: en_GB\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Created by" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Created on" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Display Name" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Last Updated by" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Last Updated on" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Name" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "User" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Views" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Last Modified on" diff --git a/base_user_role/i18n/es.po b/base_user_role/i18n/es.po new file mode 100644 index 00000000..58b8333b --- /dev/null +++ b/base_user_role/i18n/es.po @@ -0,0 +1,451 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +# Antonio Trueba , 2016 +# Pedro M. Baeza , 2016 +# Eduardo Rodríguez Crespo , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2024-02-14 20:36+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\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.17\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "%s(copia)" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "Controles de Acceso" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "Grupos de acceso" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "Menú Acceso" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "Permisos de acceso" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "Activo" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "Aplicación" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "Asignar a un usuario" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "Categoría asociada" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "Grupo asociado" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "Categoría del grupo asociado" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "Cancelar" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "Cerrar" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "Índice Color" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "Comentarios" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "Crear" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "Crear Función" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "Crear rol a partir del usuario" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "Crear rol desde el asistente de usuario" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Creado en" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "Activado" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "De" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "Nombre grupo" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" +"Grupo creado para establecer permisos de acceso para compartir datos con " +"algunos usuarios." + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "Agrupar a los grupos en un rol" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "Agrupar grupos en un rol y especificar un nombre para este rol" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "Grupos" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "Heredados" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "Notas internas" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" +"Relación inversa para el campo Hereda. Los grupos de los que este grupo " +"hereda" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Última actualización en" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "Modelo Recuento de accesos" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Nombre" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "Grupos Padre" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "Padres" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "Regla de registro" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "Relación para los grupos que representan un rol" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "Rol" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "Líneas del rol" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "Roles en las que participa el grupo" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "Reglas" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "Recuento de reglas" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "Compartir Grupo" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "A" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "Hereda transitivamente" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "Actualizar Roles de Usuario" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Usuario" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "Roles de usuario" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "Usuarios" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "Usuarios asociados a un rol" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "Lista Usuarios" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "Los usuarios de este grupo automáticamente heredan esos grupos" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Vistas" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "o" + +#~ msgid "# Roles" +#~ msgstr "# Roles" + +#~ msgid "Roles" +#~ msgstr "Roles" + +#~ msgid "Roles can be assigned to a user only once at a time" +#~ msgstr "Los roles sólo pueden asignarse a un usuario una vez cada vez" + +#~ msgid "User role" +#~ msgstr "Rol de usuario" + +#~ msgid "Last Modified on" +#~ msgstr "Úlima modificación en" diff --git a/base_user_role/i18n/es_AR.po b/base_user_role/i18n/es_AR.po new file mode 100644 index 00000000..a02e744f --- /dev/null +++ b/base_user_role/i18n/es_AR.po @@ -0,0 +1,432 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Spanish (Argentina) (https://www.transifex.com/oca/" +"teams/23907/es_AR/)\n" +"Language: es_AR\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Creado en" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Mostrar Nombre" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Última actualización realizada por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Última actualización el" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Nombre" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Vistas" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Última modificación en" diff --git a/base_user_role/i18n/es_CL.po b/base_user_role/i18n/es_CL.po new file mode 100644 index 00000000..d8a112c9 --- /dev/null +++ b/base_user_role/i18n/es_CL.po @@ -0,0 +1,432 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Spanish (Chile) (https://www.transifex.com/oca/teams/23907/" +"es_CL/)\n" +"Language: es_CL\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Creado en" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID (identificación)" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Última actualización de" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Última actualización en" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Nombre" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Vistas" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Última modificación en" diff --git a/base_user_role/i18n/es_CO.po b/base_user_role/i18n/es_CO.po new file mode 100644 index 00000000..2aacaf23 --- /dev/null +++ b/base_user_role/i18n/es_CO.po @@ -0,0 +1,432 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Spanish (Colombia) (https://www.transifex.com/oca/teams/23907/" +"es_CO/)\n" +"Language: es_CO\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Creado" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Nombre Público" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Actualizado por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Actualizado" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Nombre" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Vistas" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Última Modificación el" diff --git a/base_user_role/i18n/es_CR.po b/base_user_role/i18n/es_CR.po new file mode 100644 index 00000000..29817268 --- /dev/null +++ b/base_user_role/i18n/es_CR.po @@ -0,0 +1,429 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Spanish (Costa Rica) (https://www.transifex.com/oca/" +"teams/23907/es_CR/)\n" +"Language: es_CR\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Creado en" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Ultima actualización por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Ultima actualización en" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Nombre" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Usuario" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Vistas" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" diff --git a/base_user_role/i18n/es_DO.po b/base_user_role/i18n/es_DO.po new file mode 100644 index 00000000..97f6ecba --- /dev/null +++ b/base_user_role/i18n/es_DO.po @@ -0,0 +1,432 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Spanish (Dominican Republic) (https://www.transifex.com/oca/" +"teams/23907/es_DO/)\n" +"Language: es_DO\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Creado en" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Última actualización de" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Última actualización en" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Nombre" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Vistas" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Última modificación en" diff --git a/base_user_role/i18n/es_EC.po b/base_user_role/i18n/es_EC.po new file mode 100644 index 00000000..20f23f36 --- /dev/null +++ b/base_user_role/i18n/es_EC.po @@ -0,0 +1,432 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Spanish (Ecuador) (https://www.transifex.com/oca/teams/23907/" +"es_EC/)\n" +"Language: es_EC\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Creado en" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID (identificación)" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Última actualización de" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Última actualización en" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Nombre" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Usuario" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Vistas" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Última modificación en" diff --git a/base_user_role/i18n/es_ES.po b/base_user_role/i18n/es_ES.po new file mode 100644 index 00000000..5f1835d9 --- /dev/null +++ b/base_user_role/i18n/es_ES.po @@ -0,0 +1,433 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-05-01 10:38+0000\n" +"PO-Revision-Date: 2017-05-01 10:38+0000\n" +"Last-Translator: OCA Transbot , 2017\n" +"Language-Team: Spanish (Spain) (https://www.transifex.com/oca/teams/23907/" +"es_ES/)\n" +"Language: es_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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Creado en" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Nombre para mostrar" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Última actualización en" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "Usuarios" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +#, fuzzy +msgid "Users list" +msgstr "Usuarios" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Última modificación en" diff --git a/base_user_role/i18n/es_MX.po b/base_user_role/i18n/es_MX.po new file mode 100644 index 00000000..daac5026 --- /dev/null +++ b/base_user_role/i18n/es_MX.po @@ -0,0 +1,447 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2020-02-15 15:13+0000\n" +"Last-Translator: Jesús Alan Ramos Rodríguez \n" +"Language-Team: Spanish (Mexico) (https://www.transifex.com/oca/teams/23907/" +"es_MX/)\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 3.10\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "Controles de Acceso" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "Menú de Acceso" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "Aplicación" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "Categoría asociada" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "Grupo asociado" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "Categoría del grupo asociado" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "Indice de color" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "Comentario" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Creado en" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Nombre desplegado" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "Habilitado" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "Desde" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "Nombre del Grupo" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" +"Grupo creado para establecer derechos de acceso para compartir datos con " +"algunos usuarios." + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "Grupos" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "Hereda" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Ultima actualizacion por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Ultima actualización realizada" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Nombre" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "Rol" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "Líneas de Rol" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "Reglas" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "Compartir Grupo" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "Hasta" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "Transitivamente hereda" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "Actualizar roles de usuario" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Usuario" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "Roles del usuario" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "Usuarios" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "Usuarios asociados a un rol" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "Lista de usuarios" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "Los usuarios de este grupo heredan automáticamente esos grupos" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Vistas" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Roles" +#~ msgstr "Roles" + +#~ msgid "User role" +#~ msgstr "Rol del usuario" + +#~ msgid "Last Modified on" +#~ msgstr "Ultima modificacion realizada" + +#~ msgid "Company" +#~ msgstr "Empresa" + +#~ msgid "User \"{}\" does not have access to the company \"{}\"" +#~ msgstr "El usuario \"{}\" no tiene acceso a la empresa \"{}\"" diff --git a/base_user_role/i18n/es_PE.po b/base_user_role/i18n/es_PE.po new file mode 100644 index 00000000..9b47d8e0 --- /dev/null +++ b/base_user_role/i18n/es_PE.po @@ -0,0 +1,432 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Spanish (Peru) (https://www.transifex.com/oca/teams/23907/" +"es_PE/)\n" +"Language: es_PE\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Creado en" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Nombre a Mostrar" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Actualizado última vez por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Ultima Actualización" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Nombre" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Vistas" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Ultima Modificación en" diff --git a/base_user_role/i18n/es_PY.po b/base_user_role/i18n/es_PY.po new file mode 100644 index 00000000..62d91295 --- /dev/null +++ b/base_user_role/i18n/es_PY.po @@ -0,0 +1,429 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Spanish (Paraguay) (https://www.transifex.com/oca/teams/23907/" +"es_PY/)\n" +"Language: es_PY\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Creado en" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Ultima actualización por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Ultima actualización en" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Nombre" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" diff --git a/base_user_role/i18n/es_VE.po b/base_user_role/i18n/es_VE.po new file mode 100644 index 00000000..711b80d8 --- /dev/null +++ b/base_user_role/i18n/es_VE.po @@ -0,0 +1,432 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Spanish (Venezuela) (https://www.transifex.com/oca/" +"teams/23907/es_VE/)\n" +"Language: es_VE\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Creado en" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Mostrar nombre" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Última actualización realizada por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Ultima actualizacion en" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Nombre" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Usuario" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Modificada por última vez" diff --git a/base_user_role/i18n/et.po b/base_user_role/i18n/et.po new file mode 100644 index 00000000..dec09827 --- /dev/null +++ b/base_user_role/i18n/et.po @@ -0,0 +1,431 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Estonian (https://www.transifex.com/oca/teams/23907/et/)\n" +"Language: et\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Loonud" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Loodud" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Näidatav nimi" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Viimati uuendatud" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Viimati uuendatud" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Nimi" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Kasutaja" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Vaated" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Viimati muudetud" diff --git a/base_user_role/i18n/eu.po b/base_user_role/i18n/eu.po new file mode 100644 index 00000000..9e3975dd --- /dev/null +++ b/base_user_role/i18n/eu.po @@ -0,0 +1,428 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Basque (https://www.transifex.com/oca/teams/23907/eu/)\n" +"Language: eu\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Nork sortua" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Created on" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Izena erakutsi" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Last Updated by" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Last Updated on" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Izena" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" diff --git a/base_user_role/i18n/fa.po b/base_user_role/i18n/fa.po new file mode 100644 index 00000000..fd79c73c --- /dev/null +++ b/base_user_role/i18n/fa.po @@ -0,0 +1,431 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Persian (https://www.transifex.com/oca/teams/23907/fa/)\n" +"Language: fa\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "ایجاد شده توسط" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "ایجاد شده در" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "نام نمایشی" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "شناسه" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "آخرین به روز رسانی توسط" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "آخرین به روز رسانی در" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "نام" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "نماها" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "تاریخ آخرین به‌روزرسانی" diff --git a/base_user_role/i18n/fi.po b/base_user_role/i18n/fi.po new file mode 100644 index 00000000..284228dc --- /dev/null +++ b/base_user_role/i18n/fi.po @@ -0,0 +1,432 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Finnish (https://www.transifex.com/oca/teams/23907/fi/)\n" +"Language: fi\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Luonut" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Luotu" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Nimi" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Viimeksi päivittänyt" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Viimeksi päivitetty" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Nimi" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Käyttäjä" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "Käyttäjät" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +#, fuzzy +msgid "Users list" +msgstr "Käyttäjät" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Viimeksi muokattu" diff --git a/base_user_role/i18n/fr.po b/base_user_role/i18n/fr.po new file mode 100644 index 00000000..3f9857ec --- /dev/null +++ b/base_user_role/i18n/fr.po @@ -0,0 +1,455 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-22 01:12+0000\n" +"PO-Revision-Date: 2025-12-03 10:42+0000\n" +"Last-Translator: Yann Papouin \n" +"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 5.10.4\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "Rôles utilisateur" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "%s (copie)" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "Toute modification effectuée ici ne sera pas persistante." + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" +"Les droits d'accès de cet utilisateur sont gérés par des rôles." + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "Durée de validité maximale des clés API" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "Contrôles d'accès" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "Groupes d'accès" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "Accès au menu" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "Droits d'accès" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "Actif" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "Ajouter plusieurs utilisateurs" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "Ajouter des utilisateurs" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "Application" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "Assigner à l'utilisateur" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "Catégorie associée" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "Groupe associé" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "Catégorie du groupe associé" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "Annuler" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "Fermer" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "Indice de couleur" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "Commentaire" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "Créer" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "Créer un rôle" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "Créer un rôle à partir d'un utilisateur" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "Assistant de création de rôle à partir d'un utilisateur" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Créé par" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Créé le" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" +"Détermine la durée maximale d'une clé API créée par un utilisateur " +"appartenant à ce groupe." + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Nom affiché" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "Activé" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "À partir du" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "Nom du groupe" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" +"Groupe créé pour définir les droits d'accès pour le partage des données avec " +"les autres utilisateurs." + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "Regrouper les groupes en un rôle" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "Regrouper les groupes dans un rôle et spécifier un nom pour ce rôle" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "Groupes" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "Hérite" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "Notes internes" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" +"Relation inverse pour le champ Inherits. Les groupes dont ce groupe hérite" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Mis-à-jour par" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Mis-à-jour le" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "Nombre de droits d'accès" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Nom" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "Groupes parent" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "Parents" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "Règles sur les enregistrements" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "Relation pour les groupes qui représentent un rôle" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "Rôle" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "Lignes du rôle" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "Rôles dans lesquels le groupe est impliqué" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "Règles" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "Nombre de règles" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "Groupe de partage" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "Montrer l'alerte" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "Jusqu'au" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "Hérite transitivement" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "Mise à jour des rôles utilisateur" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Utilisateur" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "Rôle utilisateur" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "Rôles utilisateur" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "Rôles utilisateur" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" +"Les rôles ne peuvent être attribués à un utilisateur qu'une seule fois à la " +"fois" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "Utilisateurs" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "Utilisateurs associés à un rôle" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "Liste d'utilisateurs" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "Les utilisateurs de ce groupe héritent automatiquement de ces groupes" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Vues" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "Assistant pour ajouter plusieurs utilisateurs à un rôle" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "ou" + +#~ msgid "# Roles" +#~ msgstr "# Rôles" + +#~ msgid "Roles" +#~ msgstr "Rôles" + +#~ msgid "Roles can be assigned to a user only once at a time" +#~ msgstr "" +#~ "Les rôles ne peuvent être attribués à un utilisateur qu'une seule fois à " +#~ "la fois" + +#~ msgid "User role" +#~ msgstr "Rôle utilisateur" + +#~ msgid "Last Modified on" +#~ msgstr "Dernière modification le" diff --git a/base_user_role/i18n/fr_CA.po b/base_user_role/i18n/fr_CA.po new file mode 100644 index 00000000..ecb6e58a --- /dev/null +++ b/base_user_role/i18n/fr_CA.po @@ -0,0 +1,430 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +# Martin Malorni , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: Martin Malorni , 2016\n" +"Language-Team: French (Canada) (https://www.transifex.com/oca/teams/23907/" +"fr_CA/)\n" +"Language: fr_CA\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Créé par" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Créé le" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Afficher le nom" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "Identifiant" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Dernière mise à jour par" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Dernière mise à jour le" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Nom" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" diff --git a/base_user_role/i18n/fr_CH.po b/base_user_role/i18n/fr_CH.po new file mode 100644 index 00000000..20630a8d --- /dev/null +++ b/base_user_role/i18n/fr_CH.po @@ -0,0 +1,434 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +# leemannd , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: leemannd , 2016\n" +"Language-Team: French (Switzerland) (https://www.transifex.com/oca/" +"teams/23907/fr_CH/)\n" +"Language: fr_CH\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Créé par" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Créé le" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Nom affiché" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Modifié par" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Modifié le" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "Utilisateurs" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +#, fuzzy +msgid "Users list" +msgstr "Utilisateurs" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Dernière modification le" diff --git a/base_user_role/i18n/fr_FR.po b/base_user_role/i18n/fr_FR.po new file mode 100644 index 00000000..08880270 --- /dev/null +++ b/base_user_role/i18n/fr_FR.po @@ -0,0 +1,430 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# Aurel , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-02-18 02:29+0000\n" +"PO-Revision-Date: 2017-02-18 02:29+0000\n" +"Last-Translator: Aurel , 2017\n" +"Language-Team: French (France) (https://www.transifex.com/oca/teams/23907/" +"fr_FR/)\n" +"Language: fr_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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "Utilsateurs" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +#, fuzzy +msgid "Users list" +msgstr "Utilsateurs" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" diff --git a/base_user_role/i18n/gl.po b/base_user_role/i18n/gl.po new file mode 100644 index 00000000..504845e7 --- /dev/null +++ b/base_user_role/i18n/gl.po @@ -0,0 +1,433 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +# César Castro Cruz , 2016 +# Alejandro Santana , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: Alejandro Santana , 2016\n" +"Language-Team: Galician (https://www.transifex.com/oca/teams/23907/gl/)\n" +"Language: gl\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Creado en" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "ültima actualización por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Última actualización en" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Nome" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Usuario" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Última modificación" diff --git a/base_user_role/i18n/gl_ES.po b/base_user_role/i18n/gl_ES.po new file mode 100644 index 00000000..64c4a3c4 --- /dev/null +++ b/base_user_role/i18n/gl_ES.po @@ -0,0 +1,429 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Galician (Spain) (https://www.transifex.com/oca/teams/23907/" +"gl_ES/)\n" +"Language: gl_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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" diff --git a/base_user_role/i18n/he.po b/base_user_role/i18n/he.po new file mode 100644 index 00000000..1c9c6824 --- /dev/null +++ b/base_user_role/i18n/he.po @@ -0,0 +1,431 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Hebrew (https://www.transifex.com/oca/teams/23907/he/)\n" +"Language: he\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "נוצר על ידי" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "נוצר ב-" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "השם המוצג" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "מזהה" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "עודכן לאחרונה על ידי" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "עודכן לאחרונה על" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "שם" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "תצוגות" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "תאריך שינוי אחרון" diff --git a/base_user_role/i18n/hr.po b/base_user_role/i18n/hr.po new file mode 100644 index 00000000..6d29d712 --- /dev/null +++ b/base_user_role/i18n/hr.po @@ -0,0 +1,445 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2017 +# Bole , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-22 01:12+0000\n" +"PO-Revision-Date: 2017-06-22 01:12+0000\n" +"Last-Translator: Bole , 2017\n" +"Language-Team: Croatian (https://www.transifex.com/oca/teams/23907/hr/)\n" +"Language: hr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "Kontrole pristupa" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "Izbornik pristupa" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "Aplikacija" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +#, fuzzy +msgid "Associated category" +msgstr "Pridružena grupa" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "Pridružena grupa" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +#, fuzzy +msgid "Associated group's category" +msgstr "Pridružena grupa" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "Index boje" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "Komentar" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Kreirao" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Kreirano" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Prikaži ime" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "Omogućen" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "Od" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "Naziv grupe" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" +"Grupa kreirana za postavljanje pristupnih prava za dijeljenje podataka sa " +"nekim korisnicima" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "Grupe" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "Nasljeđuje" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Zadnji ažurirao" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Zadnje ažuriranje" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Naziv" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "Rola" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "Stavke role" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "Pravila" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "Dijeli grupu" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "Do" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +#, fuzzy +msgid "Update user roles" +msgstr "Korisničke role" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Korisnik" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "Korisničke role" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "Korisnici" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "Korisnici priduženi roli" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +#, fuzzy +msgid "Users list" +msgstr "Korisničke role" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "Korisnici ove grupe automatski nasljeđuju ove grupe" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Pregled" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Roles" +#~ msgstr "Role" + +#~ msgid "User role" +#~ msgstr "Korisnička rola" + +#~ msgid "Last Modified on" +#~ msgstr "Zadnja izmjena dana" diff --git a/base_user_role/i18n/hr_HR.po b/base_user_role/i18n/hr_HR.po new file mode 100644 index 00000000..a3857664 --- /dev/null +++ b/base_user_role/i18n/hr_HR.po @@ -0,0 +1,435 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +# Bole , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: Bole , 2016\n" +"Language-Team: Croatian (Croatia) (https://www.transifex.com/oca/teams/23907/" +"hr_HR/)\n" +"Language: hr_HR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Kreirao" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Kreirano" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Naziv" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Zadnji ažurirao" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Zadnje ažurirano" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Naziv" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "Korisnici" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +#, fuzzy +msgid "Users list" +msgstr "Korisnici" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Zadnje modificirano" diff --git a/base_user_role/i18n/hu.po b/base_user_role/i18n/hu.po new file mode 100644 index 00000000..907aaa4e --- /dev/null +++ b/base_user_role/i18n/hu.po @@ -0,0 +1,431 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Hungarian (https://www.transifex.com/oca/teams/23907/hu/)\n" +"Language: hu\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Készítette" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Létrehozás dátuma" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Név megjelenítése" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Utoljára frissítve, által" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Utoljára frissítve " + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Név" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Felhasználó" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Nézetek" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Utolsó frissítés dátuma" diff --git a/base_user_role/i18n/id.po b/base_user_role/i18n/id.po new file mode 100644 index 00000000..7443d277 --- /dev/null +++ b/base_user_role/i18n/id.po @@ -0,0 +1,431 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Indonesian (https://www.transifex.com/oca/teams/23907/id/)\n" +"Language: id\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Dibuat oleh" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Dibuat pada" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Nama Tampilan" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Diperbaharui oleh" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Diperbaharui pada" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Nama" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Dilihat" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Terakhir Dimodifikasi pada" diff --git a/base_user_role/i18n/it.po b/base_user_role/i18n/it.po new file mode 100644 index 00000000..39cd2288 --- /dev/null +++ b/base_user_role/i18n/it.po @@ -0,0 +1,457 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +# Paolo Valier , 2016 +# Giacomo , 2016 +# Nicola Malcontenti , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2025-11-21 10:28+0000\n" +"Last-Translator: mymage \n" +"Language-Team: Italian (https://www.transifex.com/oca/teams/23907/it/)\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.10.4\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "N° ruoli utente" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "%s (copia)" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" +"Qualsiasi modifica configurazione effettuata qui non sarà persistente." + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" +"Le autorizzazioni di accesso di questo utente sono gestiti dai ruoli." +"" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "Giorni massimi durata chiavi API" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "Controlli di accesso" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "Gruppi di accesso" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "Menu d'accesso" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "Diritti di accesso" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "Attivo" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "Aggiungi utenti multipli" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "Aggiungi utenti" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "Applicazione" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "Assegna a utente" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "Categoria associata" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "Gruppo associato" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "Categoria del gruppo associato" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "Annulla" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "Chiudi" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "Indice colore" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "Commento" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "Crea" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "Crea ruolo" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "Crea ruolo dall'utente" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "Procedura guidata creazione ruolo dall'utente" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" +"Determina la durata massima di una chiave API creata da un utente " +"appartenente a questo gruppo." + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "Attiva" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "Da" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "Nome gruppo" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" +"Gruppo creato per impostare i diritti di accesso per la condivisione dei " +"dati con alcuni utenti." + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "Raggruppa gruppi in un ruolo" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "Raggruppa gruppi in un ruolo e indica un nume per il ruolo" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "Gruppi" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "Eredita" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "Note interne" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" +"Relazione inversa per il campo ereditato. I gruppi che ereditano da questo " +"gruppo" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "Conteggio accesso modello" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Nome" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "Gruppi padre" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "Padri" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "Regole record" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "Relazione per i gruppi che rappresentano un ruolo" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "Ruolo" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "Righe del ruolo" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "Ruoli nei quali il gruppo è coinvolo" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "Regole" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "Numero regole" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "Gruppo condivisione" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "Visualizza avviso" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "A" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "Eredita transitivamente" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "Aggiorna i ruoli dell'utente" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Utente" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "Ruolo utente" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "Ruoli utente" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "Ruoli utente" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "I ruoli utente possono essere assegnati all'utente solo uno alla volta" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "Utenti" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "Utenti associati al ruolo" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "Elenco utenti" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "Gli utenti di questo gruppo ereditano automaticamente quei gruppi" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Viste" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "Procedura guidata per aggiungere utenti multipli ad un ruolo" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "o" + +#~ msgid "# Roles" +#~ msgstr "N° ruoli" + +#~ msgid "Roles" +#~ msgstr "Ruoli" + +#~ msgid "Roles can be assigned to a user only once at a time" +#~ msgstr "I ruoli possono essere assegnati all'utente solo uno alla volta" + +#~ msgid "User role" +#~ msgstr "Ruolo utente" + +#~ msgid "Last Modified on" +#~ msgstr "Ultima modifica il" diff --git a/base_user_role/i18n/ja.po b/base_user_role/i18n/ja.po new file mode 100644 index 00000000..0f1dd4ba --- /dev/null +++ b/base_user_role/i18n/ja.po @@ -0,0 +1,431 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Japanese (https://www.transifex.com/oca/teams/23907/ja/)\n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "作成者" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "作成日" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "表示名" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "最終更新者" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "最終更新日" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "名称" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "ユーザ" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "ビュー" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "最終更新日" diff --git a/base_user_role/i18n/ko.po b/base_user_role/i18n/ko.po new file mode 100644 index 00000000..f739c7c1 --- /dev/null +++ b/base_user_role/i18n/ko.po @@ -0,0 +1,431 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Korean (https://www.transifex.com/oca/teams/23907/ko/)\n" +"Language: ko\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "작성자" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "작성일" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "표시 이름" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "최근 갱신한 사람" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "최근 갱신 날짜" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "이름" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "회" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "최근 수정" diff --git a/base_user_role/i18n/lt.po b/base_user_role/i18n/lt.po new file mode 100644 index 00000000..529ce2b8 --- /dev/null +++ b/base_user_role/i18n/lt.po @@ -0,0 +1,432 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Lithuanian (https://www.transifex.com/oca/teams/23907/lt/)\n" +"Language: lt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"(n%100<10 || n%100>=20) ? 1 : 2);\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Sukūrė" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Sukurta" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Vaizduojamas pavadinimas" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Paskutinį kartą atnaujino" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Paskutinį kartą atnaujinta" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Pavadinimas" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Naudotojas" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Rodiniai" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Paskutinį kartą keista" diff --git a/base_user_role/i18n/lt_LT.po b/base_user_role/i18n/lt_LT.po new file mode 100644 index 00000000..8dbdf0e2 --- /dev/null +++ b/base_user_role/i18n/lt_LT.po @@ -0,0 +1,430 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# Arminas Grigonis , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: Arminas Grigonis , 2016\n" +"Language-Team: Lithuanian (Lithuania) (https://www.transifex.com/oca/" +"teams/23907/lt_LT/)\n" +"Language: lt_LT\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"(n%100<10 || n%100>=20) ? 1 : 2);\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Sukūrė" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Sukurta" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Paskutinį kartą atnaujino" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Paskutinį kartą atnaujinta" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" diff --git a/base_user_role/i18n/lv.po b/base_user_role/i18n/lv.po new file mode 100644 index 00000000..bfe0f8bf --- /dev/null +++ b/base_user_role/i18n/lv.po @@ -0,0 +1,429 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Latvian (https://www.transifex.com/oca/teams/23907/lv/)\n" +"Language: lv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " +"2);\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Izveidoja" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Izveidots" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Pēdējo reizi atjaunoja" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Pēdējās izmaiņas" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Nosaukums" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Lietotājs" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Skatījumi" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" diff --git a/base_user_role/i18n/mk.po b/base_user_role/i18n/mk.po new file mode 100644 index 00000000..8e032f01 --- /dev/null +++ b/base_user_role/i18n/mk.po @@ -0,0 +1,431 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Macedonian (https://www.transifex.com/oca/teams/23907/mk/)\n" +"Language: mk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Креирано од" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Креирано на" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Прикажи име" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Последно ажурирање од" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Последно ажурирање на" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Име" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Корисник" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Погледи" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Последна промена на" diff --git a/base_user_role/i18n/mn.po b/base_user_role/i18n/mn.po new file mode 100644 index 00000000..af91992c --- /dev/null +++ b/base_user_role/i18n/mn.po @@ -0,0 +1,431 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Mongolian (https://www.transifex.com/oca/teams/23907/mn/)\n" +"Language: mn\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Үүсгэгч" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Үүсгэсэн" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Дэлгэцийн Нэр" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Сүүлийн засвар хийсэн" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Сүүлийн засвар хийсэн огноо" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Нэр" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Хэрэглэгч" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Дэлгэцүүд" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Сүүлийн засвар хийсэн огноо" diff --git a/base_user_role/i18n/nb.po b/base_user_role/i18n/nb.po new file mode 100644 index 00000000..c062b821 --- /dev/null +++ b/base_user_role/i18n/nb.po @@ -0,0 +1,432 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Norwegian Bokmål (https://www.transifex.com/oca/teams/23907/" +"nb/)\n" +"Language: nb\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Opprettet av" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Opprettet den" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Visnings navn" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Sist oppdatert av" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Sist oppdatert" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Navn" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Bruker" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Visninger" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Sist oppdatert " diff --git a/base_user_role/i18n/nb_NO.po b/base_user_role/i18n/nb_NO.po new file mode 100644 index 00000000..d169c349 --- /dev/null +++ b/base_user_role/i18n/nb_NO.po @@ -0,0 +1,432 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# Imre Kristoffer Eilertsen , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: Imre Kristoffer Eilertsen , 2016\n" +"Language-Team: Norwegian Bokmål (Norway) (https://www.transifex.com/oca/" +"teams/23907/nb_NO/)\n" +"Language: nb_NO\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Laget av" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Laget den" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Vis navn" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Sist oppdatert av" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Sist oppdatert den" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Sist endret den" diff --git a/base_user_role/i18n/nl.po b/base_user_role/i18n/nl.po new file mode 100644 index 00000000..13a8565d --- /dev/null +++ b/base_user_role/i18n/nl.po @@ -0,0 +1,433 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +# Erwin van der Ploeg , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: Erwin van der Ploeg , 2016\n" +"Language-Team: Dutch (https://www.transifex.com/oca/teams/23907/nl/)\n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "Opmerking" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Aangemaakt door" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Aangemaakt op" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Te tonen naam" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "Ingeschakeld" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "Groepen" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Laatst bijgewerkt door" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Laatst bijgewerkt op" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Naam" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Gebruiker" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "Gebruikers" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +#, fuzzy +msgid "Users list" +msgstr "Gebruikers" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Laatst bijgewerkt op" diff --git a/base_user_role/i18n/nl_BE.po b/base_user_role/i18n/nl_BE.po new file mode 100644 index 00000000..28174fcd --- /dev/null +++ b/base_user_role/i18n/nl_BE.po @@ -0,0 +1,432 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Dutch (Belgium) (https://www.transifex.com/oca/teams/23907/" +"nl_BE/)\n" +"Language: nl_BE\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Gemaakt door" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Gemaakt op" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Schermnaam" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Laatst bijgewerkt door" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Laatst bijgewerkt op" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Naam:" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Gebruiker" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Laatst Aangepast op" diff --git a/base_user_role/i18n/nl_NL.po b/base_user_role/i18n/nl_NL.po new file mode 100644 index 00000000..2b61568f --- /dev/null +++ b/base_user_role/i18n/nl_NL.po @@ -0,0 +1,436 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# Peter Hageman , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-30 12:21+0000\n" +"PO-Revision-Date: 2017-06-30 12:21+0000\n" +"Last-Translator: Peter Hageman , 2017\n" +"Language-Team: Dutch (Netherlands) (https://www.transifex.com/oca/" +"teams/23907/nl_NL/)\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "Applicatie" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "Kleurindex" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "Commentaar" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Aangemaakt door" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Aangemaakt op" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "weergavenaam" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "Van" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "Groepsnaam" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "Groepen" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Laatst bijgewerkt door" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Laatst bijgewerkt op" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Naam" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "Rol" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "Rolregels" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "Regels" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "Deel Groep" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "Aan" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Gebruiker" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "Gebruikers" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +#, fuzzy +msgid "Users list" +msgstr "Gebruikers" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Roles" +#~ msgstr "Rollen" + +#~ msgid "Last Modified on" +#~ msgstr "Laatst gewijzigd op" diff --git a/base_user_role/i18n/pl.po b/base_user_role/i18n/pl.po new file mode 100644 index 00000000..86123cb0 --- /dev/null +++ b/base_user_role/i18n/pl.po @@ -0,0 +1,432 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Polish (https://www.transifex.com/oca/teams/23907/pl/)\n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2);\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Utworzone przez" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Utworzono" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Wyświetlana nazwa " + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Ostatnio modyfikowane przez" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Ostatnia zmiana" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Nazwa" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Użytkownik" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Widoki" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Ostatnio modyfikowano" diff --git a/base_user_role/i18n/pt.po b/base_user_role/i18n/pt.po new file mode 100644 index 00000000..e989c18d --- /dev/null +++ b/base_user_role/i18n/pt.po @@ -0,0 +1,449 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2017 +# Pedro Castro Silva , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-08-01 02:44+0000\n" +"PO-Revision-Date: 2023-08-31 10:35+0000\n" +"Last-Translator: Pedro Castro Silva \n" +"Language-Team: Portuguese (https://www.transifex.com/oca/teams/23907/pt/)\n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Weblate 4.17\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "Controlos de Acesso" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "Grupos de Acesso" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "Menu de Acesso" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "Permissões de Acesso" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "Ativo" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "Aplicação" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "Atribuir a utilizador" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "Categoria associada" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "Grupo associado" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "Categoria do grupo associado" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "Fechar" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "Índice de Cor" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "Comentário" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "Criar" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "Criar uma função a partir do utilizador" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "Criar função a partir do assistente de utilizador" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Criado por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Criado em" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Nome a Apresentar" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "Habilitado" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "De" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "Nome do Grupo" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" +"Grupo criado para estabelecer direitos de acesso na partilha de dados com " +"outros utilizadores." + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "Grupos" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "Heranças" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "Notas Internas" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" +"Relação inversa para o campo Heranças. Os grupos dos quais este grupo está a " +"herdar" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Atualizado pela última vez por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Atualizado pela última vez em" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "Contagem de Acessos ao Modelo" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Nome" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "Grupos Ascendentes" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "Ascendentes" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "Regras de Registos" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "Relação para os grupos que representa uma função" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "Função" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "Linhas de funções" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "Funções nas quais o grupo está envolvido" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "Regras" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "Contagem de Regras" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "Partilhar Grupo" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "Até" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "Herda transitoriamente" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "Atualizar funções de utilizador" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Utilizador" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "Funções de utilizador" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "Utilizadores" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "Utilizadores associados a uma função" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "Lista de utilizadores" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "Utilizadores deste grupo automaticamente herdam esses grupos" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Vistas" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "ou" + +#~ msgid "# Roles" +#~ msgstr "# Funções" + +#~ msgid "Roles" +#~ msgstr "Funções" + +#~ msgid "Roles can be assigned to a user only once at a time" +#~ msgstr "As funções podem ser atribuídas a um utilizadores apenas uma vez" + +#~ msgid "User role" +#~ msgstr "Função de utilizador" + +#~ msgid "Last Modified on" +#~ msgstr "Última Modificação Em" diff --git a/base_user_role/i18n/pt_BR.po b/base_user_role/i18n/pt_BR.po new file mode 100644 index 00000000..2237ee4a --- /dev/null +++ b/base_user_role/i18n/pt_BR.po @@ -0,0 +1,434 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2017 +# falexandresilva , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-22 01:12+0000\n" +"PO-Revision-Date: 2017-06-22 01:12+0000\n" +"Last-Translator: falexandresilva , 2017\n" +"Language-Team: Portuguese (Brazil) (https://www.transifex.com/oca/" +"teams/23907/pt_BR/)\n" +"Language: pt_BR\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Criado por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Criado em" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Nome para Mostrar" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "Habilitado" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "A partir de" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "Grupos" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Última atualização por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Última atualização em" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Nome" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "Regras" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "Para" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Usuário" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "Usuários" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +#, fuzzy +msgid "Users list" +msgstr "Usuários" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Visualizações" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Última atualização em" diff --git a/base_user_role/i18n/pt_PT.po b/base_user_role/i18n/pt_PT.po new file mode 100644 index 00000000..599e6805 --- /dev/null +++ b/base_user_role/i18n/pt_PT.po @@ -0,0 +1,433 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +# Pedro Castro Silva , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: Pedro Castro Silva , 2016\n" +"Language-Team: Portuguese (Portugal) (https://www.transifex.com/oca/" +"teams/23907/pt_PT/)\n" +"Language: pt_PT\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Criado por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Criado em" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Nome a exibir" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Atualizado pela última vez por" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Atualizado pela última vez em" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Nome" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Utilizador" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Modificado a última vez por" diff --git a/base_user_role/i18n/ro.po b/base_user_role/i18n/ro.po new file mode 100644 index 00000000..44c10715 --- /dev/null +++ b/base_user_role/i18n/ro.po @@ -0,0 +1,434 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2017 +# Daniel Schweiger , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-22 01:12+0000\n" +"PO-Revision-Date: 2017-06-22 01:12+0000\n" +"Last-Translator: Daniel Schweiger , 2017\n" +"Language-Team: Romanian (https://www.transifex.com/oca/teams/23907/ro/)\n" +"Language: ro\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" +"2:1));\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Creat de" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Creat la" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Nume Afişat" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Ultima actualizare făcută de" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Ultima actualizare la" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Nume" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "Reguli" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Utilizator" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "Utilizatori" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +#, fuzzy +msgid "Users list" +msgstr "Utilizatori" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Ultima actualizare în" diff --git a/base_user_role/i18n/ru.po b/base_user_role/i18n/ru.po new file mode 100644 index 00000000..b3a532ba --- /dev/null +++ b/base_user_role/i18n/ru.po @@ -0,0 +1,430 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Russian (https://www.transifex.com/oca/teams/23907/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || " +"(n%100>=11 && n%100<=14)? 2 : 3);\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Создано" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Создан" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Последний раз обновлено" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Последний раз обновлено" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Название" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Пользователь" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" diff --git a/base_user_role/i18n/sk.po b/base_user_role/i18n/sk.po new file mode 100644 index 00000000..df028737 --- /dev/null +++ b/base_user_role/i18n/sk.po @@ -0,0 +1,431 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Slovak (https://www.transifex.com/oca/teams/23907/sk/)\n" +"Language: sk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Vytvoril" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Vytvorené" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Zobraziť meno" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Naposledy upravil" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Naposledy upravené" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Meno" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Pohľady" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Posledná modifikácia" diff --git a/base_user_role/i18n/sl.po b/base_user_role/i18n/sl.po new file mode 100644 index 00000000..f76d272a --- /dev/null +++ b/base_user_role/i18n/sl.po @@ -0,0 +1,442 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-22 01:12+0000\n" +"PO-Revision-Date: 2017-06-22 01:12+0000\n" +"Last-Translator: OCA Transbot , 2017\n" +"Language-Team: Slovenian (https://www.transifex.com/oca/teams/23907/sl/)\n" +"Language: sl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " +"n%100==4 ? 2 : 3);\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "Nadzor dostopa" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "Meni dostopa" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "Aplikacija" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +#, fuzzy +msgid "Associated category" +msgstr "Povezana skupina" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "Povezana skupina" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +#, fuzzy +msgid "Associated group's category" +msgstr "Povezana skupina" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "Barvni indeks" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "Komentar" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Ustvaril" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Ustvarjeno" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Prikazni naziv" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "Omogočeno" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "Od" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "Naziv skupine" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "Skupine" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "Podeduje" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Zadnji posodobil" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Zadnjič posodobljeno" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Naziv" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "Vloga" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "Postavke vlog" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "Pravila" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "Za" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "Prehodno podeduje" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +#, fuzzy +msgid "Update user roles" +msgstr "Uporabniška vloga" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Uporabnik" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "Uporabniki" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "Uporabniki povezani z vlogo" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +#, fuzzy +msgid "Users list" +msgstr "Uporabniki" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "Uporabniki v tej skupini samodejno podedujejo te skupine" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Prikazi" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Roles" +#~ msgstr "Vloge" + +#~ msgid "User role" +#~ msgstr "Uporabniška vloga" + +#~ msgid "Last Modified on" +#~ msgstr "Zadnjič spremenjeno" diff --git a/base_user_role/i18n/sr.po b/base_user_role/i18n/sr.po new file mode 100644 index 00000000..f72d05e5 --- /dev/null +++ b/base_user_role/i18n/sr.po @@ -0,0 +1,429 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Serbian (https://www.transifex.com/oca/teams/23907/sr/)\n" +"Language: sr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Kreiran" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Ime" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Pregledi" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" diff --git a/base_user_role/i18n/sr@latin.po b/base_user_role/i18n/sr@latin.po new file mode 100644 index 00000000..92c9d9b1 --- /dev/null +++ b/base_user_role/i18n/sr@latin.po @@ -0,0 +1,433 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Serbian (Latin) (https://www.transifex.com/oca/teams/23907/" +"sr@latin/)\n" +"Language: sr@latin\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Kreirao" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Kreiran" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Ime za prikaz" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Zadnja izmjena" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Zadnja izmjena" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Ime:" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Korisnik" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Pregledi" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Zadnja izmjena" diff --git a/base_user_role/i18n/sv.po b/base_user_role/i18n/sv.po new file mode 100644 index 00000000..f018042b --- /dev/null +++ b/base_user_role/i18n/sv.po @@ -0,0 +1,453 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2025-11-17 10:46+0000\n" +"Last-Translator: jakobkrabbe \n" +"Language-Team: Swedish (https://www.transifex.com/oca/teams/23907/sv/)\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 5.10.4\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "# Användarroller" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "%s (kopia)" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" +"Eventuella konfigurationsändringar som görs här kommer inte att vara " +"beständiga." + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" +"Denna användares åtkomsträttigheter hanteras av roller." + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "API-nycklars maximala varaktighet dagar" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "Åtkomstkontroll" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "Åtkomstgrupper" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "Åtkomstmeny" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "Tillträdesrättigheter" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "Aktiv" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "Tillämpning" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "Tilldela till användare" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "Associerad kategori" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "Associerad grupp" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "Associerad grupps kategori" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "Avbryt" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "Nära" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "Färgindex" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "Hur gör man" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "Skapa" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "Skapa roll" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "Skapa roll från användare" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "Skapa roll från användarguiden" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Skapad av" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Skapad den" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" +"Bestämmer den maximala varaktigheten för en API-nyckel som skapats av en " +"användare som tillhör den här gruppen." + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Visa namn" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "Aktiverad" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "Från" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "Gruppens namn" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" +"Grupp skapad för att ange åtkomsträttigheter för att dela data med vissa " +"användare." + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "Gruppera grupper i en roll" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "Gruppera grupper i en roll och ange ett namn för denna roll" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "Grupper" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "Arv" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "Interna anmärkningar" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" +"Omvänd relation för fältet Inherits (ärver). De grupper som denna grupp " +"ärver från" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Senast uppdaterad av" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Senast uppdaterad" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "Modell Åtkomst Antal" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Namn" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "Föräldragrupper" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "Föräldrar" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "Regler för inspelning" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "Relation för de grupper som representerar en roll" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "Roll" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "Rollfördelning" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "Roller som gruppen är involverad i" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "Regler" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "Antal regler" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "Aktiegrupp" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "Visa avisering" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "Till" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "Övergångsvis ärver" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "Uppdatera användarroller" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Användare" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "Användarroll" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "Användarroller" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "Användarroller" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "Användarroller kan endast tilldelas en användare en gång i taget" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "Användare" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "Användare som är kopplade till en roll" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "Lista över användare" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "Användare av denna grupp ärver automatiskt dessa grupper" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Vyer" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "eller" + +#~ msgid "# Roles" +#~ msgstr "# Roller" + +#~ msgid "Roles" +#~ msgstr "Roller" + +#~ msgid "Roles can be assigned to a user only once at a time" +#~ msgstr "Roller kan tilldelas en användare endast en gång åt gången" + +#~ msgid "User role" +#~ msgstr "Användarroll" + +#~ msgid "Last Modified on" +#~ msgstr "Senast redigerad" diff --git a/base_user_role/i18n/th.po b/base_user_role/i18n/th.po new file mode 100644 index 00000000..65a6d7fd --- /dev/null +++ b/base_user_role/i18n/th.po @@ -0,0 +1,431 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Thai (https://www.transifex.com/oca/teams/23907/th/)\n" +"Language: th\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "สร้างโดย" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "สร้างเมื่อ" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "ชื่อที่ใช้แสดง" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "รหัส" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "อัพเดทครั้งสุดท้ายโดย" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "อัพเดทครั้งสุดท้ายเมื่อ" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "ชื่อ" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "ผู้ใช้" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "มุมมอง" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "แก้ไขครั้งสุดท้ายเมื่อ" diff --git a/base_user_role/i18n/tr.po b/base_user_role/i18n/tr.po new file mode 100644 index 00000000..643c5b62 --- /dev/null +++ b/base_user_role/i18n/tr.po @@ -0,0 +1,451 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# Ahmet Altinisik , 2016 +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-29 03:39+0000\n" +"PO-Revision-Date: 2025-08-14 17:25+0000\n" +"Last-Translator: Betül Öğmen \n" +"Language-Team: Turkish (https://www.transifex.com/oca/teams/23907/tr/)\n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Weblate 5.10.4\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "# Kullanıcı Rolleri" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "Burada yapılan değişiklik kalıcı olmayacaktır." + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" +"Bu kullanıcının erişim hakları roller tarafından yönetilir." + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "API Anahtarları maksimum gün süresi" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "Erişim Kontrolleri" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "Erişim Grupları" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "Erişim Menüsü" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "Erişim Hakları" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "Aktif" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "Uygulama" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "Kullanıcıya ata" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "İlişkili kategori" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "İlişkili grup" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "İlişkili grup kategorisi" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "İptal" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "Kapat" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "Renk İndeksi" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "Yorum" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "Oluştur" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "Rol Oluştur" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "Kullanıcıdan bir rol oluşturma" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "Kullanıcıdan bir rol oluşturma sihirbazı" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Oluşturan" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Oluşturuldu" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" +"Bu gruba ait bir kullanıcı tarafından oluşturulan bir API anahtarının " +"maksimum süresini belirler." + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Görünen İsim" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "Etkinleştirilmiş" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "Başlangıç" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "Grup Adı" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" +"Bazı kullanıcılarla veri paylaşımı için erişim haklarını ayarlamak üzere " +"oluşturulan grup." + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "Grupları bir role göre gruplandırın" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "Grupları bir rolde gruplama ve bu rol için bir ad belirleme" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "Gruplar" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "Devralır" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "Dahili Notlar" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "Devralma alanı için ters ilişki. Bu grubun devraldığı gruplar" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Son güncelleyen" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Son güncelleme" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "Model Erişim Sayısı" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Adı" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "Üst Gruplar" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "Üstler" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "Kayıt Kuralları" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "Bir rolü temsil eden gruplar için ilişki" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "Rol" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "Rol satırları" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "Grubun dahil olduğu roller" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "Kurallar" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "Kuralların Sayısı" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "Grubu Paylaş" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "Uyarı Göster" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "Karşı" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "Geçişli olarak miras alır" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "Kullanıcı rollerini güncelleme" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Kullanıcı" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "Kullanıcı Rolü" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "Kullanıcı Rolleri" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "Kullanıcı rolleri" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" +"Kullanıcı rolleri bir kullanıcıya aynı anda yalnızca bir kez atanabilir" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "Kullanıcılar" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "Bir rolle ilişkili kullanıcılar" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "Kullanıcılar listesi" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "Bu grubun kullanıcıları, bu grupları otomatik olarak devralır" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Görünümler" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "veya" + +#~ msgid "# Roles" +#~ msgstr "# Roller" + +#~ msgid "Roles" +#~ msgstr "Roller" + +#~ msgid "Roles can be assigned to a user only once at a time" +#~ msgstr "Roller bir kullanıcıya aynı anda yalnızca bir kez atanabilir" + +#~ msgid "User role" +#~ msgstr "Kullanıcı rolü" + +#~ msgid "Last Modified on" +#~ msgstr "Son değişiklik" diff --git a/base_user_role/i18n/tr_TR.po b/base_user_role/i18n/tr_TR.po new file mode 100644 index 00000000..81562c91 --- /dev/null +++ b/base_user_role/i18n/tr_TR.po @@ -0,0 +1,433 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-02-22 00:55+0000\n" +"PO-Revision-Date: 2017-02-22 00:55+0000\n" +"Last-Translator: OCA Transbot , 2017\n" +"Language-Team: Turkish (Turkey) (https://www.transifex.com/oca/teams/23907/" +"tr_TR/)\n" +"Language: tr_TR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Oluşturan" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Oluşturulma tarihi" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Görünen ad" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "Kimlik" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "En son güncelleyen " + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "En son güncelleme tarihi" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Ad" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Kullanıcı" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "Kullanıcılar" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +#, fuzzy +msgid "Users list" +msgstr "Kullanıcılar" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "En son güncelleme tarihi" diff --git a/base_user_role/i18n/uk.po b/base_user_role/i18n/uk.po new file mode 100644 index 00000000..79eee26f --- /dev/null +++ b/base_user_role/i18n/uk.po @@ -0,0 +1,432 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Ukrainian (https://www.transifex.com/oca/teams/23907/uk/)\n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Створив" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Дата створення" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Назва для відображення" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Востаннє оновив" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Останнє оновлення" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Name" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Переглядів" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Остання модифікація" diff --git a/base_user_role/i18n/vi.po b/base_user_role/i18n/vi.po new file mode 100644 index 00000000..fd559fb6 --- /dev/null +++ b/base_user_role/i18n/vi.po @@ -0,0 +1,431 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Vietnamese (https://www.transifex.com/oca/teams/23907/vi/)\n" +"Language: vi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Được tạo bởi" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Được tạo vào" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Tên hiển thị" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Last Updated by" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Cập nhật lần cuối vào" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Tên" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Người sử dụng" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "Views" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Sửa lần cuối vào" diff --git a/base_user_role/i18n/vi_VN.po b/base_user_role/i18n/vi_VN.po new file mode 100644 index 00000000..dd8ec98f --- /dev/null +++ b/base_user_role/i18n/vi_VN.po @@ -0,0 +1,441 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2021-09-25 14:34+0000\n" +"Last-Translator: Mi Di \n" +"Language-Team: Vietnamese (Viet Nam) (https://www.transifex.com/oca/" +"teams/23907/vi_VN/)\n" +"Language: vi_VN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.3.2\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "Kiểm soát quyền truy cập" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "Ứng dụng" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "Danh mục được liên kết" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "Nhóm được liên kết" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "Phân loại của nhóm được liên kết" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "Danh mục màu" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "Tạo bởi" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "Tạo vào" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Tên hiển thị" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "Được kích hoạt" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "Từ" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "Tên nhóm" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" +"Nhóm này được tạo để thiết đặt quyền truy cập cho việc chia sẻ dữ liệu với " +"một số người dùng." + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "Các nhóm" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "Kế thừa từ" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "Ghi chú nội bộ" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "Cập nhật lần cuối bởi" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "Cập nhật lần cuối vào" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "Tên" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "Vai trò" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "Tập luật" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "Nhóm chia sẻ" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "Tới" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "Cập nhật vai trò người dùng" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "Người dùng" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "Danh sách vai trò người dùng" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "Danh sách người dùng" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "Người dùng được gán vào role" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "Danh sách người dùng" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "Người dùng của nhóm này sẽ tự động kế thừa từ các nhóm khác" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Roles can be assigned to a user only once at a time" +#~ msgstr "Vai trò chỉ được gán cho người dùng một lần tại một thời điểm" + +#~ msgid "User role" +#~ msgstr "Vai trò người dùng" + +#~ msgid "Last Modified on" +#~ msgstr "Chỉnh sửa lần cuối vào" diff --git a/base_user_role/i18n/zh_CN.po b/base_user_role/i18n/zh_CN.po new file mode 100644 index 00000000..8b276ff7 --- /dev/null +++ b/base_user_role/i18n/zh_CN.po @@ -0,0 +1,434 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +# Jeffery Chen Fan , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: Jeffery Chen Fan , 2016\n" +"Language-Team: Chinese (China) (https://www.transifex.com/oca/teams/23907/" +"zh_CN/)\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" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "创建者" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "创建时间" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "Display Name" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "ID" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "最后更新者" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "上次更新日期" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "名称" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "用户" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "用户" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +#, fuzzy +msgid "Users list" +msgstr "用户" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "视图" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "Last Modified on" diff --git a/base_user_role/i18n/zh_TW.po b/base_user_role/i18n/zh_TW.po new file mode 100644 index 00000000..fecde659 --- /dev/null +++ b/base_user_role/i18n/zh_TW.po @@ -0,0 +1,432 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_role +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-17 02:07+0000\n" +"PO-Revision-Date: 2016-12-17 02:07+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Chinese (Taiwan) (https://www.transifex.com/oca/teams/23907/" +"zh_TW/)\n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_count +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_count +msgid "# User Roles" +msgstr "" + +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "Any configuration changes made here will not be persistent." +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "The access rights of this user are managed by roles." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__api_key_duration +msgid "API Keys maximum duration days" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access +msgid "Access Controls" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__menu_access +msgid "Access Menu" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Access Rights" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__active +msgid "Active" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_add_multiple_users_wizard +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Add Multiple Users" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Add Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__category_id +msgid "Application" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__assign_to_user +msgid "Assign to user" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_category_id +msgid "Associated category" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__group_id +msgid "Associated group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__group_category_id +msgid "Associated group's category" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_add_users_wizard +msgid "Cancel" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Close" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__color +msgid "Color Index" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__comment +msgid "Comment" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +#: model_terms:ir.ui.view,arch_db:base_user_role.group_groups_into_role_wiz_view +msgid "Create" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_wizard_groups_into_role +msgid "Create Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.create_from_user_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "Create role from user" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_create_role_from_user +msgid "Create role from user wizard" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_uid +msgid "Created by" +msgstr "建立者" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__create_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__create_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__create_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__create_date +msgid "Created on" +msgstr "建立於" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__api_key_duration +msgid "" +"Determines the maximum duration of an api key created by a user belonging to " +"this group." +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__display_name +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__display_name +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__display_name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__display_name +msgid "Display Name" +msgstr "顯示名稱" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__is_enabled +msgid "Enabled" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_from +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_from +msgid "From" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__full_name +msgid "Group Name" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__share +msgid "Group created to set access rights for sharing data with some users." +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_wizard_groups_into_role +msgid "Group groups into a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_wizard_groups_into_role__name +msgid "Group groups into a role and specify a name for this role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__id +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__id +msgid "ID" +msgstr "編號" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__implied_ids +msgid "Inherits" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Internal Notes" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__parent_ids +msgid "" +"Inverse relation for the Inherits field. The groups from which this group is " +"inheriting" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_uid +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_uid +msgid "Last Updated by" +msgstr "最後更新:" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__write_date +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__write_date +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__write_date +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__write_date +msgid "Last Updated on" +msgstr "最後更新於" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__model_access_count +msgid "Model Access Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_create_role_from_user__name +#: model:ir.model.fields,field_description:base_user_role.field_wizard_groups_into_role__name +msgid "Name" +msgstr "名稱" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__trans_parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_parent_ids +msgid "Parent Groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__parent_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__parent_ids +msgid "Parents" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Record Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_id +msgid "Relation for the groups that represents a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_id +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__role_id +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__role_id +msgid "Role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_line_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__line_ids +msgid "Role lines" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,help:base_user_role.field_res_users_role__role_ids +msgid "Roles in which the group is involved" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rule_groups +msgid "Rules" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__rules_count +msgid "Rules Count" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__share +msgid "Share Group" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users__show_alert +msgid "Show Alert" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__date_to +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__date_to +msgid "To" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__trans_implied_ids +msgid "Transitively inherits" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.server,name:base_user_role.cron_update_users_ir_actions_server +msgid "Update user roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role_line__user_id +msgid "User" +msgstr "使用者" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role +msgid "User Role" +msgstr "" + +#. module: base_user_role +#: model:ir.actions.act_window,name:base_user_role.action_res_users_role_tree +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users__role_ids +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__role_ids +#: model:ir.ui.menu,name:base_user_role.menu_action_res_users_role_tree +#: model_terms:ir.ui.view,arch_db:base_user_role.res_groups_view_form +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_form_inherit +msgid "User Roles" +msgstr "" + +#. module: base_user_role +#: model:ir.module.category,name:base_user_role.ir_module_category_role +msgid "User roles" +msgstr "" + +#. module: base_user_role +#: model:ir.model.constraint,message:base_user_role.constraint_res_users_role_line_user_role_uniq +msgid "User roles can be assigned to a user only once at a time" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__users +#: model:ir.model.fields,field_description:base_user_role.field_role_add_users_wizard__user_ids +#: model_terms:ir.ui.view,arch_db:base_user_role.view_res_users_role_form +msgid "Users" +msgstr "" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_res_users_role_line +msgid "Users associated to a role" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__user_ids +msgid "Users list" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,help:base_user_role.field_res_users_role__implied_ids +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base_user_role +#: model:ir.model.fields,field_description:base_user_role.field_res_groups__view_access +#: model:ir.model.fields,field_description:base_user_role.field_res_users_role__view_access +msgid "Views" +msgstr "檢視" + +#. module: base_user_role +#: model:ir.model,name:base_user_role.model_role_add_users_wizard +msgid "Wizard to add multiple users to a role" +msgstr "" + +#. module: base_user_role +#: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view +msgid "or" +msgstr "" + +#~ msgid "Last Modified on" +#~ msgstr "最後修改:" diff --git a/base_user_role/models/__init__.py b/base_user_role/models/__init__.py new file mode 100644 index 00000000..44140bcd --- /dev/null +++ b/base_user_role/models/__init__.py @@ -0,0 +1,3 @@ +from . import role +from . import user +from . import res_groups diff --git a/base_user_role/models/res_groups.py b/base_user_role/models/res_groups.py new file mode 100644 index 00000000..552af94b --- /dev/null +++ b/base_user_role/models/res_groups.py @@ -0,0 +1,87 @@ +from odoo import api, fields, models + + +class ResGroups(models.Model): + _inherit = "res.groups" + + view_access = fields.Many2many( + groups="base.group_system", + ) + + # The inverse field of the field group_id on the res.users.role model + # This field should be used a One2one relation as a role can only be + # represented by one group. It's declared as a One2many field as the + # inverse field on the res.users.role it's declared as a Many2one + role_id = fields.One2many( + comodel_name="res.users.role", + inverse_name="group_id", + help="Relation for the groups that represents a role", + ) + + role_ids = fields.Many2many( + comodel_name="res.users.role", + relation="res_groups_implied_roles_rel", + string="User Roles", + compute="_compute_role_ids", + help="Roles in which the group is involved", + ) + + parent_ids = fields.Many2many( + "res.groups", + "res_groups_implied_rel", + "hid", + "gid", + string="Parents", + help="Inverse relation for the Inherits field. " + "The groups from which this group is inheriting", + ) + + trans_parent_ids = fields.Many2many( + comodel_name="res.groups", + string="Parent Groups", + compute="_compute_trans_parent_ids", + recursive=True, + ) + + role_count = fields.Integer("# User Roles", compute="_compute_role_count") + + def _compute_role_count(self): + for group in self: + group.role_count = len(group.role_ids) + + @api.depends("parent_ids.trans_parent_ids") + def _compute_trans_parent_ids(self): + for group in self: + group.trans_parent_ids = ( + group.parent_ids | group.parent_ids.trans_parent_ids + ) + + def _compute_role_ids(self): + for group in self: + if group.trans_parent_ids: + group.role_ids = group.trans_parent_ids.role_id + else: + group.role_ids = group.role_id + + def action_view_roles(self): + self.ensure_one() + action = self.env["ir.actions.act_window"]._for_xml_id( + "base_user_role.action_res_users_role_tree" + ) + action["context"] = {} + if len(self.role_ids) > 1: + action["domain"] = [("id", "in", self.role_ids.ids)] + elif self.role_ids: + form_view = [ + (self.env.ref("base_user_role.view_res_users_role_form").id, "form") + ] + if "views" in action: + action["views"] = form_view + [ + (state, view) for state, view in action["views"] if view != "form" + ] + else: + action["views"] = form_view + action["res_id"] = self.role_ids.id + else: + action = {"type": "ir.actions.act_window_close"} + return action diff --git a/base_user_role/models/role.py b/base_user_role/models/role.py new file mode 100644 index 00000000..ac03f657 --- /dev/null +++ b/base_user_role/models/role.py @@ -0,0 +1,170 @@ +# Copyright 2014 ABF OSIELL +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +import datetime +import logging + +from odoo import SUPERUSER_ID, _, api, fields, models + +_logger = logging.getLogger(__name__) + + +class ResUsersRole(models.Model): + _name = "res.users.role" + _inherits = {"res.groups": "group_id"} + _description = "User Role" + + group_id = fields.Many2one( + comodel_name="res.groups", + required=True, + ondelete="cascade", + readonly=True, + string="Associated group", + ) + line_ids = fields.One2many( + comodel_name="res.users.role.line", inverse_name="role_id", string="Role lines" + ) + user_ids = fields.One2many( + comodel_name="res.users", string="Users list", compute="_compute_user_ids" + ) + rule_ids = fields.Many2many( + comodel_name="ir.rule", + compute="_compute_rule_ids", + string="Record Rules", + required=False, + ) + rules_count = fields.Integer(compute="_compute_rule_ids") + model_access_ids = fields.Many2many( + comodel_name="ir.model.access", + compute="_compute_model_access_ids", + string="Access Rights", + required=False, + ) + model_access_count = fields.Integer(compute="_compute_model_access_ids") + + @api.depends("line_ids.user_id") + def _compute_user_ids(self): + for role in self.sudo() if self._bypass_rules() else self: + role.user_ids = role.line_ids.mapped("user_id") + + @api.depends("implied_ids", "implied_ids.model_access") + def _compute_model_access_ids(self): + for rec in self: + rec.model_access_ids = rec.implied_ids.model_access.ids + rec.model_access_count = len(rec.model_access_ids) + + @api.depends("implied_ids", "implied_ids.rule_groups") + def _compute_rule_ids(self): + for rec in self: + rec.rule_ids = rec.implied_ids.rule_groups.ids + rec.rules_count = len(rec.rule_ids) + + @api.model + def _bypass_rules(self): + # Run methods as super user to avoid problems by "Administrator/Access Right" + return self._name == "res.users.role" and self.env.user.has_group( + "base.group_erp_manager" + ) + + @api.model_create_multi + def create(self, vals_list): + model = (self.sudo() if self._bypass_rules() else self).browse() + new_records = super(ResUsersRole, model).create(vals_list) + new_records.update_users() + return new_records + + def read(self, fields=None, load="_classic_read"): + recs = self.sudo() if self._bypass_rules() else self + return super(ResUsersRole, recs).read(fields, load) + + def write(self, vals): + recs = self.sudo() if self._bypass_rules() else self + # Workaround to solve issue with broken code in odoo that clear the + # cache during the write: see odoo/addons/base/models/res_users.py#L226 + groups_vals = {} + for field in recs.group_id._fields: + if field in vals: + groups_vals[field] = vals.pop(field) + if groups_vals: + recs.group_id.write(groups_vals) + res = super(ResUsersRole, recs).write(vals) + recs.update_users() + return res + + def unlink(self): + users = self.mapped("user_ids") + res = super().unlink() + users.set_groups_from_roles(force=True) + return res + + def copy(self, default=None): + self.ensure_one() + default = dict(default or {}, name=_("%s (copy)", self.name)) + return super().copy(default) + + def update_users(self): + """Update all the users concerned by the roles identified by `ids`.""" + users = self.mapped("user_ids") + users.set_groups_from_roles() + return True + + @api.model + def cron_update_users(self): + logging.info("Update user roles") + self.search([]).update_users() + + def show_rule_ids(self): + action = self.env["ir.actions.actions"]._for_xml_id("base.action_rule") + action["domain"] = [("id", "in", self.rule_ids.ids)] + return action + + def show_model_access_ids(self): + action = self.env["ir.actions.actions"]._for_xml_id("base.ir_access_act") + action["domain"] = [("id", "in", self.model_access_ids.ids)] + return action + + +class ResUsersRoleLine(models.Model): + _name = "res.users.role.line" + _description = "Users associated to a role" + + active = fields.Boolean(related="user_id.active") + role_id = fields.Many2one( + comodel_name="res.users.role", required=True, string="Role", ondelete="cascade" + ) + user_id = fields.Many2one( + comodel_name="res.users", + required=True, + string="User", + domain=[("id", "!=", SUPERUSER_ID)], + ondelete="cascade", + ) + date_from = fields.Date("From") + date_to = fields.Date("To") + is_enabled = fields.Boolean("Enabled", compute="_compute_is_enabled") + _sql_constraints = [ + ( + "user_role_uniq", + "unique (user_id,role_id)", + "User roles can be assigned to a user only once at a time", + ) + ] + + @api.depends("date_from", "date_to") + def _compute_is_enabled(self): + today = datetime.date.today() + for role_line in self: + role_line.is_enabled = True + if role_line.date_from: + date_from = role_line.date_from + if date_from > today: + role_line.is_enabled = False + if role_line.date_to: + date_to = role_line.date_to + if today > date_to: + role_line.is_enabled = False + + def unlink(self): + users = self.mapped("user_id") + res = super().unlink() + users.set_groups_from_roles(force=True) + return res diff --git a/base_user_role/models/user.py b/base_user_role/models/user.py new file mode 100644 index 00000000..28a7228e --- /dev/null +++ b/base_user_role/models/user.py @@ -0,0 +1,107 @@ +# Copyright 2014 ABF OSIELL +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +from odoo import api, fields, models + + +class ResUsers(models.Model): + _inherit = "res.users" + + role_line_ids = fields.One2many( + comodel_name="res.users.role.line", + inverse_name="user_id", + string="Role lines", + default=lambda self: self._default_role_lines(), + groups="base.group_erp_manager", + ) + + show_alert = fields.Boolean(compute="_compute_show_alert") + + @api.depends("role_line_ids") + def _compute_show_alert(self): + for user in self: + user.show_alert = user.role_line_ids.filtered(lambda rec: rec.is_enabled) + + role_ids = fields.One2many( + comodel_name="res.users.role", + string="User Roles", + compute="_compute_role_ids", + compute_sudo=True, + groups="base.group_erp_manager", + ) + + @api.model + def _default_role_lines(self): + default_user = self.env.ref("base.default_user", raise_if_not_found=False) + default_values = [] + if default_user: + for role_line in default_user.with_context(active_test=False).role_line_ids: + default_values.append( + { + "role_id": role_line.role_id.id, + "date_from": role_line.date_from, + "date_to": role_line.date_to, + "is_enabled": role_line.is_enabled, + } + ) + return default_values + + @api.depends("role_line_ids.role_id") + def _compute_role_ids(self): + for user in self: + user.role_ids = user.role_line_ids.mapped("role_id") + + @api.model_create_multi + def create(self, vals_list): + new_records = super().create(vals_list) + new_records.set_groups_from_roles() + return new_records + + def write(self, vals): + res = super().write(vals) + self.sudo().set_groups_from_roles() + return res + + def _get_enabled_roles(self): + return self.role_line_ids.filtered(lambda rec: rec.is_enabled) + + @api.model + def _get_self_writable_groups(self): + group = self.env.ref( + "mail.group_mail_notification_type_inbox", raise_if_not_found=False + ) + return group or self.env["res.groups"] + + def set_groups_from_roles(self, force=False): + """Set (replace) the groups following the roles defined on users. + If no role is defined on the user, its groups are let untouched unless + the `force` parameter is `True`. + """ + role_groups = {} + # We obtain all the groups associated to each role first, so that + # it is faster to compare later with each user's groups. + for role in self.mapped("role_line_ids.role_id"): + role_groups[role] = list( + set( + role.group_id.ids + + role.implied_ids.ids + + role.all_implied_ids.ids + ) + ) + self_writable_group_ids = self._get_self_writable_groups().ids + for user in self: + if not user.role_line_ids and not force: + continue + user_group_ids = set(user.group_ids.ids).difference(self_writable_group_ids) + group_ids = set() + for role_line in user._get_enabled_roles(): + role = role_line.role_id + group_ids.update(role_groups[role]) + groups_to_add = group_ids - user_group_ids + groups_to_remove = user_group_ids - group_ids + to_add = [(4, gr) for gr in groups_to_add] + to_remove = [(3, gr) for gr in groups_to_remove] + groups = to_remove + to_add + if groups: + vals = {"group_ids": groups} + super(ResUsers, user).write(vals) + return True diff --git a/base_user_role/pyproject.toml b/base_user_role/pyproject.toml new file mode 100644 index 00000000..4231d0cc --- /dev/null +++ b/base_user_role/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/base_user_role/readme/CONFIGURE.md b/base_user_role/readme/CONFIGURE.md new file mode 100644 index 00000000..95a56381 --- /dev/null +++ b/base_user_role/readme/CONFIGURE.md @@ -0,0 +1,22 @@ +To configure this module, you need to go to *Settings / Users / Roles*, +and create a new role. From there, you can add groups to compose your +role, and then associate users to it. + +You can also define default roles for a new user by editing the user +called "Default User". + +Roles: + +![](/OCA/server-backend/16.0/base_user_role/static/description/roles.png) + +Add groups: + +![](/OCA/server-backend/16.0/base_user_role/static/description/role_groups.png) + +Add users (with dates or not): + +![](/OCA/server-backend/16.0/base_user_role/static/description/role_users.png) + +Instead of creating roles from scratch, it is possible to create a role +based on the groups of an existing user: select or open the user and +choose "Create role from user" in the action menu. diff --git a/base_user_role/readme/CONTRIBUTORS.md b/base_user_role/readme/CONTRIBUTORS.md new file mode 100644 index 00000000..39d94fbe --- /dev/null +++ b/base_user_role/readme/CONTRIBUTORS.md @@ -0,0 +1,15 @@ +- Sébastien Alix \<\> +- Duc, Dao Dong \<\> + () +- Jean-Charles Drubay \<\> + () +- Alan Ramos \<\> () +- Harald Panten \<\> +- Kevin Khao \<\> +- Tatiana Deribina \<\> + () +- Guillem Casassas \<\> +- Guillaume Pothier \<\> + +Do not contact contributors directly about support or help with +technical issues. diff --git a/base_user_role/readme/CREDITS.md b/base_user_role/readme/CREDITS.md new file mode 100644 index 00000000..7c749e6c --- /dev/null +++ b/base_user_role/readme/CREDITS.md @@ -0,0 +1,5 @@ +## Images + +- Oxygen Team: + [Icon](http://www.iconarchive.com/show/oxygen-icons-by-oxygen-icons.org/Actions-user-group-new-icon.html) + (LGPL) diff --git a/base_user_role/readme/DESCRIPTION.md b/base_user_role/readme/DESCRIPTION.md new file mode 100644 index 00000000..42ca49c0 --- /dev/null +++ b/base_user_role/readme/DESCRIPTION.md @@ -0,0 +1,22 @@ +This module was written to extend the standard functionality regarding +users and groups management. It helps creating well-defined user roles +and associating them to users. + +It can become very hard to maintain a large number of user profiles over +time, juggling with many technical groups. For this purpose, this module +will help you to: + +> - define functional roles by aggregating low-level groups, +> - set user accounts with the predefined roles (roles are cumulative), +> - update groups of all relevant user accounts (all at once), +> - ensure that user accounts will have the groups defined in their +> roles (nothing more, nothing less). In other words, you can not set +> groups manually on a user as long as there is roles configured on +> it, +> - activate/deactivate roles depending on the date (useful to plan +> holidays, etc) +> - get a quick overview of roles and the related user accounts. + +That way you make clear the different responsabilities within a company, +and are able to add and update user accounts in a scalable and reliable +way. diff --git a/base_user_role/readme/USAGE.md b/base_user_role/readme/USAGE.md new file mode 100644 index 00000000..8d016e3f --- /dev/null +++ b/base_user_role/readme/USAGE.md @@ -0,0 +1,5 @@ +To use this module, you need to: + +1. Go to Configuration / Users / Users choose user and set Roles: + +![image](/OCA/server-backend/base_user_role/static/description/user_form.png) diff --git a/base_user_role/security/ir.model.access.csv b/base_user_role/security/ir.model.access.csv new file mode 100644 index 00000000..74d2512a --- /dev/null +++ b/base_user_role/security/ir.model.access.csv @@ -0,0 +1,6 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_res_users_role,access_res_users_role,model_res_users_role,"base.group_erp_manager",1,1,1,1 +access_res_users_role_line,access_res_users_role_line,model_res_users_role_line,"base.group_erp_manager",1,1,1,1 +access_wizard_create_role_from_user,access_wizard_create_role_from_user,model_wizard_create_role_from_user,"base.group_erp_manager",1,1,1,1 +access_wizard_groups_into_role,access_wizard_groups_into_role,model_wizard_groups_into_role,"base.group_erp_manager",1,1,1,1 +access_role_add_users_wizard,access_role_add_users_wizard,model_role_add_users_wizard,base.group_erp_manager,1,1,1,1 diff --git a/base_user_role/static/description/icon.png b/base_user_role/static/description/icon.png new file mode 100644 index 00000000..4a8a6d74 Binary files /dev/null and b/base_user_role/static/description/icon.png differ diff --git a/base_user_role/static/description/index.html b/base_user_role/static/description/index.html new file mode 100644 index 00000000..00038a43 --- /dev/null +++ b/base_user_role/static/description/index.html @@ -0,0 +1,507 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

User roles

+ +

Production/Stable License: LGPL-3 OCA/server-backend Translate me on Weblate Try me on Runboat

+

This module was written to extend the standard functionality regarding +users and groups management. It helps creating well-defined user roles +and associating them to users.

+

It can become very hard to maintain a large number of user profiles over +time, juggling with many technical groups. For this purpose, this module +will help you to:

+
+
    +
  • define functional roles by aggregating low-level groups,
  • +
  • set user accounts with the predefined roles (roles are cumulative),
  • +
  • update groups of all relevant user accounts (all at once),
  • +
  • ensure that user accounts will have the groups defined in their +roles (nothing more, nothing less). In other words, you can not set +groups manually on a user as long as there is roles configured on +it,
  • +
  • activate/deactivate roles depending on the date (useful to plan +holidays, etc)
  • +
  • get a quick overview of roles and the related user accounts.
  • +
+
+

That way you make clear the different responsabilities within a company, +and are able to add and update user accounts in a scalable and reliable +way.

+

Table of contents

+ +
+

Configuration

+

To configure this module, you need to go to Settings / Users / Roles, +and create a new role. From there, you can add groups to compose your +role, and then associate users to it.

+

You can also define default roles for a new user by editing the user +called “Default User”.

+

Roles:

+

image1

+

Add groups:

+

image2

+

Add users (with dates or not):

+

image3

+

Instead of creating roles from scratch, it is possible to create a role +based on the groups of an existing user: select or open the user and +choose “Create role from user” in the action menu.

+
+
+

Usage

+

To use this module, you need to:

+
    +
  1. Go to Configuration / Users / Users choose user and set Roles:
  2. +
+

image

+
+
+

Bug Tracker

+

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

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • ABF OSIELL
  • +
+
+
+

Contributors

+ +

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

+
+
+

Other credits

+
+

Images

+
    +
  • Oxygen Team: +Icon +(LGPL)
  • +
+
+
+
+

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 maintainers:

+

sebalix jcdrubay novawish

+

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

+

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

+
+
+
+
+ + diff --git a/base_user_role/static/description/role_groups.png b/base_user_role/static/description/role_groups.png new file mode 100644 index 00000000..ee31ef97 Binary files /dev/null and b/base_user_role/static/description/role_groups.png differ diff --git a/base_user_role/static/description/role_users.png b/base_user_role/static/description/role_users.png new file mode 100644 index 00000000..ceb7f6ea Binary files /dev/null and b/base_user_role/static/description/role_users.png differ diff --git a/base_user_role/static/description/roles.png b/base_user_role/static/description/roles.png new file mode 100644 index 00000000..e3f0d4a6 Binary files /dev/null and b/base_user_role/static/description/roles.png differ diff --git a/base_user_role/static/description/user_form.png b/base_user_role/static/description/user_form.png new file mode 100644 index 00000000..78e6a1cf Binary files /dev/null and b/base_user_role/static/description/user_form.png differ diff --git a/base_user_role/tests/__init__.py b/base_user_role/tests/__init__.py new file mode 100644 index 00000000..8b001302 --- /dev/null +++ b/base_user_role/tests/__init__.py @@ -0,0 +1,3 @@ +from . import test_user_role +from . import test_role_add_users_wizard +from . import test_cron diff --git a/base_user_role/tests/test_cron.py b/base_user_role/tests/test_cron.py new file mode 100644 index 00000000..adf7371f --- /dev/null +++ b/base_user_role/tests/test_cron.py @@ -0,0 +1,73 @@ +# Copyright 2024 DOB +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +from odoo.tests.common import TransactionCase + + +class TestUserRoleCron(TransactionCase): + """Tests for the scheduled role synchronization cron job. + + Validates: Requirement 7.3 + """ + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env( + context=dict(cls.env.context, tracking_disable=True, no_reset_password=True) + ) + cls.role_model = cls.env["res.users.role"] + cls.user_model = cls.env["res.users"] + + cls.group_user = cls.env.ref("base.group_user") + cls.group_no_one = cls.env.ref("base.group_no_one") + + cls.role = cls.role_model.create( + { + "name": "CRON_TEST_ROLE", + "implied_ids": [(6, 0, [cls.group_user.id, cls.group_no_one.id])], + } + ) + + cls.user1 = cls.user_model.create( + {"name": "Cron Test User 1", "login": "cron_test_user_1"} + ) + cls.user2 = cls.user_model.create( + {"name": "Cron Test User 2", "login": "cron_test_user_2"} + ) + + def test_cron_update_users_syncs_group_membership(self): + """WHEN the role sync cron is called, group membership is updated + for all users with roles. + + Validates: Requirement 7.3 + """ + # Assign the role to both users + self.user1.write({"role_line_ids": [(0, 0, {"role_id": self.role.id})]}) + self.user2.write({"role_line_ids": [(0, 0, {"role_id": self.role.id})]}) + + expected_groups = set( + self.role.group_id.ids + + self.role.implied_ids.ids + + self.role.trans_implied_ids.ids + ) + + # Manually clear groups to simulate a desync state + for user in (self.user1, self.user2): + super(type(user), user).write({"group_ids": [(5,)]}) + + # Verify groups are cleared + self.assertFalse( + expected_groups.issubset(set(self.user1.group_ids.ids)), + "Groups should be cleared before cron runs", + ) + + # Run the cron + self.role_model.cron_update_users() + + # Verify groups are restored for both users + for user in (self.user1, self.user2): + user_group_ids = set(user.group_ids.ids) + self.assertTrue( + expected_groups.issubset(user_group_ids), + f"User {user.name} should have all role groups after cron sync", + ) diff --git a/base_user_role/tests/test_role_add_users_wizard.py b/base_user_role/tests/test_role_add_users_wizard.py new file mode 100644 index 00000000..3ae637bc --- /dev/null +++ b/base_user_role/tests/test_role_add_users_wizard.py @@ -0,0 +1,118 @@ +from odoo import Command +from odoo.tests.common import TransactionCase + + +class TestRoleAddUsersWizard(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.role = cls.env["res.users.role"].create( + { + "name": "Test Role", + } + ) + cls.user1 = cls.env["res.users"].create( + { + "name": "Test User 1", + "login": "testuser1", + "email": "testuser1@example.com", + } + ) + cls.user2 = cls.env["res.users"].create( + { + "name": "Test User 2", + "login": "testuser2", + "email": "testuser2@example.com", + } + ) + cls.user3 = cls.env["res.users"].create( + { + "name": "Test User 3", + "login": "testuser3", + "email": "testuser3@example.com", + } + ) + + def test_add_new_users_to_role(self): + """Test adding new users to a role without existing users""" + wizard = self.env["role.add.users.wizard"].create( + { + "role_id": self.role.id, + "user_ids": [Command.set([self.user1.id, self.user2.id])], + "date_from": "2024-01-01", + "date_to": "2024-12-31", + } + ) + + result = wizard.action_add_users() + self.assertEqual(result["type"], "ir.actions.act_window_close") + self.assertEqual(len(self.role.line_ids), 2) + self.assertIn(self.user1, self.role.line_ids.mapped("user_id")) + self.assertIn(self.user2, self.role.line_ids.mapped("user_id")) + for line in self.role.line_ids: + self.assertEqual(str(line.date_from), "2024-01-01") + self.assertEqual(str(line.date_to), "2024-12-31") + + def test_add_users_with_existing_users(self): + """Test adding users when some already exist in the role""" + self.env["res.users.role.line"].create( + { + "role_id": self.role.id, + "user_id": self.user1.id, + } + ) + + wizard = self.env["role.add.users.wizard"].create( + { + "role_id": self.role.id, + "user_ids": [Command.set([self.user1.id, self.user2.id])], + } + ) + + wizard.action_add_users() + self.assertEqual(len(self.role.line_ids), 2) + users_in_role = self.role.line_ids.mapped("user_id") + self.assertIn(self.user1, users_in_role) + self.assertIn(self.user2, users_in_role) + + user1_lines = self.role.line_ids.filtered( + lambda line: line.user_id == self.user1 + ) + self.assertEqual(len(user1_lines), 1) + + def test_add_users_without_dates(self): + """Test adding users without specifying dates""" + wizard = self.env["role.add.users.wizard"].create( + { + "role_id": self.role.id, + "user_ids": [Command.set([self.user3.id])], + } + ) + + wizard.action_add_users() + self.assertEqual(len(self.role.line_ids), 1) + line = self.role.line_ids[0] + self.assertEqual(line.user_id, self.user3) + self.assertFalse(line.date_from) + self.assertFalse(line.date_to) + + def test_add_multiple_new_users(self): + """Test adding multiple new users at once""" + wizard = self.env["role.add.users.wizard"].create( + { + "role_id": self.role.id, + "user_ids": [ + Command.set([self.user1.id, self.user2.id, self.user3.id]) + ], + "date_from": "2024-06-01", + } + ) + + wizard.action_add_users() + self.assertEqual(len(self.role.line_ids), 3) + users_in_role = self.role.line_ids.mapped("user_id") + self.assertEqual( + set(users_in_role.ids), {self.user1.id, self.user2.id, self.user3.id} + ) + for line in self.role.line_ids: + self.assertEqual(str(line.date_from), "2024-06-01") diff --git a/base_user_role/tests/test_user_role.py b/base_user_role/tests/test_user_role.py new file mode 100644 index 00000000..ddaa5009 --- /dev/null +++ b/base_user_role/tests/test_user_role.py @@ -0,0 +1,291 @@ +# Copyright 2014 ABF OSIELL +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +import datetime + +from odoo import fields +from odoo.exceptions import AccessError +from odoo.tests import tagged +from odoo.tests.common import TransactionCase + + +class TestUserRole(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env( + context=dict(cls.env.context, tracking_disable=True, no_reset_password=True) + ) + cls.user_model = cls.env["res.users"] + cls.role_model = cls.env["res.users.role"] + cls.wiz_model = cls.env["wizard.groups.into.role"] + + cls.company1 = cls.env.ref("base.main_company") + cls.company2 = cls.env["res.company"].create({"name": "company2"}) + cls.default_user = cls.user_model.create( + {"name": "Default User Template", "login": "default_user_template_test", "active": False} + ) + cls.user_id = cls.user_model.create( + {"name": "USER TEST (ROLES)", "login": "user_test_roles"} + ) + + # ROLE_1 + cls.group_user_id = cls.env.ref("base.group_user") + cls.group_no_one_id = cls.env.ref("base.group_no_one") + vals = { + "name": "ROLE_1", + "implied_ids": [(6, 0, [cls.group_user_id.id, cls.group_no_one_id.id])], + } + cls.role1_id = cls.role_model.create(vals) + + # ROLE_2 + # Must have group_user in order to have sufficient groups. Check: + # github.com/odoo/odoo/commit/c3717f3018ce0571aa41f70da4262cc946d883b4 + cls.group_multi_currency_id = cls.env.ref("base.group_multi_currency") + cls.group_settings_id = cls.env.ref("base.group_system") + vals = { + "name": "ROLE_2", + "implied_ids": [ + ( + 6, + 0, + [ + cls.group_user_id.id, + cls.group_multi_currency_id.id, + cls.group_settings_id.id, + ], + ) + ], + } + cls.role2_id = cls.role_model.create(vals) + + # Setup for multi-company testing + cls.multicompany_user_1 = cls.user_model.create( + { + "name": "User 2", + "company_id": cls.company1.id, + "company_ids": [(6, 0, [cls.company1.id, cls.company2.id])], + "group_ids": [(6, 0, cls.env.ref("base.group_erp_manager").ids)], + "login": "multicompany_user_1", + } + ) + cls.multicompany_user_2 = cls.user_model.create( + { + "name": "User 2", + "company_id": cls.company2.id, + "company_ids": [(6, 0, [cls.company2.id])], + "group_ids": [(6, 0, cls.env.ref("base.group_user").ids)], + "login": "multicompany_user_2", + } + ) + cls.multicompany_role = cls.role_model.create( + { + "name": "MULTICOMPANY_ROLE", + "implied_ids": [(6, 0, [cls.group_user_id.id])], + "line_ids": [(0, 0, {"user_id": cls.multicompany_user_2.id})], + } + ) + + def test_role_1(self): + self.user_id.write({"role_line_ids": [(0, 0, {"role_id": self.role1_id.id})]}) + user_group_ids = sorted({group.id for group in self.user_id.group_ids}) + role_group_ids = self.role1_id.all_implied_ids.ids + role_group_ids.append(self.role1_id.group_id.id) + role_group_ids = sorted(set(role_group_ids)) + self.assertEqual(user_group_ids, role_group_ids) + + def test_role_2(self): + self.user_id.write({"role_line_ids": [(0, 0, {"role_id": self.role2_id.id})]}) + user_group_ids = sorted({group.id for group in self.user_id.group_ids}) + role_group_ids = self.role2_id.all_implied_ids.ids + role_group_ids.append(self.role2_id.group_id.id) + role_group_ids = sorted(set(role_group_ids)) + self.assertEqual(user_group_ids, role_group_ids) + + def test_role_1_2(self): + self.user_id.write( + { + "role_line_ids": [ + (0, 0, {"role_id": self.role1_id.id}), + (0, 0, {"role_id": self.role2_id.id}), + ] + } + ) + user_group_ids = sorted({group.id for group in self.user_id.group_ids}) + role1_group_ids = self.role1_id.all_implied_ids.ids + role1_group_ids.append(self.role1_id.group_id.id) + role2_group_ids = self.role2_id.all_implied_ids.ids + role2_group_ids.append(self.role2_id.group_id.id) + role_group_ids = sorted(set(role1_group_ids + role2_group_ids)) + self.assertEqual(user_group_ids, role_group_ids) + + def test_role_1_2_with_dates(self): + today_str = fields.Date.today() + today = fields.Date.from_string(today_str) + yesterday = today - datetime.timedelta(days=1) + yesterday_str = fields.Date.to_string(yesterday) + self.user_id.write( + { + "role_line_ids": [ + # Role 1 should be enabled + (0, 0, {"role_id": self.role1_id.id, "date_from": today_str}), + # Role 2 should be disabled + (0, 0, {"role_id": self.role2_id.id, "date_to": yesterday_str}), + ] + } + ) + user_group_ids = sorted({group.id for group in self.user_id.group_ids}) + role1_group_ids = self.role1_id.all_implied_ids.ids + role1_group_ids.append(self.role1_id.group_id.id) + role_group_ids = sorted(set(role1_group_ids)) + self.assertEqual(user_group_ids, role_group_ids) + + def test_role_unlink(self): + # Get role1 and role2 groups + role1_groups = self.role1_id.all_implied_ids | self.role1_id.group_id + role2_groups = self.role2_id.all_implied_ids | self.role2_id.group_id + + # Configure the user with role1 and role2 + self.user_id.write( + { + "role_line_ids": [ + (0, 0, {"role_id": self.role1_id.id}), + (0, 0, {"role_id": self.role2_id.id}), + ] + } + ) + # Check user has groups from role1 and role2 + self.assertLessEqual(role1_groups, self.user_id.group_ids) + self.assertLessEqual(role2_groups, self.user_id.group_ids) + # Remove role2 + self.role2_id.unlink() + # Check user has groups from only role1 + self.assertLessEqual(role1_groups, self.user_id.group_ids) + self.assertFalse(role2_groups <= self.user_id.group_ids) + # Remove role1 + self.role1_id.unlink() + # Check user has no groups from role1 and role2 + self.assertFalse(role1_groups <= self.user_id.group_ids) + self.assertFalse(role2_groups <= self.user_id.group_ids) + + def test_role_line_unlink(self): + # Get role1 and role2 groups + role1_groups = self.role1_id.all_implied_ids | self.role1_id.group_ids + role2_groups = self.role2_id.all_implied_ids | self.role2_id.group_ids + + # Configure the user with role1 and role2 + self.user_id.write( + { + "role_line_ids": [ + (0, 0, {"role_id": self.role1_id.id}), + (0, 0, {"role_id": self.role2_id.id}), + ] + } + ) + # Check user has groups from role1 and role2 + self.assertLessEqual(role1_groups, self.user_id.group_ids) + self.assertLessEqual(role2_groups, self.user_id.group_ids) + # Remove role2 from the user + self.user_id.role_line_ids.filtered( + lambda rl: rl.role_id.id == self.role2_id.id + ).unlink() + # Check user has groups from only role1 + self.assertLessEqual(role1_groups, self.user_id.group_ids) + self.assertFalse(role2_groups <= self.user_id.group_ids) + # Remove role1 from the user + self.user_id.role_line_ids.filtered( + lambda rl: rl.role_id.id == self.role1_id.id + ).unlink() + # Check user has no groups from role1 and role2 + self.assertFalse(role1_groups <= self.user_id.group_ids) + self.assertFalse(role2_groups <= self.user_id.group_ids) + + def test_default_user_roles(self): + self.default_user.write( + { + "role_line_ids": [ + (0, 0, {"role_id": self.role1_id.id}), + (0, 0, {"role_id": self.role2_id.id}), + ] + } + ) + user = self.user_model.create( + {"name": "USER TEST (DEFAULT ROLES)", "login": "user_test_default_roles"} + ) + roles = self.role_model.browse([self.role1_id.id, self.role2_id.id]) + self.assertEqual(user.role_ids, roles) + + def test_role_multicompany(self): + """Test AccessError when admin-like user accesses a role""" + role = self.multicompany_role.with_user(self.multicompany_user_1) + # Dummy read to check that multicompany user 1 has read access + role.read() + # Dummy read to check that multicompany user 1 has read access on the + # whole role, even if it's using a different company than multicompany + # user 2 (which is included in the role) + role.with_context(allowed_company_ids=self.company1.ids).read() + # Downgrade multicompany user 1 to common user + self.multicompany_user_1.write( + {"group_ids": [(6, 0, self.env.ref("base.group_user").ids)]} + ) + # Check that the user cannot read multicompany data again since it lost + # its admin privileges + with self.assertRaisesRegex( + AccessError, "You are not allowed to access 'User Role'" + ): + role.read() + + @tagged("-at_install", "post_install") + def test_notification_type_not_reset(self): + """Test that roles don't reset notification settings.""" + if self.env["ir.module.module"]._get("mail").state != "installed": + self.skipTest("Mail module is not installed.") + notification_group = self.env.ref("mail.group_mail_notification_type_inbox") + self.assertNotIn(notification_group, self.user_id.group_ids) + self.user_id.notification_type = "inbox" + self.assertIn(notification_group, self.user_id.group_ids) + self.user_id.write({"role_line_ids": [(0, 0, {"role_id": self.role1_id.id})]}) + self.assertIn(notification_group, self.user_id.group_ids) + + def test_create_role_from_user(self): + # Use a wizard instance to create a new role based on the user. + # We use assign_to_user = False, as otherwise this module forcibly + # assigns the role's groups to the user, which would make this + # test useless. + wizard = self.env["wizard.create.role.from.user"].create( + { + "name": "Role for user (without assign)", + "assign_to_user": False, + } + ) + result = wizard.with_context(active_ids=[self.user_id.id]).create_from_user() + + # Check that the role has the same groups as the user + role_id = result["res_id"] + role = self.role_model.browse([role_id]) + user_group_ids = sorted(set(self.user_id.group_ids.ids)) + role_group_ids = sorted(set(role.all_implied_ids.ids)) + self.assertEqual(user_group_ids, role_group_ids) + + def test_show_alert_computation(self): + """Test the computation of the `show_alert` field.""" + self.user_id.write({"role_line_ids": [(0, 0, {"role_id": self.role1_id.id})]}) + self.assertTrue(self.user_id.show_alert) + + # disable role + self.user_id.role_line_ids.unlink() + self.assertFalse(self.user_id.show_alert) + + def test_group_groups_into_role(self): + user_group_ids = self.user_id.group_ids.ids + # Check that there is not a role with name: Test Role + self.assertFalse(self.role_model.search([("name", "=", "Test Role")])) + # Call create_role function to group groups into a role + wizard = self.wiz_model.with_context(active_ids=user_group_ids).create( + {"name": "Test Role"} + ) + res = wizard.create_role() + # Check that a role with name: Test Role has been created + new_role = self.env[res["res_model"]].browse(res["res_id"]) + self.assertEqual(new_role.name, "Test Role") + # Check that the role has the correct groups (even if the order is not equal) + self.assertEqual(set(new_role.implied_ids.ids), set(user_group_ids)) diff --git a/base_user_role/views/group.xml b/base_user_role/views/group.xml new file mode 100644 index 00000000..99d5ca92 --- /dev/null +++ b/base_user_role/views/group.xml @@ -0,0 +1,23 @@ + + + + res.groups.form - base_user_role + res.groups + + + +
+ +
+
+
+
+
diff --git a/base_user_role/views/role.xml b/base_user_role/views/role.xml new file mode 100644 index 00000000..acd2aae4 --- /dev/null +++ b/base_user_role/views/role.xml @@ -0,0 +1,107 @@ + + + + + res.users.role.form + res.users.role + +
+ +
+ + +
+ + + + + + + + + +
+ + + diff --git a/dadata_connector/tests/__init__.py b/dadata_connector/tests/__init__.py new file mode 100644 index 00000000..0d802f01 --- /dev/null +++ b/dadata_connector/tests/__init__.py @@ -0,0 +1,2 @@ +from . import test_res_partner +from . import test_wizard diff --git a/dadata_connector/tests/common.py b/dadata_connector/tests/common.py new file mode 100644 index 00000000..fc81e9ee --- /dev/null +++ b/dadata_connector/tests/common.py @@ -0,0 +1,99 @@ +from odoo.tests.common import TransactionCase + + +# Minimal DaData API response fixture for a legal entity (ООО) +DADATA_LEGAL_RESPONSE = [ + { + "data": { + "type": "LEGAL", + "inn": "7707083893", + "ogrn": "1027700132195", + "kpp": "773601001", + "okpo": "00032537", + "okved": "64.19", + "opf": {"code": "12300"}, + "name": { + "short_with_opf": "ПАО Сбербанк", + "full_with_opf": "Публичное акционерное общество «Сбербанк России»", + }, + "state": {"status": "ACTIVE"}, + "address": { + "unrestricted_value": "117997, г Москва, ул Вавилова, д 19", + "data": { + "country_iso_code": "RU", + "region_iso_code": "RU-MOW", + "city": "Москва", + "street_with_type": "ул Вавилова", + "house_type_full": "дом", + "house": "19", + "flat_type_full": None, + "flat": None, + "postal_code": "117997", + }, + }, + "documents": { + "fts_registration": { + "series": "77", + "number": "004599035", + "issue_date": "2002-08-16", + } + }, + "management": { + "name": "ГРЕФ ГЕРМАН ОСКАРОВИЧ", + "post": "ПРЕЗИДЕНТ, ПРЕДСЕДАТЕЛЬ ПРАВЛЕНИЯ", + }, + } + } +] + +# Minimal DaData API response fixture for an individual entrepreneur (ИП) +DADATA_INDIVIDUAL_RESPONSE = [ + { + "data": { + "type": "INDIVIDUAL", + "inn": "500100732259", + "ogrn": "304500116000157", + "kpp": None, + "okpo": "0107544", + "okved": "47.91", + "opf": {"code": "50102"}, + "fio": { + "surname": "ИВАНОВ", + "name": "ИВАН", + "patronymic": "ИВАНОВИЧ", + }, + "state": {"status": "ACTIVE"}, + "address": { + "unrestricted_value": "141001, Московская обл, г Мытищи", + "data": { + "country_iso_code": "RU", + "region_iso_code": "RU-MOS", + "city": "Мытищи", + "street_with_type": None, + "house_type_full": None, + "house": None, + "flat_type_full": None, + "flat": None, + "postal_code": "141001", + }, + }, + "documents": {"fts_registration": None}, + "management": None, + } + } +] + + +class DadataConnectorCommon(TransactionCase): + """Base class for dadata_connector tests.""" + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.partner = cls.env["res.partner"].create({ + "name": "Test Partner", + "is_company": True, + }) + cls.env["ir.config_parameter"].sudo().set_param( + "dadata_connector.dadata_token", "test_token_123" + ) diff --git a/dadata_connector/tests/test_res_partner.py b/dadata_connector/tests/test_res_partner.py new file mode 100644 index 00000000..c6e07047 --- /dev/null +++ b/dadata_connector/tests/test_res_partner.py @@ -0,0 +1,182 @@ +from unittest.mock import MagicMock, patch + +from odoo.exceptions import ValidationError +from odoo.tests.common import tagged + +from .common import ( + DADATA_INDIVIDUAL_RESPONSE, + DADATA_LEGAL_RESPONSE, + DadataConnectorCommon, +) + + +@tagged("post_install", "-at_install") +class TestResPartnerDadata(DadataConnectorCommon): + """Tests for res.partner DaData integration methods.""" + + # ------------------------------------------------------------------ + # get_dadata_token + # ------------------------------------------------------------------ + + def test_get_dadata_token_returns_token(self): + """Token is returned when the system parameter is set.""" + token = self.partner.get_dadata_token() + self.assertEqual(token, "test_token_123") + + def test_get_dadata_token_raises_when_missing(self): + """ValidationError is raised when token is not configured.""" + self.env["ir.config_parameter"].sudo().set_param( + "dadata_connector.dadata_token", "" + ) + with self.assertRaises(ValidationError): + self.partner.get_dadata_token() + + # ------------------------------------------------------------------ + # _parse_dadata_response — legal entity + # ------------------------------------------------------------------ + + def test_parse_legal_entity_basic_fields(self): + """Parsing a legal entity response fills basic partner fields.""" + wizard_data, result = self.partner._parse_dadata_response(DADATA_LEGAL_RESPONSE) + + self.assertEqual(result["vat"], "7707083893") + self.assertEqual(result["ogrn"], "1027700132195") + self.assertEqual(result["kpp"], "773601001") + self.assertEqual(result["okpo"], "00032537") + self.assertEqual(result["arceat"], "64.19") + self.assertEqual(result["name"], "ПАО Сбербанк") + self.assertEqual(result["city"], "Москва") + self.assertEqual(result["zip"], "117997") + self.assertEqual(result["street"], "ул Вавилова, дом, 19") + + def test_parse_legal_entity_company_form(self): + """OPF code 12300 maps to 'plc' company form.""" + _, result = self.partner._parse_dadata_response(DADATA_LEGAL_RESPONSE) + self.assertEqual(result["company_form"], "plc") + + def test_parse_legal_entity_wizard_data(self): + """Wizard data contains status, organization_type, name and address.""" + wizard_data, _ = self.partner._parse_dadata_response(DADATA_LEGAL_RESPONSE) + + self.assertEqual(wizard_data["status"], "active") + self.assertEqual(wizard_data["organization_type"], "legal") + self.assertEqual(wizard_data["name"], "ПАО Сбербанк") + self.assertIn("Вавилова", wizard_data["full_address"]) + + def test_parse_legal_entity_management(self): + """Management data is extracted when present.""" + _, result = self.partner._parse_dadata_response(DADATA_LEGAL_RESPONSE) + + self.assertIn("management", result) + self.assertEqual(result["management"]["manager_name"], "ГРЕФ ГЕРМАН ОСКАРОВИЧ") + self.assertEqual( + result["management"]["manager_position"], + "ПРЕЗИДЕНТ, ПРЕДСЕДАТЕЛЬ ПРАВЛЕНИЯ", + ) + + def test_parse_legal_entity_fts_registration(self): + """FTS registration series and number are concatenated correctly.""" + _, result = self.partner._parse_dadata_response(DADATA_LEGAL_RESPONSE) + self.assertEqual(result["sp_register_number"], "77 004599035") + self.assertEqual(result["sp_register_date"], "2002-08-16") + + def test_parse_legal_entity_country_and_state(self): + """Country and state are resolved from ISO codes when they exist in DB.""" + russia = self.env["res.country"].search([("code", "=", "RU")], limit=1) + if not russia: + self.skipTest("Russia not found in res.country — l10n data not loaded") + + _, result = self.partner._parse_dadata_response(DADATA_LEGAL_RESPONSE) + self.assertEqual(result["country_id"][0], russia.id) + + # ------------------------------------------------------------------ + # _parse_dadata_response — individual entrepreneur + # ------------------------------------------------------------------ + + def test_parse_individual_name(self): + """Individual entrepreneur name is built from fio parts.""" + _, result = self.partner._parse_dadata_response(DADATA_INDIVIDUAL_RESPONSE) + self.assertEqual(result["name"], "ИВАНОВ ИВАН ИВАНОВИЧ") + + def test_parse_individual_no_kpp(self): + """Individual entrepreneur response does not set kpp.""" + _, result = self.partner._parse_dadata_response(DADATA_INDIVIDUAL_RESPONSE) + self.assertNotIn("kpp", result) + + def test_parse_individual_no_management(self): + """No management key in result when management is absent.""" + _, result = self.partner._parse_dadata_response(DADATA_INDIVIDUAL_RESPONSE) + self.assertNotIn("management", result) + + def test_parse_individual_no_fts_registration(self): + """No sp_register_number when fts_registration is None.""" + _, result = self.partner._parse_dadata_response(DADATA_INDIVIDUAL_RESPONSE) + self.assertNotIn("sp_register_number", result) + + # ------------------------------------------------------------------ + # get_legal_entity_data + # ------------------------------------------------------------------ + + @patch("myaddons.dob.dadata_connector.models.res_partner.Dadata") + def test_get_legal_entity_data_returns_action(self, MockDadata): + """get_legal_entity_data returns an act_window action when widget=True.""" + mock_instance = MagicMock() + mock_instance.find_by_id.return_value = DADATA_LEGAL_RESPONSE + MockDadata.return_value = mock_instance + + action = self.partner.get_legal_entity_data(vat="7707083893", widget=True) + + self.assertEqual(action["type"], "ir.actions.act_window") + self.assertEqual(action["res_model"], "res.partner.auto_data.wizard") + self.assertEqual(action["target"], "new") + + @patch("myaddons.dob.dadata_connector.models.res_partner.Dadata") + def test_get_legal_entity_data_returns_dict_when_no_widget(self, MockDadata): + """get_legal_entity_data returns raw data dict when widget=False.""" + mock_instance = MagicMock() + mock_instance.find_by_id.return_value = DADATA_LEGAL_RESPONSE + MockDadata.return_value = mock_instance + + result = self.partner.get_legal_entity_data(vat="7707083893", widget=False) + + self.assertIsInstance(result, dict) + self.assertEqual(result["vat"], "7707083893") + + @patch("myaddons.dob.dadata_connector.models.res_partner.Dadata") + def test_get_legal_entity_data_raises_when_empty(self, MockDadata): + """ValidationError is raised when DaData returns no results.""" + mock_instance = MagicMock() + mock_instance.find_by_id.return_value = [] + MockDadata.return_value = mock_instance + + with self.assertRaises(ValidationError): + self.partner.get_legal_entity_data(vat="0000000000", widget=False) + + @patch("myaddons.dob.dadata_connector.models.res_partner.Dadata") + def test_get_legal_entity_data_raises_on_http_error(self, MockDadata): + """ValidationError is raised on HTTPStatusError from DaData.""" + from httpx import HTTPStatusError, Request, Response + + mock_instance = MagicMock() + mock_instance.find_by_id.side_effect = HTTPStatusError( + "401", request=MagicMock(spec=Request), response=MagicMock(spec=Response) + ) + MockDadata.return_value = mock_instance + + with self.assertRaises(ValidationError): + self.partner.get_legal_entity_data(vat="7707083893", widget=False) + + # ------------------------------------------------------------------ + # _get_view + # ------------------------------------------------------------------ + + def test_get_view_sets_dadata_search_widget_on_vat(self): + """_get_view replaces widget on vat field with dadata_search.""" + arch, _view = self.env["res.partner"]._get_view(view_type="form") + vat_nodes = arch.xpath("//field[@name='vat']") + for node in vat_nodes: + self.assertEqual( + node.get("widget"), + "dadata_search", + "vat field must use dadata_search widget", + ) diff --git a/dadata_connector/tests/test_wizard.py b/dadata_connector/tests/test_wizard.py new file mode 100644 index 00000000..7a019b5c --- /dev/null +++ b/dadata_connector/tests/test_wizard.py @@ -0,0 +1,47 @@ +from odoo.tests.common import tagged + +from .common import DadataConnectorCommon + + +@tagged("post_install", "-at_install") +class TestResPartnerAutoDataWizard(DadataConnectorCommon): + """Tests for res.partner.auto_data.wizard.""" + + def _create_wizard(self, **kwargs): + vals = { + "partner_id": self.partner.id, + "name": "ПАО Тест", + "status": "active", + "organization_type": "legal", + "full_address": "117997, г Москва, ул Вавилова, д 19", + } + vals.update(kwargs) + return self.env["res.partner.auto_data.wizard"].create(vals) + + def test_wizard_creation(self): + """Wizard record is created with expected field values.""" + wizard = self._create_wizard() + self.assertEqual(wizard.name, "ПАО Тест") + self.assertEqual(wizard.status, "active") + self.assertEqual(wizard.organization_type, "legal") + self.assertEqual(wizard.partner_id, self.partner) + + def test_button_yes_returns_close_action(self): + """button_yes returns act_window_close with update flag.""" + wizard = self._create_wizard() + result = wizard.button_yes() + + self.assertEqual(result["type"], "ir.actions.act_window_close") + self.assertTrue(result["infos"]["update"]) + + def test_wizard_status_selection_values(self): + """All expected status values are accepted.""" + statuses = ["active", "liquidating", "liquidated", "bankrupt", "reorganizing"] + for status in statuses: + wizard = self._create_wizard(status=status) + self.assertEqual(wizard.status, status) + + def test_wizard_organization_type_individual(self): + """Wizard accepts individual organization type.""" + wizard = self._create_wizard(organization_type="individual") + self.assertEqual(wizard.organization_type, "individual") diff --git a/dadata_connector/views/res_config_settings_view.xml b/dadata_connector/views/res_config_settings_view.xml new file mode 100644 index 00000000..32f85d47 --- /dev/null +++ b/dadata_connector/views/res_config_settings_view.xml @@ -0,0 +1,16 @@ + + + + res.config.settings.view.form.inherit.dadata + res.config.settings + + + + + + + + + + + diff --git a/dadata_connector/views/res_partner_views.xml b/dadata_connector/views/res_partner_views.xml new file mode 100644 index 00000000..23a7c4da --- /dev/null +++ b/dadata_connector/views/res_partner_views.xml @@ -0,0 +1,28 @@ + + + + + Partner with auto data view form + res.partner + + + + dadata_search + + + + + + Partner with auto data view form 2 + res.partner + 2 + + + + + dadata_search + + + + + diff --git a/dadata_connector/wizard/__init__.py b/dadata_connector/wizard/__init__.py new file mode 100644 index 00000000..288e4db1 --- /dev/null +++ b/dadata_connector/wizard/__init__.py @@ -0,0 +1 @@ +from . import res_partner_auto_data_wizard diff --git a/dadata_connector/wizard/res_partner_auto_data_wizard.py b/dadata_connector/wizard/res_partner_auto_data_wizard.py new file mode 100644 index 00000000..7caeaf79 --- /dev/null +++ b/dadata_connector/wizard/res_partner_auto_data_wizard.py @@ -0,0 +1,40 @@ +from odoo import fields, models + + +class ResPartnerAutoDataWizard(models.TransientModel): + _name = "res.partner.auto_data.wizard" + _description = "Wizard for autofilling partner" + + partner_id = fields.Many2one( + string="Partner", + comodel_name="res.partner", + ) + + vat = fields.Char( + string="Identification Number", help="Identification Number for selected type" + ) + + status = fields.Selection( + string="Status", + selection=[ + ("active", "Active"), + ("liquidating", "Liquidating"), + ("liquidated", "Liquidated"), + ("bankrupt", "Bankrupt"), + ("reorganizing", "Reorganizing"), + ], + ) + organization_type = fields.Selection( + string="Type of organization", + selection=[ + ("legal", "Legal entity"), + ("individual", "Individual entrepreneur"), + ], + help="Legal entity or individual entrepreneur", + ) + name = fields.Char(string="Full name") + + full_address = fields.Text(string="Full legal address") + + def button_yes(self): + return {"type": "ir.actions.act_window_close", "infos": {"update": True}} diff --git a/dadata_connector/wizard/res_partner_auto_data_wizard_views.xml b/dadata_connector/wizard/res_partner_auto_data_wizard_views.xml new file mode 100644 index 00000000..406b6d51 --- /dev/null +++ b/dadata_connector/wizard/res_partner_auto_data_wizard_views.xml @@ -0,0 +1,23 @@ + + + + Partner with auto data wizard view form + res.partner.auto_data.wizard + +
+ + + + + + +
+
+
+
+
+
diff --git a/directive_layer/README.md b/directive_layer/README.md new file mode 100644 index 00000000..8edcec19 --- /dev/null +++ b/directive_layer/README.md @@ -0,0 +1,145 @@ +# Слой директив (Directive Layer) +**name:** `directive_layer` +**version:** 19.0.1.0.0 +**author:** Mk.Lab + +--- + +## 1. Общее описание + +**Директива** — это структурированное задание, которое система Odoo автоматически создаёт и назначает исполнителю при наступлении бизнес-события. Директива несёт в себе информацию о типе работ, ответственных ролях, дедлайне, трудоёмкости и ожидаемом результате. + +--- + +## 2. Установка + +1. Убедитесь, что установлен модуль `base_user_role` +2. Скопируйте папку `directive_layer` в директорию `addons` +3. Перезапустите сервер Odoo +4. Перейдите в **Настройки → Приложения → Обновить список** +5. Найдите **«Directive Layer»** и нажмите **Установить** + +После установки автоматически создаются 7 стадий заданий. + +## 3. Функциональность + +- Автоматическое создание заданий при наступлении событий в системе +- Три типа исполнителей: человек, программный агент, оборудование +- Статусная машина с контролируемыми переходами между стадиями +- Визуальные светофоры для контроля состояния исполнителя и ресурсов +- Шаблоны и группы шаблонов для быстрого создания пакетов заданий +- Настройка правил автоматической генерации без программирования +- Рабочий стол исполнителя — полноэкранный дашборд для работы с заданиями + +--- + +--- + +## 4. Роли пользователей + +| Роль | Что может делать | +|---|---| +| Исполнитель | Видит свои задания, берёт в работу, завершает | +| Заявитель | Создаёт и отслеживает задания | +| Диспетчер | Назначает исполнителей, управляет очередью | + +При назначении роли **Исполнителя** система автоматически устанавливает «Рабочий стол исполнителя» домашней страницей пользователя. + +--- + +## 5. Жизненный цикл директивы + +``` +Черновик + ↓ подтверждение +Подтверждена + ↓ планирование +Запланирована + ↓ старт +В работе ←→ На паузе + ↓ завершение +Выполнена +``` + +При завершении задания система автоматически уведомляет объект-источник (задачу, заказ и т.д.) о результате. + +--- + +## Как это выглядит в интерфейсе + +### На форме объекта (задача, заказ, счёт...) + +После подключения к объекту на его форме появляются три элемента: + +**Кнопка «Выбрать тип»** в шапке формы — позволяет выбрать группу шаблонов заданий для данного объекта. + +**Кнопка «Директивы»** — показывает количество заданий, связанных с записью. Нажмите, чтобы открыть список. + +**Поле «Текущий статус исполнения»** — автоматически вычисляемый текст с наиболее приоритетным активным заданием, ближайшим дедлайном и ожидаемой датой завершения. + +![img_1.png](img_1.png) +--- + +### Рабочий стол исполнителя по задачам + +Полноэкранный канбан-дашборд для пользователей с ролью «Исполнитель». Показывает только задания, назначенные текущему пользователю, сгруппированные по стадиям. + +![img_2.png](img_2.png) + +--- + +### Меню «Директивы» + +В главном меню появляется раздел **Директивы** с двумя пунктами: + +- **Все директивы** — список всех заданий в системе (канбан и список) +- **Политики** — правила автоматического создания заданий без программирования + +В подразделе **Директивы → Настройки** доступны справочники: + +- **Шаблоны директив** — словарь шаблонов с типом работ, трудоёмкостью и ролями +- **Группы шаблонов директив** — наборы шаблонов для пакетного создания заданий +- **Виды работ** — справочник видов работ +- **Статусы директив** — справочник стадий заданий +- **Источники директив** — список объектов, к которым подключены задания + +![img_3.png](img_3.png) + +--- + +## Как создавать задания: три способа + +### 1. Вручную + +Откройте нужный объект → кнопка **«Выбрать тип»** → выберите группу шаблонов → задания создаются немедленно. + +![img_4.png](img_4.png) + +### 2. Автоматически через политику (без кода) + +Перейдите в **Директивы → Политики** и создайте правило: +- Выберите объект (задача, заказ и т.д.) +- Укажите событие: при изменении поля, при создании записи или при вызове действия +- Задайте условие срабатывания +- Выберите группу шаблонов + +![img_5.png](img_5.png) + +После сохранения задания будут создаваться автоматически при наступлении события. + +### 3. Через код (для разработчиков) + +Разработчик подключает модуль к нужной модели через `directive.mixin`. Подробнее — в технической документации и модулю. + +--- + +## Зависимости + +| Модуль | Назначение | +|---|---| +| `base` | Базовый Odoo | +| `web` | Фронтенд | +| `base_user_role` | Управление ролями пользователей | +| `project` | Модуль проектов | + + diff --git a/directive_layer/TECHNICAL.md b/directive_layer/TECHNICAL.md new file mode 100644 index 00000000..e0706100 --- /dev/null +++ b/directive_layer/TECHNICAL.md @@ -0,0 +1,392 @@ +# Directive Layer (Слой директив) +**name**: directive_layer +**version**: 19.0.1.0.0 +**author**: Mk.Lab +**depends:** `base`, `web`, `base_user_role`, `project` + +## Архитектура + +``` +directive_layer +├── directive.directive — основная сущность: директива +├── directive.stage — справочник стадий (7 стадий) +├── directive.work.type — справочник видов работ +├── directive.template — шаблон директивы +├── directive.template.group — группа шаблонов (пакет директив) +├── directive.template.group.line — строки группы +├── directive.origin — связка «модель + ID» +├── directive.policy — правило автогенерации директив +├── directive.mixin — AbstractModel для подключения к любой модели +├── res.users (расширение) — авто-установка домашней страницы исполнителя +└── ExecutorBoard (OWL) — рабочий стол исполнителя (fullscreen) +``` + +--- + +## Модели + +### `directive.directive` — Директива + +**Файл:** `models/directive.py` + +| Поле | Тип | Описание | +|---|---|---| +| `name` | Char (required) | Название директивы | +| `active` | Boolean | Признак активности | +| `is_simulation` | Boolean | Флаг тестовой/демо-директивы | +| `deadline_at` | Datetime (required) | Дедлайн исполнения | +| `planned_hours` | Float (required) | Трудоёмкость в часах | +| `load_percent` | Integer (default: 10) | Процент загрузки ресурса | +| `executor_type` | Selection | `human` / `machine` / `software` | +| `success_probability` | Float (default: 98.0) | Вероятность успешного выполнения, % | +| `resource_cost` | Float | Стоимость ресурса | +| `retry_policy` | Selection | `none` / `retry_3` / `backoff` | +| `priority` | Selection | `0` — низкий / `1` — нормальный / `2` — высокий | +| `work_type_id` | Many2one → `directive.work.type` (required) | Тип работ | +| `executor_role_id` | Many2one → `res.users.role` | Роль исполнителя | +| `requester_role_id` | Many2one → `res.users.role` | Роль заявителя | +| `stage_id` | Many2one → `directive.stage` | Стадия (вид диспетчера) | +| `stage_code` | Char (related, stored) | Технический код текущей стадии | +| `executor_stage_id` | Many2one → `directive.stage` | Стадия (вид исполнителя) | +| `requester_stage_id` | Many2one → `directive.stage` | Стадия (вид заявителя) | +| `executor_traffic_light` | Selection | Светофор исполнителя: `white/green/yellow/red/black` | +| `resource_traffic_light` | Selection | Светофор ресурса: `white/green/yellow/red/black` | +| `executor_user_id` | Many2one → `res.users` | Назначенный исполнитель | +| `origin_id` | Many2one → `directive.origin` (required, cascade) | Объект-источник | +| `template_id` | Many2one → `directive.template` | Шаблон директивы | +| `policy_id` | Many2one → `directive.policy` | Политика создания | +| `generator_key` | Char (index) | Ключ дедупликации для режима `create_once` | +| `predecessor_ids` | Many2many → `directive.directive` | Директивы-предшественники | +| `sequence` | Integer | Порядок в планировщике | + +**Вычисляемые поля:** + +| Поле | Описание | +|---|---| +| `deadline_display` | Дедлайн в формате `дд.мм.гг Ч:ММ` с учётом часового пояса пользователя | +| `time_left_display` | Оставшееся время в формате `Xд Yч Zм` (отрицательное, если просрочено) | +| `is_overdue` | Boolean: дедлайн прошёл | +| `priority_stars` | Строка ★ / ★★ / ★★★ | + +**Порядок сортировки по умолчанию:** `deadline_at asc, priority desc, id desc` + +#### Статусы + +Допустимые переходы между стадиями: + +| Текущая стадия | Допустимые следующие | +|---|---| +| `draft` | `confirmed`, `planned`, `cancelled` | +| `confirmed` | `planned`, `in_progress`, `cancelled` | +| `planned` | `in_progress`, `cancelled` | +| `in_progress` | `paused`, `done` | +| `paused` | `in_progress`, `cancelled` | +| `done` | — (финальная) | +| `cancelled` | — (финальная) | + +Переходы контролируются методом `_check_stage_transition()`. Недопустимый переход вызывает `UserError`. + +#### Методы + +| Метод | Описание | +|---|---| +| `action_assign_to_me()` | Назначить на текущего пользователя (из стадий `confirmed` / `planned`) | +| `action_start()` | Перевести в `in_progress` | +| `action_pause()` | Перевести в `paused` (только из `in_progress`) | +| `action_done()` | Завершить директиву и вызвать callback в записи-источнике | +| `action_cancel()` | Отменить (обновляет все три stage-поля одновременно) | +| `action_open_delete_wizard()` | Открыть визард удаления | +| `_set_stage(code)` | Установить стадию по коду (обновляет `stage_id`, `executor_stage_id`, `requester_stage_id`) | +| `_get_origin_record()` | Получить запись-источник через `origin_id.res_model` + `origin_id.res_id` | +| `_build_payload(event)` | Сформировать словарь данных для передачи в callback | +| `action_quick_change_stage(id, code)` | `@api.model` — смена стадии по вызову из JS | + +#### Механизм callback при завершении + +При вызове `action_done()` выполняется следующая последовательность: + +1. Стадия устанавливается в `done` через `_set_stage("done")` +2. Из шаблона директивы читается `handler_key` — имя метода в модели-источнике +3. Через `_get_origin_record()` получается запись-источник +4. Метод `handler_key` вызывается на записи-источнике с payload + +**Состав payload:** + +`event`, `directive_id`, `directive_name`, `template_id`, `template_code`, `work_type_id`, `executor_user_id`, `planned_start_at`, `planned_end_at`, `stage_code`, `priority`, `load_percent` + +--- + +### `directive.stage` — Стадии + +**Файл:** `models/directive_stage.py` + +| Поле | Тип | Описание | +|---|---|---| +| `name` | Char (required) | Название стадии | +| `code` | Char (required, unique) | Технический код | +| `is_hidden` | Boolean | Скрыть колонку в канбане | + +**Предустановленные стадии** (`data/directive_stage_data.xml`, `noupdate="1"`): + +| Код | Название | Скрыта в канбане | +|---|---|---| +| `draft` | Черновик | Нет | +| `confirmed` | Подтверждена | Нет | +| `planned` | Запланирована | Нет | +| `in_progress` | В работе | Нет | +| `paused` | На паузе | Нет | +| `done` | Выполнена | Да | +| `cancelled` | Отменена | Да | + +--- + +### `directive.template` — Шаблон директивы + +**Файл:** `models/directive_template.py` + +| Поле | Тип | Описание | +|---|---|---| +| `name` | Char (required) | Название шаблона | +| `code` | Char (required, unique) | Технический код | +| `work_type_id` | Many2one → `directive.work.type` | Тип работ | +| `planned_hours` | Float (required) | Трудоёмкость в часах | +| `load_percent` | Integer | Процент загрузки ресурса | +| `priority` | Selection 0/1/2 | Приоритет директив по этому шаблону | +| `executor_role_id` | Many2one → `res.users.role` | Роль исполнителя по умолчанию | +| `requester_role_id` | Many2one → `res.users.role` | Роль заявителя по умолчанию | +| `default_stage_id` | Many2one → `directive.stage` | Стартовая стадия (по умолчанию: `draft`) | +| `handler_key` | Char | Имя метода в модели-источнике, вызываемого при завершении директивы | +| `description` | Text | Описание и инструкции для исполнителя | + +--- + +### `directive.template.group` — Группа шаблонов + +**Файл:** `models/directive_template_group.py` + +| Поле | Тип | Описание | +|---|---|---| +| `name` | Char (required) | Название группы | +| `code` | Char | Технический код | +| `applicable_model` | Char | Техническое имя модели, к которой применяется группа | +| `template_line_ids` | One2many → `directive.template.group.line` | Строки группы | + +**`directive.template.group.line`:** + +| Поле | Тип | Описание | +|---|---|---| +| `group_id` | Many2one → `directive.template.group` (cascade) | Родительская группа | +| `sequence` | Integer | Порядок создания директив из этой строки | +| `template_id` | Many2one → `directive.template` | Шаблон директивы | + +--- + +### `directive.origin` — Источник директив + +**Файл:** `models/directive_origin.py` + +Хранит хранит пару `(res_model, res_id)` и агрегирует все директивы для данного объекта. На каждую запись создаётся ровно один `directive.origin`. + +| Поле | Тип | Описание | +|---|---|---| +| `res_model` | Char (required, index) | Техническое имя модели Odoo | +| `res_id` | Integer (required, index) | ID записи | +| `res_ref` | Reference (computed, stored) | Прямая ссылка на запись | +| `directive_ids` | One2many → `directive.directive` | Все директивы источника | +| `display_name` | Char (computed, stored) | Отображаемое имя в формате `res_model,res_id` | + +--- + +### `directive.policy` — Политика автогенерации + +**Файл:** `models/directive_policy.py` + +| Поле | Тип | Описание | +|---|---|---| +| `name` | Char (required) | Название политики | +| `active` | Boolean | Политика активна | +| `sequence` | Integer | Порядок проверки политик | +| `origin_model` | Char (required) | Модель, к которой применяется политика | +| `event` | Selection | Тип события: `manual` / `on_create` / `on_write` / `on_stage` / `on_cron` / `on_callback` | +| `mode` | Selection | `create_once` — однократно; `create_each_time` — при каждом срабатывании | +| `use_record_template_group` | Boolean | Брать группу шаблонов из поля записи, а не из фиксированной | +| `template_group_id` | Many2one → `directive.template.group` | Фиксированная группа шаблонов | +| `trigger_field` | Char | Имя поля (для `on_write`) или метода (для `on_callback`) | +| `trigger_value_int` | Integer | Ожидаемое значение поля (ID записи для Many2one-полей) | + +#### Логика `_policy_should_fire()` + +Для события `on_callback` — всегда возвращает `True`. Для остальных событий: читает значение `trigger_field` у записи и сравнивает с `trigger_value_int`. Для Many2one-полей сравнивается `.id`. + +#### Логика `apply_to_records()` + +Для каждой записи: в режиме `create_once` проверяет, нет ли уже директив от этой политики для данного `origin_id`. Если нет — определяет группу шаблонов и вызывает `_directive_create_from_group()`. + +--- + +### `directive.mixin` — Миксин для моделей + +**Файл:** `models/directive_mixin.py` +**Тип:** `models.AbstractModel` + +Подключается к модели через `_inherit`: + +```python +class ProjectTask(models.Model): + _name = 'project.task' + _inherit = ['project.task', 'directive.mixin'] +``` + +#### Поля, добавляемые в модель + +| Поле | Тип | Описание | +|---|---|---| +| `directive_origin_id` | Many2one → `directive.origin` (readonly) | Origin-запись данного объекта | +| `directive_ids` | One2many (related) | Все директивы объекта | +| `directive_execution_status` | Char (computed, stored) | Текстовый статус исполнения | +| `directive_template_group_id` | Many2one → `directive.template.group` | Группа шаблонов объекта | + +#### Методы + +**`_ensure_directive_origin()`** — находит или создаёт `directive.origin` для записи. Вызывается при `create` и `write`. + +**`write()`** — перехватывает изменения полей. Фиксирует значения до изменения, выполняет `super().write()`, затем проверяет политики с `event='on_write'` и вызывает `apply_to_records()` при совпадении. + +**`_directive_register_callback_wrappers()`** — вызывается при старте сервера (`_register_hook`). Оборачивает методы модели через `functools.wraps` для обработки политик с `event='on_callback'`. Флаг `_directive_wrapped` предотвращает повторное оборачивание. + +**`_compute_directive_execution_status()`** — формирует строку статуса на основе наиболее приоритетной активной директивы. Приоритет стадий: `paused > in_progress > planned/confirmed > draft`. Результат: `"{stage_name}, до {nearest_deadline}, ожидается завершение к {expected_end}"`. + +**`action_choose_directive_group()`** — открывает визард `directive.choose.group.wizard`. + +**`action_open_directives()`** — открывает список директив, отфильтрованных по `origin_id` текущей записи. + +**`_directive_create_from_group(template_group, generator_key, policy)`** — создаёт директивы по строкам группы в порядке `sequence`. Каждая директива получает параметры из шаблона, ссылку на `origin` и `policy`. + +#### Методы для переопределения в модели-источнике + +| Метод | Вызывается | +|---|---| +| `_directive_on_assign(self, payload)` | При назначении исполнителя | +| `_directive_on_start(self, payload)` | При переходе в `in_progress` | +| `_directive_on_pause(self, payload)` | При переходе в `paused` | +| `_directive_on_done(self, payload)` | При завершении директивы | +| `_directive_generation_spec(self)` | Возвращает список спецификаций для автогенерации (альтернатива Policy UI) | + +--- + +### `res.users` — Расширение + +**Файл:** `models/res_users.py` + +При создании или изменении пользователя проверяет вхождение в группу `role_directive_executor_res_groups`. При совпадении устанавливает `action_id = action_executor_dashboard_client` — рабочий стол исполнителя становится домашней страницей пользователя. + +--- + +## Визарды + +### `directive.choose.group.wizard` + +**Файл:** `wizard/directive_choose_group_wizard.py` + +| Поле | Тип | Описание | +|---|---|---| +| `template_group_id` | Many2one → `directive.template.group` (required) | Выбранная группа шаблонов | + +Метод `action_confirm()` берёт `active_model` и `active_id` из контекста и записывает выбранную группу в поле `directive_template_group_id` исходной записи. Сами директивы не создаются — только сохраняется группа. + +### `directive.delete.wizard` + +**Файл:** `wizard/directive_delete_wizard.py` + +| Режим | Действие | +|---|---| +| `archive` | Мягкое удаление: `active=False` | +| `delete` | Жёсткое удаление: `unlink()` | + +--- + +## Представления и меню + +**Файл:** `views/directive_views.xml`, `views/directive_policy_views.xml` + +### Структура меню + +``` +Директивы (menu_directive_root) +├── Все директивы (menu_directive_all) +│ → action_directive_all: directive.directive (kanban/list/form) +├── Политики (menu_directive_policy_action) +│ → action_directive_policy: directive.policy (list/form) +└── Настройки (menu_directive_settings_root) + ├── Источники директив → directive.origin (list/form) + ├── Статусы директив → directive.stage (list/form) + ├── Виды работ → directive.work.type (list/form) + ├── Шаблоны директив → directive.template (list/form) + └── Группы шаблонов директив → directive.template.group (list/form) +``` + +### Рабочий стол исполнителя + +Зарегистрирован как `ir.actions.client` (`action_executor_dashboard_client`) с тегом `directive_layer.executor_dashboard_action`. Открывается в режиме `fullscreen`. Не является пунктом меню — устанавливается как `action_id` (домашняя страница) пользователям с ролью исполнителя через `res.users`. + +--- + +## `ExecutorBoard` (OWL-компонент) + +**Файлы:** `static/src/components/executor_board/executor_board.{js,xml,scss}` + +Зарегистрирован как `ir.actions.client` с тегом `directive_layer.executor_dashboard_action`, открывается в режиме `fullscreen`. + +**Логика загрузки данных:** + +1. Определяет `userId` из `session.user_id` или `storeData` +2. Загружает все стадии (`directive.stage`) +3. Загружает директивы с фильтром `executor_user_id = userId` +4. Строит колонки канбана: стадия и директивы с совпадающим `executor_stage_id` + +**Быстрые действия на карточке директивы:** + +| Действие | Переход | +|---|---| +| Начать | `action_quick_change_stage(id, 'in_progress')` | +| Пауза | `action_quick_change_stage(id, 'paused')` | +| Завершить | `action_quick_change_stage(id, 'done')` | + +После каждого действия данные перезагружаются. + +--- + +## Безопасность + +### Роли (`security/roles.xml`) + +Каждая роль создаётся одновременно в двух системах: +- `res.users.role` (модуль `base_user_role`) — для назначения через интерфейс ролей +- `res.groups` — для использования в record rules и `ir.model.access` + +| Роль | Назначение | +|---|---| +| `role_directive_executor` | Исполнитель: видит свои директивы, берёт в работу, завершает | +| `role_directive_requester` | Заявитель: создаёт и отслеживает директивы | +| `role_directive_dispatcher` | Диспетчер: назначает исполнителей, управляет очередью | + +### Record Rules (`security/directives_rules.xml`) + +Ограничивают видимость директив по ролям пользователя. + +### Права доступа (`security/ir.model.access.csv`) + +CRUD-права для всех моделей модуля, распределённые по ролям. + +--- + +## Тесты + +**Файл:** `tests/test_directive_layer.py` + +| Что покрывает | +|---| +| Создание директив через шаблоны и группы | +| Статусная машина: допустимые и недопустимые переходы | +| Политики: срабатывание `on_write` | +| Миксин на модели `project.task` | diff --git a/directive_layer/__init__.py b/directive_layer/__init__.py new file mode 100644 index 00000000..0182fc47 --- /dev/null +++ b/directive_layer/__init__.py @@ -0,0 +1,3 @@ +from . import models +from . import tests +from . import wizard diff --git a/directive_layer/__manifest__.py b/directive_layer/__manifest__.py new file mode 100644 index 00000000..c8a9ec69 --- /dev/null +++ b/directive_layer/__manifest__.py @@ -0,0 +1,31 @@ +{ + "name": "Directive Layer", + "version": "19.0.1.0.0", + "summary": "Базовый слой директив", + "category": "Productivity", + "website": "", + "author": "Mk.lab", + "license": "LGPL-3", + "depends": ["base", "web", "base_user_role", "project"], + "assets": { + "web.assets_backend": [ + "directive_layer/static/src/scss/directive_kanban.scss", + "directive_layer/static/src/components/executor_board/executor_board.js", + "directive_layer/static/src/components/executor_board/executor_board.xml", + "directive_layer/static/src/components/executor_board/executor_board.scss", + ], + }, + "data": [ + "security/ir.model.access.csv", + "security/roles.xml", + "security/directives_rules.xml", + "data/directive_stage_data.xml", + "views/directive_views.xml", + "views/directive_actions.xml", + "views/directive_policy_views.xml", + "views/cron.xml", + "wizard/directive_wizards.xml", + ], + "installable": True, + "application": True, +} \ No newline at end of file diff --git a/directive_layer/data/directive_stage_data.xml b/directive_layer/data/directive_stage_data.xml new file mode 100644 index 00000000..6987772b --- /dev/null +++ b/directive_layer/data/directive_stage_data.xml @@ -0,0 +1,43 @@ + + + Черновик + draft + False + + + + Подтверждена + confirmed + False + + + + Запланирована + planned + False + + + + В работе + in_progress + False + + + + На паузе + paused + False + + + + Выполнена + done + True + + + + Отменена + cancelled + True + + diff --git a/directive_layer/img_1.png b/directive_layer/img_1.png new file mode 100644 index 00000000..ae22d758 Binary files /dev/null and b/directive_layer/img_1.png differ diff --git a/directive_layer/img_2.png b/directive_layer/img_2.png new file mode 100644 index 00000000..afedb173 Binary files /dev/null and b/directive_layer/img_2.png differ diff --git a/directive_layer/img_3.png b/directive_layer/img_3.png new file mode 100644 index 00000000..7a614016 Binary files /dev/null and b/directive_layer/img_3.png differ diff --git a/directive_layer/img_4.png b/directive_layer/img_4.png new file mode 100644 index 00000000..1f1fd9a8 Binary files /dev/null and b/directive_layer/img_4.png differ diff --git a/directive_layer/img_5.png b/directive_layer/img_5.png new file mode 100644 index 00000000..84217469 Binary files /dev/null and b/directive_layer/img_5.png differ diff --git a/directive_layer/models/__init__.py b/directive_layer/models/__init__.py new file mode 100644 index 00000000..a9cdc81d --- /dev/null +++ b/directive_layer/models/__init__.py @@ -0,0 +1,9 @@ +from . import directive_stage +from . import directive_work_type +from . import directive_origin +from . import directive_mixin +from . import directive_template +from . import directive_policy +from . import directive_template_group +from . import directive +from . import res_users \ No newline at end of file diff --git a/directive_layer/models/directive.py b/directive_layer/models/directive.py new file mode 100644 index 00000000..9f92b7b0 --- /dev/null +++ b/directive_layer/models/directive.py @@ -0,0 +1,362 @@ +from odoo.exceptions import UserError +from datetime import datetime, timedelta +import pytz + +from odoo import api, fields, models + +TRAFFIC_LIGHT = [ + ("white", "White"), + ("black", "Black"), + ("green", "Green"), + ("yellow", "Yellow"), + ("red", "Red"), +] + +class Directive(models.Model): + _name = "directive.directive" + _description = "Directive" + _order = "deadline_at asc, priority desc, id desc" + + is_simulation = fields.Boolean( + string="Simulation Task", + default=False, + help="Флаг для отделения тестовых данных от реальных" + ) + + PRIORITY = [ + ("0", "Low"), + ("1", "Normal"), + ("2", "High"), + ] + + name = fields.Char(string="Название директивы", required=True) + active = fields.Boolean(string="Активна", default=True) + + deadline_at = fields.Datetime(string="Дедлайн исполнения", required=True) + planned_hours = fields.Float(string="Трудоёмкость", required=True) + load_percent = fields.Integer(string="Процент загрузки", default=10) + + executor_type = fields.Selection([ + ('human', 'Человек'), + ('machine', 'Оборудование / Станки'), + ('software', 'Программный агент / API') + ], string="Тип исполнителя", default='human', required=True) + + success_probability = fields.Float(string="Вероятность успеха (%)", default=98.0) + + resource_cost = fields.Float(string="Стоимость ресурса (у.е.)", default=0.0) + + retry_policy = fields.Selection([ + ('none', 'Остановиться и звать человека'), + ('retry_3', 'Повторить 3 раза'), + ('backoff', 'Экспоненциальная задержка') + ], string="Политика отказа", default='none') + + priority = fields.Selection( + selection=PRIORITY, + string="Приоритет", + default="0", + required=True, + ) + + work_type_id = fields.Many2one( + "directive.work.type", + string="Тип работ", + required=True, + ondelete="restrict", + index=True, + ) + + executor_role_id = fields.Many2one( + "res.users.role", + string="Роль исполнителя", + ondelete="restrict", + index=True, + ) + requester_role_id = fields.Many2one( + "res.users.role", + string="Роль заявителя", + ondelete="restrict", + index=True, + ) + + stage_id = fields.Many2one( + "directive.stage", + string="Статус (для диспетчера)", + default=lambda self: self.env["directive.stage"].search([("code", "=", "draft")], limit=1), + ondelete="restrict", + index=True, + group_expand="_group_expand_stage_id" + ) + + state = fields.Char( + related="stage_id.code" + ) + + executor_stage_id = fields.Many2one( + "directive.stage", + string="Статус для исполнителя", + ondelete="restrict", + index=True, + ) + requester_stage_id = fields.Many2one( + "directive.stage", + string="Статус для заявителя", + ondelete="restrict", + index=True, + ) + + executor_traffic_light = fields.Selection( + selection=TRAFFIC_LIGHT, + string="Светофор контроля исполнителя", + default="white", + required=True, + ) + resource_traffic_light = fields.Selection( + selection=TRAFFIC_LIGHT, + string="Светофор контроля ресурсов", + default="white", + required=True, + ) + + planned_start_at = fields.Datetime(string="Планируемая дата начала") + planned_end_at = fields.Datetime(string="Планируемая дата окончания") + + executor_user_id = fields.Many2one( + "res.users", + string="Назначенный исполнитель", + ondelete="set null", + index=True, + ) + + origin_id = fields.Many2one( + "directive.origin", + string="Источник (породивший документ)", + required=True, + ondelete="cascade", + index=True, + ) + + template_id = fields.Many2one( + "directive.template", + string="Шаблон директивы", + ondelete="set null", + index=True, + ) + + policy_id = fields.Many2one( + "directive.policy", + string="Policy", + ondelete="set null", + index=True, + ) + + stage_code = fields.Char(related="stage_id.code", store=True, readonly=True) + + generator_key = fields.Char(index=True) + + deadline_display = fields.Char(compute="_compute_ui_fields") + time_left_display = fields.Char(compute="_compute_ui_fields") + is_overdue = fields.Boolean(compute="_compute_ui_fields") + priority_stars = fields.Char(compute="_compute_ui_fields") + + sequence = fields.Integer(string="Planner Sequence", default=10) + predecessor_ids = fields.Many2many('directive.directive', 'directive_dependencies_rel', 'directive_id', + 'predecessor_id', string="Dependencies") + + @api.depends("deadline_at", "priority") + def _compute_ui_fields(self): + tz = self.env.user.tz or "UTC" + tzinfo = pytz.timezone(tz) + now = datetime.now(tzinfo) + + for rec in self: + if rec.deadline_at: + dt = fields.Datetime.context_timestamp(rec.with_context(tz=tz), rec.deadline_at) + rec.deadline_display = dt.strftime("%d.%m.%y %-H:%M") + rec.is_overdue = dt < now + + delta = dt - now + total_min = int(delta.total_seconds() // 60) + if total_min < 0: + total_min = abs(total_min) + sign = "-" + else: + sign = "" + + days = total_min // (60 * 24) + hours = (total_min % (60 * 24)) // 60 + mins = total_min % 60 + + parts = [] + if days: + parts.append(f"{days}д") + if hours: + parts.append(f"{hours}ч") + parts.append(f"{mins}м") + + rec.time_left_display = f"{sign}{' '.join(parts)}" + else: + rec.deadline_display = "" + rec.time_left_display = "" + rec.is_overdue = False + + p = int(rec.priority or 0) + rec.priority_stars = "★" * (p + 1) + + def write(self, vals): + if "stage_id" in vals: + new_stage = self.env["directive.stage"].browse(vals["stage_id"]) + for rec in self: + rec._check_stage_transition(rec.stage_id, new_stage) + + return super().write(vals) + + def _check_stage_transition(self, from_stage, to_stage): + from_code = (from_stage.code or "").strip() + to_code = (to_stage.code or "").strip() + + allowed = { + "draft": {"confirmed", "planned", "cancelled"}, + "confirmed": {"planned", "in_progress", "cancelled"}, + "planned": {"in_progress", "cancelled"}, + "in_progress": {"paused", "done"}, + "paused": {"in_progress", "cancelled"}, + "done": set(), + "cancelled": set(), + } + + if from_code and to_code and to_code not in allowed.get(from_code, set()): + raise UserError("Нельзя переместить из '%s' в '%s'.") % (from_stage.name, to_stage.name) + + @api.model + def _group_expand_stage_id(self, stages, domain, order=None): + return stages.search([], order=order or "id asc") + + def action_cancel(self): + cancelled = self.env["directive.stage"].search([("code", "=", "cancelled")], limit=1) + if not cancelled: + raise UserError("Stage with code 'cancelled' not found.") + self.write({ + "stage_id": cancelled.id, + "executor_stage_id": cancelled.id, + "requester_stage_id": cancelled.id, + }) + return True + + def action_open_delete_wizard(self): + self.ensure_one() + return { + "type": "ir.actions.act_window", + "name": "Удаление директивы", + "res_model": "directive.delete.wizard", + "view_mode": "form", + "target": "new", + "context": { + "active_model": self._name, + "active_id": self.id, + "active_ids": self.ids, + }, + } + + def _action_archive(self): + self.write({"active": False}) + return True + + def _action_delete_hard(self): + self.unlink() + return True + + def _build_payload(self, event: str) -> dict: + self.ensure_one() + tmpl = self.template_id + return { + "event": event, + "directive_id": self.id, + "directive_name": self.name, + "template_id": tmpl.id if tmpl else None, + "template_code": tmpl.code if tmpl else None, + "work_type_id": self.work_type_id.id if self.work_type_id else None, + "executor_user_id": self.executor_user_id.id if self.executor_user_id else None, + "planned_start_at": self.planned_start_at, + "planned_end_at": self.planned_end_at, + "stage_code": self.stage_id.code if self.stage_id else None, + "priority": self.priority, + "load_percent": self.load_percent, + } + + def _stage_by_code(self, code: str): + stage = self.env["directive.stage"].search([("code", "=", code)], limit=1) + if not stage: + raise UserError(f"Directive stage '{code}' not found.") + return stage + + def _set_stage(self, code: str): + stage = self._stage_by_code(code) + self.write({ + "stage_id": stage.id, + "executor_stage_id": stage.id, + "requester_stage_id": stage.id, + }) + + def _get_origin_record(self): + self.ensure_one() + origin = self.origin_id + if not origin or not origin.res_model or not origin.res_id: + return self.env[self._name].browse() # empty + return self.env[origin.res_model].browse(origin.res_id).exists() + + def action_assign_to_me(self): + for rec in self: + if rec.executor_user_id: + raise UserError("Директива уже назначена исполнителю.") + if rec.stage_code not in ("confirmed", "planned"): + raise UserError("Назначить на себя можно только подтвержденную или запланированную директиву.") + rec.write({"executor_user_id": rec.env.user.id}) + return True + + def action_start(self): + now = fields.Datetime.now() + for rec in self: + if not rec.executor_user_id: + raise UserError("Нельзя начать директиву без назначенного исполнителя.") + if rec.stage_code not in ("confirmed", "planned"): + raise UserError("Начать можно только подтвержденную или запланированную директиву.") + if rec.planned_start_at and now < rec.planned_start_at: + raise UserError("Начать нельзя раньше планируемой даты начала.") + rec._set_stage("in_progress") + return True + + def action_pause(self): + for rec in self: + if rec.stage_code != "in_progress": + raise UserError("Поставить на паузу можно только директиву в состоянии 'В работе'.") + rec._set_stage("paused") + return True + + def action_done(self): + for rec in self: + if rec.stage_code != "in_progress": + raise UserError("Завершить можно только директиву в состоянии 'В работе'.") + rec._set_stage("done") + + tmpl = rec.template_id + handler_key = (tmpl.handler_key or "").strip() if tmpl else "" + if handler_key: + origin_record = rec._get_origin_record() + if origin_record: + payload = rec._build_payload("done") + method = getattr(origin_record, handler_key, None) + if not method: + raise UserError(f"Handler '{handler_key}' не найден в модели источника ({origin_record._name}).") + method(payload) + return True + + @api.model + def action_quick_change_stage(self, directive_id, target_code): + """ Публичный метод для вызова из JS """ + directive = self.browse(directive_id) + if directive.exists(): + directive._set_stage(target_code) + return True + return False \ No newline at end of file diff --git a/directive_layer/models/directive_mixin.py b/directive_layer/models/directive_mixin.py new file mode 100644 index 00000000..57e01057 --- /dev/null +++ b/directive_layer/models/directive_mixin.py @@ -0,0 +1,330 @@ +import functools + +from odoo import api, fields, models +from odoo.exceptions import UserError + +import logging +_logger = logging.getLogger(__name__) + +class DirectiveMixin(models.AbstractModel): + _name = "directive.mixin" + _description = "Directive Mixin" + + directive_origin_id = fields.Many2one( + "directive.origin", + string="Directive Origin", + readonly=True, + index=True, + ondelete="set null", + ) + + directive_ids = fields.One2many( + "directive.directive", + string="Директивы", + related="directive_origin_id.directive_ids", + readonly=True, + ) + + directive_execution_status = fields.Char( + string="Текущий статус исполнения", + compute="_compute_directive_execution_status", + store=True, + ) + + directive_template_group_id = fields.Many2one( + "directive.template.group", + string="Группа шаблонов директив", + ) + + @api.model_create_multi + def create(self, vals_list): + records = super().create(vals_list) + records._ensure_directive_origin() + return records + + def write(self, vals): + _logger.debug( + "[directive] write() called. Model: %s, IDs: %s, Keys in vals: %s", + self._name, self.ids, list(vals.keys()) + ) + + policies = self.env['directive.policy'].sudo().search([ + ('origin_model', '=', self._name), + ('event', '=', 'on_write'), + ('active', '=', True) + ]) + + relevant_policies = policies.filtered( + lambda p: p.trigger_field and p.trigger_field in vals + ) + + before_map = {} + if relevant_policies: + watched_fields = set(relevant_policies.mapped('trigger_field')) + for rec in self: + before_map[rec.id] = {f: rec[f] for f in watched_fields} + + res = super().write(vals) + + self._ensure_directive_origin() + + if relevant_policies: + for policy in relevant_policies: + field = policy.trigger_field + + records_to_process = self.env[self._name] + + for rec in self: + before_val = before_map[rec.id].get(field) + after_val = rec[field] + + def _norm(v): + return v.id if hasattr(v, 'id') else v + + b_val = _norm(before_val) + a_val = _norm(after_val) + + if b_val != a_val and policy._policy_should_fire(rec): + records_to_process |= rec + + if records_to_process: + _logger.info( + "[directive] applying policy '%s' for model=%s, ids=%s", + policy.name, self._name, records_to_process.ids + ) + policy.sudo().apply_to_records(records_to_process) + + return res + + def _ensure_directive_origin(self): + for rec in self: + if not rec.id: + continue + if rec.directive_origin_id: + continue + origin = self.env["directive.origin"].search( + [("res_model", "=", rec._name), ("res_id", "=", rec.id)], + limit=1, + ) + if not origin: + origin = self.env["directive.origin"].create( + {"res_model": rec._name, "res_id": rec.id} + ) + rec.sudo().write({"directive_origin_id": origin.id}) + + @api.depends( + "directive_ids.stage_id", + "directive_ids.stage_id.code", + "directive_ids.deadline_at", + "directive_ids.planned_end_at", + ) + def _compute_directive_execution_status(self): + for rec in self: + directives = rec.directive_ids.filtered( + lambda d: d.stage_id.code not in ("done", "cancelled") + ) + + if not directives: + rec.directive_execution_status = "" + continue + + stage_priority = { + "paused": 1, + "in_progress": 2, + "planned": 3, + "confirmed": 3, + "draft": 4, + } + + def stage_rank(d): + return stage_priority.get(d.stage_id.code, 99) + + current_directive = sorted(directives, key=stage_rank)[0] + stage_name = current_directive.stage_id.name + + deadlines = directives.mapped("deadline_at") + nearest_deadline = min(deadlines) if deadlines else None + + planned_ends = directives.mapped("planned_end_at") + planned_ends = [d for d in planned_ends if d] + expected_end = max(planned_ends) if planned_ends else max(deadlines) + + parts = [stage_name] + + if nearest_deadline: + parts.append( + f"до {fields.Datetime.to_string(nearest_deadline)[:10]}" + ) + + if expected_end: + parts.append( + f"ожидается завершение к {fields.Datetime.to_string(expected_end)[:10]}" + ) + + rec.directive_execution_status = ", ".join(parts) + + def _directive_on_assign(self, payload: dict): + return None + + def _directive_on_start(self, payload: dict): + return None + + def _directive_on_pause(self, payload: dict): + return None + + def _directive_on_done(self, payload: dict): + return None + + def _directive_create_from_group(self, template_group, generator_key=None, policy=None): + self.ensure_one() + self._ensure_directive_origin() + + if not template_group: + raise UserError("Template group is required.") + + draft_stage = self.env["directive.stage"].search([("code", "=", "draft")], limit=1) + if not draft_stage: + raise UserError("Stage with code 'draft' not found.") + + lines = template_group.template_line_ids.sorted(key=lambda l: (l.sequence, l.id)) + if not lines: + raise UserError("Template group has no lines.") + + directives_vals = [] + for line in lines: + tmpl = line.template_id + directives_vals.append({ + "generator_key": generator_key or False, + "name": tmpl.name, + "deadline_at": fields.Datetime.now(), + "planned_hours": tmpl.planned_hours, + "load_percent": tmpl.load_percent, + "priority": tmpl.priority, + "work_type_id": tmpl.work_type_id.id, + "executor_role_id": tmpl.executor_role_id.id or False, + "requester_role_id": tmpl.requester_role_id.id or False, + "stage_id": draft_stage.id, + "executor_stage_id": False, + "requester_stage_id": False, + "origin_id": self.directive_origin_id.id, + "template_id": tmpl.id, + "policy_id": policy.id if policy else False, + }) + + return self.env["directive.directive"].sudo().create(directives_vals) + + def _directive_update(self, *args, **kwargs): + return None + + def _directive_cancel(self, *args, **kwargs): + return None + + def _directive_delete(self, *args, **kwargs): + return None + + + def action_choose_directive_group(self): + self.ensure_one() + self._ensure_directive_origin() + return { + "type": "ir.actions.act_window", + "name": "Выбор группы директив", + "res_model": "directive.choose.group.wizard", + "view_mode": "form", + "target": "new", + "context": { + "active_model": self._name, + "active_id": self.id, + }, + } + + def action_open_directives(self): + self.ensure_one() + self._ensure_directive_origin() + return { + "type": "ir.actions.act_window", + "name": "Директивы", + "res_model": "directive.directive", + "view_mode": "kanban,list,form", + "domain": [("origin_id", "=", self.directive_origin_id.id)], + "context": { + "default_origin_id": self.directive_origin_id.id, + }, + } + + @api.model + def _directive_generation_spec(self): + """Может быть переопределен в модели-источнике.""" + return [] + + @api.model + def _register_hook(self): + res = super()._register_hook() + _logger.info( + "[directive] register_hook model=%s", + self._name + ) + self._directive_register_callback_wrappers() + return res + + @api.model + def _directive_register_callback_wrappers(self): + cls = self.__class__ + + if cls.__dict__.get("_directive_callbacks_wrapped"): + return + cls._directive_callbacks_wrapped = True + + self.env.cr.execute("SELECT count(*) FROM information_schema.tables WHERE table_name = 'directive_policy'") + if not self.env.cr.fetchone()[0]: + return + + policies = self.env['directive.policy'].sudo().search([ + ('origin_model', '=', self._name), + ('event', '=', 'on_callback'), + ('active', '=', True) + ]) + + if not policies: + return + + for policy in policies: + callback_name = policy.trigger_field + if not callback_name: + continue + + orig = getattr(cls, callback_name, None) + + if not orig or not callable(orig): + _logger.warning( + "[directive] Не найден метод '%s' в модели %s (из политики %s)", + callback_name, self._name, policy.name + ) + continue + + if getattr(orig, "_directive_wrapped", False): + continue + + _logger.info( + "[directive] Оборачиваем метод %s.%s для политики '%s'", + self._name, callback_name, policy.name + ) + + policy_id = policy.id + + @functools.wraps(orig) + def _wrapped(self_recordset, *args, __orig=orig, __policy_id=policy_id, **kwargs): + if self_recordset.env.context.get("directive_skip_generation"): + return __orig(self_recordset, *args, **kwargs) + + result = __orig(self_recordset, *args, **kwargs) + + if result is not False: + active_policy = self_recordset.env['directive.policy'].sudo().browse(__policy_id) + if active_policy.exists() and active_policy.active: + active_policy.sudo().apply_to_records(self_recordset) + + return result + + _wrapped._directive_wrapped = True + setattr(cls, callback_name, _wrapped) \ No newline at end of file diff --git a/directive_layer/models/directive_origin.py b/directive_layer/models/directive_origin.py new file mode 100644 index 00000000..5fc2a705 --- /dev/null +++ b/directive_layer/models/directive_origin.py @@ -0,0 +1,75 @@ +from odoo import api, fields, models + + +class DirectiveOrigin(models.Model): + _name = "directive.origin" + _description = "Directive Origin" + _rec_name = "display_name" + _order = "id desc" + + res_model = fields.Char(string="Техническое имя модели", required=True, index=True) + res_id = fields.Integer(string="ID записи", required=True, index=True) + + res_ref = fields.Reference( + selection="_get_reference_models", + string="Ссылка на запись", + compute="_compute_res_ref", + inverse="_inverse_res_ref", + store=True, + readonly=False, + ) + + directive_ids = fields.One2many( + "directive.directive", + "origin_id", + string="Директивы", + readonly=True, + ) + + display_name = fields.Char( + string="Источник (display_name)", + compute="_compute_display_name", + store=True, + ) + + _sql_constraints = [ + ("directive_origin_uniq", "unique(res_model, res_id)", "Origin must be unique per (model, id)."), + ] + + @api.model + def _get_reference_models(self): + models = self.env["ir.model"].sudo().search([]) + return [(m.model, m.name) for m in models if m.model] + + @api.depends("res_model", "res_id") + def _compute_res_ref(self): + for rec in self: + if rec.res_model and rec.res_id: + rec.res_ref = f"{rec.res_model},{rec.res_id}" + else: + rec.res_ref = False + + def _inverse_res_ref(self): + for rec in self: + if not rec.res_ref: + rec.res_model = False + rec.res_id = 0 + continue + try: + model, rid = rec.res_ref.split(",") + rec.res_model = model + rec.res_id = int(rid) + except Exception: + rec.res_model = False + rec.res_id = 0 + + @api.depends("res_ref") + def _compute_display_name(self): + for rec in self: + if rec.res_ref: + try: + rec.display_name = f"{rec.res_model},{rec.res_id}" + except Exception: + rec.display_name = f"{rec.res_model},{rec.res_id}" + else: + rec.display_name = f"{rec.res_model},{rec.res_id}" diff --git a/directive_layer/models/directive_policy.py b/directive_layer/models/directive_policy.py new file mode 100644 index 00000000..ebc1892b --- /dev/null +++ b/directive_layer/models/directive_policy.py @@ -0,0 +1,123 @@ +from odoo import api, fields, models +import logging +_logger = logging.getLogger(__name__) + +class DirectivePolicy(models.Model): + _name = "directive.policy" + _description = "Directive Policy" + _order = "sequence, id" + + name = fields.Char(required=True) + active = fields.Boolean(default=True) + sequence = fields.Integer(default=10) + + origin_model = fields.Char( + string="Origin model", + required=True, + index=True, + help="Техническое имя модели источника, например 'project.task'", + ) + + event = fields.Selection( + [ + ("manual", "Manual"), + ("on_create", "On Create"), + ("on_write", "On Write"), + ("on_stage", "On Stage Change"), + ("on_cron", "On Cron"), + ("on_callback", "При вызове метода (on_callback)"), + ], + required=True, + index=True, + default="manual", + ) + + mode = fields.Selection( + [ + ("create_once", "Create once"), + ("create_each_time", "Create each time"), + ], + required=True, + default="create_once", + ) + + use_record_template_group = fields.Boolean( + default=True, + help="Если включено, группа берётся из поля записи-источника directive_template_group_id.", + ) + + template_group_id = fields.Many2one( + "directive.template.group", + string="Fixed template group", + help="Если указано и use_record_template_group=False — будет использоваться эта группа.", + ) + + trigger_field = fields.Char( + help="Имя поля источника, например 'stage_id'." + ) + trigger_value_int = fields.Integer( + help="Для Many2one/Integer: ожидаемое значение (например ID стадии)." + ) + + def _policy_should_fire(self, record, payload: dict | None = None) -> bool: + self.ensure_one() + + # Для on_callback факт вызова метода - это уже триггер. + if self.event == 'on_callback': + return True + + if not self.trigger_field: + return True + + value = getattr(record, self.trigger_field, False) + + if hasattr(value, "id"): + match = bool(value and value.id == self.trigger_value_int) + if not match: + _logger.debug("[directive.policy] ID mismatch: expected %s, got %s", self.trigger_value_int, value.id) + return match + + try: + match = (value == self.trigger_value_int) + if not match: + _logger.debug("[directive.policy] Value mismatch: expected %s, got %s", self.trigger_value_int, value) + return match + except Exception as e: + _logger.error("[directive.policy] Error comparing values: %s", e) + return False + + def _resolve_template_group(self, record): + self.ensure_one() + if self.use_record_template_group: + return record.directive_template_group_id + return self.template_group_id + + def apply_to_records(self, records, payload: dict | None = None): + self.ensure_one() + if not records: + return 0 + + created_total = 0 + for rec in records: + if rec._name != self.origin_model: + continue + + if not self._policy_should_fire(rec, payload=payload): + continue + + group = self._resolve_template_group(rec) + if not group: + continue + + if self.mode == "create_once": + existing = rec.env["directive.directive"].search_count([ + ("origin_id", "=", rec.directive_origin_id.id), + ("policy_id", "=", self.id), + ]) + if existing: + continue + + rec._directive_create_from_group(group, policy=self) + created_total += 1 + + return created_total diff --git a/directive_layer/models/directive_stage.py b/directive_layer/models/directive_stage.py new file mode 100644 index 00000000..b8a2d2ee --- /dev/null +++ b/directive_layer/models/directive_stage.py @@ -0,0 +1,16 @@ +from odoo import fields, models + + +class DirectiveStage(models.Model): + _name = "directive.stage" + _description = "Directive Stage" + _order = "id asc" + + name = fields.Char(string="Название статуса", required=True) + code = fields.Char(string="Технический код", required=True, index=True) + + is_hidden = fields.Boolean(string="Скрыт в канбане", default=False) + + _sql_constraints = [ + ("directive_stage_code_uniq", "unique(code)", "Stage code must be unique."), + ] diff --git a/directive_layer/models/directive_template.py b/directive_layer/models/directive_template.py new file mode 100644 index 00000000..219a214b --- /dev/null +++ b/directive_layer/models/directive_template.py @@ -0,0 +1,69 @@ +from odoo import fields, models + + +class DirectiveTemplate(models.Model): + _name = "directive.template" + _description = "Directive Template" + _order = "name asc, id desc" + + PRIORITY = [ + ("0", "Low"), + ("1", "Normal"), + ("2", "High"), + ] + + name = fields.Char(string="Название шаблона директивы", required=True) + code = fields.Char(string="Технический код", required=True, index=True) + active = fields.Boolean(string="Активен", default=True) + + sequence = fields.Integer(string="Порядок", default=10) + + work_type_id = fields.Many2one( + "directive.work.type", + string="Тип работ", + required=True, + ondelete="restrict", + index=True, + ) + + planned_hours = fields.Float(string="Трудоёмкость", required=True) + load_percent = fields.Integer(string="Процент загрузки", default=10) + + priority = fields.Selection( + selection=PRIORITY, + string="Приоритет", + default="0", + required=True, + ) + + executor_role_id = fields.Many2one( + "res.users.role", + string="Роль исполнителя (по умолчанию)", + ondelete="restrict", + index=True, + ) + requester_role_id = fields.Many2one( + "res.users.role", + string="Роль заявителя (по умолчанию)", + ondelete="restrict", + index=True, + ) + + default_stage_id = fields.Many2one( + "directive.stage", + string="Стартовый статус", + default=lambda self: self.env["directive.stage"].search([("code", "=", "draft")], limit=1), + ondelete="restrict", + index=True, + ) + + handler_key = fields.Char( + string="Handler key", + help="Например: project.task.collect_ft (метод модели источника)", + ) + + description = fields.Text(string="Описание/инструкции") + + _sql_constraints = [ + ("directive_template_code_uniq", "unique(code)", "Template code must be unique."), + ] diff --git a/directive_layer/models/directive_template_group.py b/directive_layer/models/directive_template_group.py new file mode 100644 index 00000000..2b641264 --- /dev/null +++ b/directive_layer/models/directive_template_group.py @@ -0,0 +1,50 @@ +from odoo import fields, models + + +class DirectiveTemplateGroup(models.Model): + _name = "directive.template.group" + _description = "Directive Template Group" + _order = "name asc, id desc" + + name = fields.Char(string="Название группы шаблонов", required=True) + code = fields.Char(string="Технический код", index=True) + active = fields.Boolean(string="Активен", default=True) + + applicable_model = fields.Char( + string="Для какой модели доступен", + help='Например: "project.task". Если пусто — доступен для всех.', + index=True, + ) + + description = fields.Text(string="Описание") + + template_line_ids = fields.One2many( + "directive.template.group.line", + "group_id", + string="Шаги (шаблоны директив)", + copy=True, + ) + + +class DirectiveTemplateGroupLine(models.Model): + _name = "directive.template.group.line" + _description = "Directive Template Group Line" + _order = "sequence asc, id asc" + + group_id = fields.Many2one( + "directive.template.group", + string="Группа", + required=True, + ondelete="cascade", + index=True, + ) + + sequence = fields.Integer(string="Порядок", default=10) + + template_id = fields.Many2one( + "directive.template", + string="Шаблон директивы", + required=True, + ondelete="restrict", + index=True, + ) diff --git a/directive_layer/models/directive_work_type.py b/directive_layer/models/directive_work_type.py new file mode 100644 index 00000000..53f51cc4 --- /dev/null +++ b/directive_layer/models/directive_work_type.py @@ -0,0 +1,17 @@ +from odoo import fields, models + + +class DirectiveWorkType(models.Model): + _name = "directive.work.type" + _description = "Directive Work Type" + _order = "name asc, id desc" + + name = fields.Char(string="Название вида работ", required=True) + code = fields.Char(string="Технический код", index=True) + + active = fields.Boolean(string="Активен", default=True) + description = fields.Text(string="Описание") + + _sql_constraints = [ + ("directive_work_type_code_uniq", "unique(code)", "Work type code must be unique."), + ] diff --git a/directive_layer/models/res_users.py b/directive_layer/models/res_users.py new file mode 100644 index 00000000..3c53be00 --- /dev/null +++ b/directive_layer/models/res_users.py @@ -0,0 +1,27 @@ +from odoo import fields, models, api + +class ResUsers(models.Model): + _inherit = 'res.users' + + @api.model_create_multi + def create(self, vals_list): + users = super().create(vals_list) + for user in users: + self._check_and_set_executor_home(user) + return users + + def write(self, vals): + res = super().write(vals) + if 'group_ids' in vals: + for user in self: + self._check_and_set_executor_home(user) + return res + + def _check_and_set_executor_home(self, user): + executor_group = self.env.ref('directive_layer.role_directive_executor_res_groups', raise_if_not_found=False) + dashboard_action = self.env.ref('directive_layer.action_executor_dashboard_client', raise_if_not_found=False) + + if executor_group and dashboard_action: + if user.has_group('directive_layer.role_directive_executor_res_groups'): + if user.action_id != dashboard_action: + user.sudo().write({'action_id': dashboard_action.id}) \ No newline at end of file diff --git a/directive_layer/security/directives_rules.xml b/directive_layer/security/directives_rules.xml new file mode 100644 index 00000000..28253d99 --- /dev/null +++ b/directive_layer/security/directives_rules.xml @@ -0,0 +1,16 @@ + + + Directive: base access + + + + + \ No newline at end of file diff --git a/directive_layer/security/ir.model.access.csv b/directive_layer/security/ir.model.access.csv new file mode 100644 index 00000000..282e8f70 --- /dev/null +++ b/directive_layer/security/ir.model.access.csv @@ -0,0 +1,11 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_directive,access_directive,model_directive_directive,base.group_user,1,1,1,1 +access_directive_stage,access_directive_stage,model_directive_stage,base.group_user,1,1,1,1 +access_directive_work_type,access_directive_work_type,model_directive_work_type,base.group_user,1,1,1,1 +access_directive_origin,access_directive_origin,model_directive_origin,base.group_user,1,1,1,1 +access_directive_template,access_directive_template,model_directive_template,base.group_user,1,1,1,1 +access_directive_template_group,access_directive_template_group,model_directive_template_group,base.group_user,1,1,1,1 +access_directive_template_group_line,access_directive_template_group_line,model_directive_template_group_line,base.group_user,1,1,1,1 +access_directive_choose_group_wizard,access_directive_choose_group_wizard,model_directive_choose_group_wizard,base.group_user,1,0,1,0 +access_directive_delete_wizard,access_directive_delete_wizard,model_directive_delete_wizard,base.group_user,1,0,1,0 +access_directive_policy,access_directive_policy,model_directive_policy,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/directive_layer/security/roles.xml b/directive_layer/security/roles.xml new file mode 100644 index 00000000..210be3eb --- /dev/null +++ b/directive_layer/security/roles.xml @@ -0,0 +1,25 @@ + + + Директивы / Исполнитель + + + + Директивы / Заявитель + + + + Директивы / Диспетчер + + + + Директивы / Исполнитель + + + + Директивы / Заявитель + + + + Директивы / Диспетчер + + diff --git a/directive_layer/static/src/components/executor_board/executor_board.js b/directive_layer/static/src/components/executor_board/executor_board.js new file mode 100644 index 00000000..61bcae3e --- /dev/null +++ b/directive_layer/static/src/components/executor_board/executor_board.js @@ -0,0 +1,90 @@ +/** @odoo-module **/ + +import { registry } from "@web/core/registry"; +import { useService } from "@web/core/utils/hooks"; +import { Component, useState, onWillStart } from "@odoo/owl"; +import { session } from "@web/session"; + +export class ExecutorBoard extends Component { + setup() { + this.orm = useService("orm"); + this.userId = session.user_id || session.uid || (session.storeData?.Store?.settings?.user_id?.id); + + this.rawData = { + stages: [], + directives: [] + }; + + this.state = useState({ + columns: [], + loading: true, + }); + + onWillStart(async () => { + if (!this.userId) { + const partner = session.storeData?.["res.partner"]?.find(p => p.userId); + this.userId = partner ? partner.userId : false; + } + await this.loadData(); + }); + } + + async loadData() { + if (!this.userId) return; + + this.rawData.stages = await this.orm.searchRead( + "directive.stage", + [], + ["id", "name", "code"], + ); + + // 2. Грузим директивы + this.rawData.directives = await this.orm.searchRead( + "directive.directive", + [["executor_user_id", "=", this.userId]], + [ + "id", "name", "executor_stage_id", + "deadline_display", "time_left_display", + "planned_hours", "priority", "priority_stars", "is_overdue" + ] + ); + + this.processData(); + this.state.loading = false; + } + + processData() { + this.state.columns = this.rawData.stages.map(stage => { + return { + id: stage.id, + name: stage.name, + code: stage.code, + directives: this.rawData.directives.filter(d => d.executor_stage_id && d.executor_stage_id[0] === stage.id) + }; + }); + } + + async quickAction(ev, directiveId, actionType) { + ev.stopPropagation(); + + let targetCode = ''; + if (actionType === 'start') targetCode = 'in_progress'; + if (actionType === 'pause') targetCode = 'paused'; + if (actionType === 'finish') targetCode = 'done'; + + if (targetCode) { + await this.orm.call("directive.directive", "action_quick_change_stage", [directiveId, targetCode]); + await this.loadData(); + } + } + + async openDirective(directiveId) { + } + + async logout() { + window.location.href = "/web/session/logout"; + } +} + +ExecutorBoard.template = "directive_layer.ExecutorBoard"; +registry.category("actions").add("directive_layer.executor_dashboard_action", ExecutorBoard); \ No newline at end of file diff --git a/directive_layer/static/src/components/executor_board/executor_board.scss b/directive_layer/static/src/components/executor_board/executor_board.scss new file mode 100644 index 00000000..0d97d966 --- /dev/null +++ b/directive_layer/static/src/components/executor_board/executor_board.scss @@ -0,0 +1,222 @@ +.o_executor_dashboard { + height: 100vh; + width: 100vw; + display: flex; + flex-direction: column; + background-color: #f4f5f7; // Общий фон + font-family: 'Inter', system-ui, sans-serif; + + // --- Header --- + .executor_header { + height: 60px; + flex-shrink: 0; + background: #ffffff; + border-bottom: 1px solid #e1e4e8; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 20px; + + .brand { + font-size: 1.2rem; + font-weight: 700; + color: #172b4d; + display: flex; + align-items: center; + } + + .header_actions { + display: flex; + gap: 10px; + } + } + + // --- Board Container --- + .executor_board_container { + flex: 1; + display: flex; + overflow-x: auto; + overflow-y: hidden; + padding: 20px; + gap: 16px; + align-items: flex-start; + + // Mobile: Scroll Snap Logic + scroll-snap-type: x mandatory; + -webkit-overflow-scrolling: touch; + + // --- Column --- + .kanban_column { + min-width: 300px; + max-width: 300px; + background: #ebecf0; // Цвет колонки (светлее) + border-radius: 12px; + display: flex; + flex-direction: column; + max-height: 100%; + scroll-snap-align: center; // Центровка на мобильных + + .column_header { + padding: 14px 16px; + font-weight: 600; + color: #5e6c84; + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: 2px solid transparent; // Для цветной полоски + } + + // Цветные полоски для статусов + &:nth-child(1) .column_header { border-bottom-color: #6c757d; } // Черновик + &:nth-child(2) .column_header { border-bottom-color: #0dcaf0; } // В работе + &:nth-child(3) .column_header { border-bottom-color: #ffc107; } // Ожидание + &:nth-child(4) .column_header { border-bottom-color: #198754; } // Готово + + .column_content { + padding: 12px 8px 8px 8px; // ВЕРХНИЙ ОТСТУП (1) + overflow-y: auto; + flex: 1; + display: flex; + flex-direction: column; + gap: 12px; // Расстояние между карточками + } + } + } + + // --- Card --- + .directive_card { + background: #ffffff; // Белый фон карточки + border-radius: 8px; + padding: 12px; + box-shadow: 0 1px 2px rgba(9, 30, 66, 0.25); // Тень + cursor: pointer; + transition: all 0.2s; + border: 1px solid transparent; + + &:hover { + background-color: #fafbfc; + } + + &.card_overdue { + border-left: 4px solid #dc3545; + background-color: #fff8f8; + } + + .card_top { + display: flex; + justify-content: space-between; + align-items: center; // Выравнивание + margin-bottom: 8px; + font-size: 0.85rem; + color: #97a0af; + + .card_stars { + color: #f0ad4e; // Цвет звезд (оранжевый) + font-size: 1rem; + letter-spacing: 2px; + } + + } + + .card_title { + font-weight: 600; + color: #172b4d; + font-size: 0.95rem; + margin-bottom: 12px; + line-height: 1.4; + } + + .card_meta { + display: flex; + gap: 12px; + font-size: 0.8rem; + color: #5e6c84; + margin-bottom: 10px; + + .meta_item { + display: flex; + align-items: center; + gap: 4px; + + &.deadline.text-danger { + color: #dc3545; + font-weight: 600; + } + } + } + + .card_actions { + display: flex; + justify-content: space-between; + gap: 8px; + margin-top: 12px; + padding-top: 10px; + border-top: 1px solid #ebecf0; + opacity: 0; + transition: opacity 0.2s; + + .btn-action { + flex: 1; + border: none; + border-radius: 6px; + padding: 6px 10px; + font-size: 0.85rem; + font-weight: 500; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: background 0.2s; + + &.btn-run { background: #e6f7ff; color: #007bff; } + &.btn-run:hover { background: #007bff; color: white; } + + &.btn-pause { background: #fff3cd; color: #856404; } + &.btn-pause:hover { background: #ffc107; color: white; } + + &.btn-done { background: #d4edda; color: #155724; } + &.btn-done:hover { background: #28a745; color: white; } + } + } + + &:hover .card_actions { + opacity: 1; + } + } + + @media (max-width: 768px) { + .executor_header { + padding: 0 10px; + .brand span { display: none; } + } + + .executor_board_container { + padding: 10px; + gap: 10px; + + .kanban_column { + min-width: 85vw; + margin-right: 0; + } + } + + .directive_card { + padding: 16px; + + .card_title { + font-size: 1.05rem; + } + + .card_actions { + opacity: 1 !important; + justify-content: space-between; + + .btn-action { + flex: 1; + padding: 12px; + font-size: 1rem; + } + } + } + } +} \ No newline at end of file diff --git a/directive_layer/static/src/components/executor_board/executor_board.xml b/directive_layer/static/src/components/executor_board/executor_board.xml new file mode 100644 index 00000000..4c7a3f37 --- /dev/null +++ b/directive_layer/static/src/components/executor_board/executor_board.xml @@ -0,0 +1,89 @@ + + + +
+
+
+ + Мои Директивы +
+
+ +
+
+ +
+ +
+
+
+ + + +
+
+ + + + +
+ +
+ +
+ +
+ # + + + +
+ +
+ +
+ +
+
+ + +
+
+ + +
+
+ +
+ + + + + + + + +
+
+
+
+
+
+
+
+
+ + \ No newline at end of file diff --git a/directive_layer/static/src/scss/directive_kanban.scss b/directive_layer/static/src/scss/directive_kanban.scss new file mode 100644 index 00000000..7803526e --- /dev/null +++ b/directive_layer/static/src/scss/directive_kanban.scss @@ -0,0 +1,93 @@ +.o_kanban_view .directive_card { + border-radius: 16px; + padding: 18px 16px 16px 16px; + border: 1px solid rgba(0,0,0,.08); + box-shadow: 0 8px 20px rgba(0,0,0,.08); + transition: transform .15s ease, box-shadow .15s ease; + min-height: 140px; +} + +.o_kanban_view .directive_card:hover { + transform: translateY(-3px); + box-shadow: 0 14px 28px rgba(0,0,0,.12); +} + +.o_kanban_view .directive_title { + font-weight: 800; + font-size: 18px; + line-height: 1.3; + margin-bottom: 8px; +} + +.o_kanban_view .directive_deadline_label { + font-weight: 600; + font-size: 14px; + color: #555; +} + +.o_kanban_view .directive_deadline_value { + font-weight: 800; + font-size: 15px; + color: #333; +} + +.o_kanban_view .directive_priority .fa-star { + color: #ffc107 !important; +} + +.o_kanban_view .directive_meta { + opacity: 0.9; + font-size: 14px; /* крупнее */ +} + +.o_kanban_view .directive_row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; +} + +.o_kanban_view .meta_label { + color: #666; + font-weight: 500; +} + +.o_kanban_view .meta_value { + font-weight: 700; + color: #333; +} + +.o_kanban_view .title_row { + margin-bottom: 12px; +} + +.o_kanban_view .deadline_row { + margin-bottom: 12px; +} + +.o_kanban_view .directive_tl { + position: absolute; + bottom: 12px; + right: 12px; + width: 12px; + height: 12px; + border-radius: 50%; + background: #28a745; + box-shadow: 0 0 0 4px rgba(40,167,69,.25); +} + +.o_kanban_large_cards .o_kanban_record { + width: 320px !important; +} + +.o_kanban_view .directive_tl { + opacity: 0.95; +} + +.o_kanban_view .directive_card:hover .directive_tl { + box-shadow: 0 0 0 5px rgba(40,167,69,.35); +} + +.o_kanban_view .o_kanban_record.directive_card { + margin-bottom: 12px; +} \ No newline at end of file diff --git a/directive_layer/tests/__init__.py b/directive_layer/tests/__init__.py new file mode 100644 index 00000000..e9b83095 --- /dev/null +++ b/directive_layer/tests/__init__.py @@ -0,0 +1 @@ +from . import test_directive_layer \ No newline at end of file diff --git a/directive_layer/tests/test_directive_layer.py b/directive_layer/tests/test_directive_layer.py new file mode 100644 index 00000000..f6a1a133 --- /dev/null +++ b/directive_layer/tests/test_directive_layer.py @@ -0,0 +1,107 @@ +from odoo.tests.common import TransactionCase, tagged + +@tagged('standard', 'at_install', 'directive_logic') +class TestDirectivePolicy(TransactionCase): + + def setUp(self): + """ + Метод запускается перед каждым тестом. + Гарантирует изоляцию данных: каждый тест работает с новой задачей и новой политикой. + """ + super(TestDirectivePolicy, self).setUp() + + self.work_type = self.env['directive.work.type'].create({ + 'name': 'Development', + 'code': 'dev' + }) + + self.stage_draft = self.env['directive.stage'].search([('code', '=', 'draft')], limit=1) + if not self.stage_draft: + self.stage_draft = self.env['directive.stage'].create({'name': 'Draft', 'code': 'draft'}) + + self.template = self.env['directive.template'].create({ + 'name': 'Шаблон авто-задачи', + 'code': 'T001', + 'work_type_id': self.work_type.id, + 'planned_hours': 5.0, + }) + + self.template_group = self.env['directive.template.group'].create({ + 'name': 'Test Group', + 'template_line_ids': [(0, 0, {'template_id': self.template.id})] + }) + + self.policy_callback = self.env['directive.policy'].create({ + 'name': 'On Callback Policy', + 'origin_model': 'project.task', + 'event': 'on_callback', + 'trigger_field': 'action_demo_directive_callback', + 'mode': 'create_once', + 'use_record_template_group': False, + 'template_group_id': self.template_group.id, + }) + + self.policy_write = self.env['directive.policy'].create({ + 'name': 'On Write Policy', + 'origin_model': 'project.task', + 'event': 'on_write', + 'trigger_field': 'color', + 'trigger_value_int': 5, + 'mode': 'create_once', + 'use_record_template_group': False, + 'template_group_id': self.template_group.id, + }) + + self.task = self.env['project.task'].create({ + 'name': 'Source Task', + 'color': 0, + }) + + def test_01_policy_on_write(self): + """Тест генерации директивы при изменении поля (on_write)""" + self.task.write({'color': 5}) + + directives = self.env['directive.directive'].search([ + ('origin_id.res_model', '=', 'project.task'), + ('origin_id.res_id', '=', self.task.id), + ('policy_id', '=', self.policy_write.id) + ]) + + self.assertEqual(len(directives), 1, "Директива не создалась через on_write!") + self.assertEqual(directives.name, 'Шаблон авто-задачи', "Имя перенеслось неверно") + self.assertEqual(directives.planned_hours, 5.0, "Трудоемкость перенеслась неверно") + + # Проверка create_once + self.task.write({'color': 0}) + self.task.write({'color': 5}) + + directives_count = self.env['directive.directive'].search_count([ + ('origin_id.res_model', '=', 'project.task'), + ('origin_id.res_id', '=', self.task.id), + ('policy_id', '=', self.policy_write.id) + ]) + + self.assertEqual(directives_count, 1, "Сломался create_once! Создался дубль директивы.") + + def test_02_policy_on_callback(self): + """Тест генерации директивы при вызове метода (on_callback)""" + self.task.action_demo_directive_callback() + + directives = self.env['directive.directive'].search([ + ('origin_id.res_model', '=', 'project.task'), + ('origin_id.res_id', '=', self.task.id), + ('policy_id', '=', self.policy_callback.id) + ]) + + self.assertEqual(len(directives), 1, "Директива не создалась через on_callback!") + + # Проверка create_once + self.task.action_demo_directive_callback() + + directives_count = self.env['directive.directive'].search_count([ + ('origin_id.res_model', '=', 'project.task'), + ('origin_id.res_id', '=', self.task.id), + ('policy_id', '=', self.policy_callback.id) + ]) + + self.assertEqual(directives_count, 1, "Сломался create_once для методов! Создался дубль.") \ No newline at end of file diff --git a/directive_layer/views/cron.xml b/directive_layer/views/cron.xml new file mode 100644 index 00000000..c873f337 --- /dev/null +++ b/directive_layer/views/cron.xml @@ -0,0 +1,14 @@ + + + + + Demo: Генерация данных для Симуляции (Mesa) + + code + model._cron_generate_simulation_data() + 1 + days + + + + \ No newline at end of file diff --git a/directive_layer/views/directive_actions.xml b/directive_layer/views/directive_actions.xml new file mode 100644 index 00000000..19be299f --- /dev/null +++ b/directive_layer/views/directive_actions.xml @@ -0,0 +1,7 @@ + + + Рабочий стол Исполнителя + directive_layer.executor_dashboard_action + fullscreen + + \ No newline at end of file diff --git a/directive_layer/views/directive_policy_views.xml b/directive_layer/views/directive_policy_views.xml new file mode 100644 index 00000000..b619ab09 --- /dev/null +++ b/directive_layer/views/directive_policy_views.xml @@ -0,0 +1,127 @@ + + + + + directive.policy.form + directive.policy + +
+ + +
+
+ + + + + + + + + + + + + + + + + +
+
+
+
+ + + directive.policy.list + directive.policy + + + + + + + + + + + + + + directive.template.group.form + directive.template.group + +
+ +
+
+ + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + directive.policy.search + directive.policy + + + + + + + + + + + + Политики директив + directive.policy + list,form + + + + +
+
\ No newline at end of file diff --git a/directive_layer/views/directive_views.xml b/directive_layer/views/directive_views.xml new file mode 100644 index 00000000..841ca7a4 --- /dev/null +++ b/directive_layer/views/directive_views.xml @@ -0,0 +1,247 @@ + + + directive.kanban + directive.directive + + + + + + + + + + + +
+ +
+
+ +
+
+ +
+
+ +
+
+ Дедлайн: +
+
+ +
+
+ +
+
+
Осталось:
+
+ +
+
+
+
Трудоёмкость:
+
+ ч +
+
+
+
+
+
+
+
+
+ + + directive.list + directive.directive + + + + + + + + + + + + + + + + + + directive.form + directive.directive + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + Моя работа + directive.directive + kanban,list,form + [] + + + + Все директивы + directive.directive + kanban,list,form + [] + + + + + + + + Источники директив + directive.origin + list,form + + + + Статусы директив + directive.stage + list,form + + + + Виды работ + directive.work.type + list,form + + + + Шаблоны директив + directive.template + list,form + + + + Группы шаблонов директив + directive.template.group + list,form + + + + + + + + + + + + + +
diff --git a/directive_layer/wizard/__init__.py b/directive_layer/wizard/__init__.py new file mode 100644 index 00000000..fb79de0e --- /dev/null +++ b/directive_layer/wizard/__init__.py @@ -0,0 +1,2 @@ +from . import directive_delete_wizard +from . import directive_choose_group_wizard \ No newline at end of file diff --git a/directive_layer/wizard/directive_choose_group_wizard.py b/directive_layer/wizard/directive_choose_group_wizard.py new file mode 100644 index 00000000..e39fdafb --- /dev/null +++ b/directive_layer/wizard/directive_choose_group_wizard.py @@ -0,0 +1,35 @@ +from odoo import api, fields, models +from odoo.exceptions import UserError + + +class DirectiveChooseGroupWizard(models.TransientModel): + _name = "directive.choose.group.wizard" + _description = "Choose Directive Template Group" + + template_group_id = fields.Many2one( + "directive.template.group", + string="Группа шаблонов", + required=True, + # domain=lambda self: self._domain_template_group(), + ) + + @api.model + def _domain_template_group(self): + active_model = self.env.context.get("active_model") + return ["|", ("applicable_model", "=", False), ("applicable_model", "=", active_model or False)] + + def action_confirm(self): + active_model = self.env.context.get("active_model") + active_id = self.env.context.get("active_id") + if not active_model or not active_id: + raise UserError("No active record in context.") + + record = self.env[active_model].browse(active_id).exists() + if not record: + raise UserError("Source record not found.") + + if not hasattr(record, "directive_template_group_id"): + raise UserError("Model does not support directive template group (directive.mixin is not applied).") + + record.write({"directive_template_group_id": self.template_group_id.id}) + return {"type": "ir.actions.act_window_close"} \ No newline at end of file diff --git a/directive_layer/wizard/directive_delete_wizard.py b/directive_layer/wizard/directive_delete_wizard.py new file mode 100644 index 00000000..df4e920f --- /dev/null +++ b/directive_layer/wizard/directive_delete_wizard.py @@ -0,0 +1,32 @@ +from odoo import fields, models +from odoo.exceptions import UserError + + +class DirectiveDeleteWizard(models.TransientModel): + _name = "directive.delete.wizard" + _description = "Directive Delete Wizard" + + mode = fields.Selection( + [ + ("archive", "Мягкое удаление (архивировать)"), + ("delete", "Полное удаление (unlink)"), + ], + string="Режим", + required=True, + default="archive", + ) + + def action_confirm(self): + active_model = self.env.context.get("active_model") + active_id = self.env.context.get("active_id") + if not active_model or not active_id: + raise UserError("No active record in context.") + record = self.env[active_model].browse(active_id).exists() + if not record: + return {"type": "ir.actions.act_window_close"} + + if self.mode == "archive": + record._action_archive() + else: + record._action_delete_hard() + return {"type": "ir.actions.act_window_close"} diff --git a/directive_layer/wizard/directive_wizards.xml b/directive_layer/wizard/directive_wizards.xml new file mode 100644 index 00000000..2986706a --- /dev/null +++ b/directive_layer/wizard/directive_wizards.xml @@ -0,0 +1,37 @@ + + + directive.choose.group.wizard.form + directive.choose.group.wizard + +
+ + + + +
+
+
+
+
+
+ + + directive.delete.wizard.form + directive.delete.wizard + +
+ + + + +
+
+
+
+
+
+
diff --git a/directive_test/README.md b/directive_test/README.md new file mode 100644 index 00000000..7cbebf87 --- /dev/null +++ b/directive_test/README.md @@ -0,0 +1,70 @@ +# Слой директив — Демонстрационная интеграция +**name:** directive_test +**version:** 19.0.1.0.0 +**author:** RuOdoo + + +### 1. Общее описание + +Модуль демонстрирует работу директив в реальных бизнес-объектах Odoo: задачах, заказах, счетах, складе и производстве. Служит рабочим примером для разработчиков, которые хотят подключить директивы к своим объектам, и позволяет оценить возможности базового модуля `directive_layer` на практике. + + +### 2. Установка + +1. Убедитесь, что установлен модуль `directive_layer` + +2. Скопируйте папку `directive_test` в директорию `addons` + +3. Перезапустите сервер Odoo + +4. Обновите список приложений: **Настройки → Приложения → Обновить список** + +5. Найдите **«Directive Test»** и установите + +### 3. Функциональность + +3.1 К каким объектам подключены директивы: + +| Объект | Когда создаётся задание | Кто исполняет | +|---|---|---| +| Задача проекта | При переходе задачи в определённую стадию | Человек | +| Заказ на продажу | При подтверждении заказа | WMS-агент (автоматически) | +| Входящий счёт | При подтверждении счёта от поставщика | Аудит-бот (автоматически) | +| Исходящий платёж | При переходе платежа в обработку | Банковский шлюз (автоматически) | +| Перемещение склада | После подтверждения перемещения | AGV-робот (автоматически) | +| Рабочий центр | Когда операция резки готова к запуску | IoT-оборудование (автоматически) | + +3.2 Элементы на форме объекта: + +На форме каждого из перечисленных объектов появляются три элемента: + +- **Кнопка «Выбрать тип»** в шапке — назначает группу заданий для записи +- **Кнопка «Директивы»** — показывает количество заданий, открывает список +- **Поле «Исполнение»** — текущий сводный статус всех заданий по записи + +![img_1.png](img_1.png) + +После выполнения задания в чат записи автоматически поступает сообщение от исполнителя. + +### Пример использования + +### Открыть объект и назначить группу заданий + +Перейдите в любой поддерживаемый объект, например **Продажи → Заказы**. Нажмите кнопку **«Выбрать тип»** в шапке формы и выберите группу шаблонов заданий. + +![img_2.png](img_2.png) + +### Выполнить бизнес-действие + +Подтвердите заказ, переведите задачу в нужную стадию, проведите платёж и т.д. Задание создастся автоматически и появится в кнопке **«Директивы»**. + +### Посмотреть список заданий + +Нажмите кнопку **«Директивы»** на форме объекта — откроется список всех заданий с текущими стадиями, дедлайнами и исполнителями. + +![img_3.png](img_3.png) + +### Проверить результат в чате + +После выполнения задания перейдите в чат записи — там появится сообщение от исполнителя с результатом работы. + diff --git a/directive_test/TECHNICAL.md b/directive_test/TECHNICAL.md new file mode 100644 index 00000000..d0b467a5 --- /dev/null +++ b/directive_test/TECHNICAL.md @@ -0,0 +1,194 @@ +# Directive Test +**name**: directive_test +**version**: 19.0.1.0.0 +**author**: Mk.Lab +**depends:** `directive_layer`, `base_user_role`, `sale`, `mail`, `account`, `account_payment`, `mrp`, `project`, `stock` + +## Назначение + +Демонстрационный модуль интеграции `directive_layer` с базовыми моделями Odoo. Служит референсом для разработчиков при подключении директив к новым моделям. + +--- + +## Паттерн интеграции + +Каждая интегрируемая модель подключается к `directive.mixin` через `_inherit` и реализует два элемента: + +```python +class SomeModel(models.Model): + _name = 'some.model' + _inherit = ['some.model', 'directive.mixin'] + + def _directive_generation_spec(self) -> list[dict]: + return [{ ...spec... }] + + def action_executor_response(self, payload: dict) -> bool: + # вызывается при завершении директивы + return True +``` + +### Структура спецификации `_directive_generation_spec()` + +| Ключ | Описание | +|---|---| +| `event` | Тип события: `on_write` или `on_callback` | +| `key` | Уникальный ключ директивы (для режима `create_once`) | +| `field` | Имя поля (для `on_write`) | +| `from` | Значение поля до изменения | +| `to` | Значение поля после изменения | +| `callback` | Имя метода (для `on_callback`) | +| `when` | Момент вызова: `after` | +| `if_result` | Условие на результат метода | +| `use_record_template_group` | Брать группу шаблонов из поля записи | +| `mode` | `create_once` — создать директиву только один раз | +| `domain` | Дополнительный фильтр по записям модели | + +--- + +## Интегрированные модели + +### `project.task` + `directive.mixin` + +**Файл:** `models/project_task.py` + +| Параметр | Значение | +|---|---| +| Событие | `on_write` | +| Поле | `stage_id` | +| Переход | от ID 9 к ID 10 | +| Тип исполнителя | `human` | + +**Callback `directive_on_done_post_message(payload)`** — публикует в чат задачи сообщение: «Директива выполнена: {directive_name}». + +--- + +### `account.move` + `directive.mixin` + +**Файл:** `models/account_move.py` + +| Параметр | Значение | +|---|---| +| Событие | `on_write` | +| Поле | `state` | +| Переход | `draft` → `posted` | +| Domain | `move_type = 'in_invoice'` (только входящие счета) | +| Тип исполнителя | `software` (аудит-бот) | + +**Callback `action_audit_response(payload)`** — публикует в чат счёта результат проверки с оценкой риска. + +--- + +### `sale.order` + `directive.mixin` + +**Файл:** `models/sale_order.py` + +| Параметр | Значение | +|---|---| +| Событие | `on_write` | +| Поле | `state` | +| Переход | `draft` → `sale` | +| Тип исполнителя | `software` (WMS-агент) | + +**Callback `action_wms_response(payload)`** — публикует в чат заказа информацию о резервировании товара с указанием ячейки. + +--- + +### `account.payment` + `directive.mixin` + +**Файл:** `models/account_payment.py` + +| Параметр | Значение | +|---|---| +| Событие | `on_write` | +| Поле | `state` | +| Переход | `draft` → `in_process` | +| Domain | `payment_type = 'outbound'` (только исходящие) | +| Тип исполнителя | `software` (банковский шлюз) | + +**Callback `action_bank_gateway_response(payload)`** — публикует в чат платежа банковский референс в формате `REF-{id}-X99`. + +--- + +### `stock.picking` + `directive.mixin` + +**Файл:** `models/stock_picking.py` + +| Параметр | Значение | +|---|---| +| Событие | `on_callback` | +| Метод | `button_validate` | +| Когда | `after` | +| Условие | `if_result: True` | +| Тип исполнителя | `software` (AGV-робот) | + +**Callback `action_agv_callback(payload)`** — публикует в чат перемещения информацию о доставке в зону производства. + +--- + +### `mrp.workorder` + `directive.mixin` + +**Файл:** `models/mrp_workorder.py` + +| Параметр | Значение | +|---|---| +| Событие | `on_write` | +| Поле | `state` | +| Переход | `pending` → `ready` | +| Domain | `name ilike 'резка'` | +| Тип исполнителя | `machine` (IoT/CNC) | + +**Callback `action_iot_signal(payload)`** — публикует в чат рабочей операции телеметрию оборудования (температура шпинделя, вибрация) и обновляет заголовок производственного заказа. + +--- + +### `mrp.production` (расширение без mixin) + +**Файл:** `models/mrp_workorder.py` + +Добавляет метод `action_choose_directive_group()` в модель производственного заказа. Метод берёт первый рабочий центр из `workorder_ids` и открывает визард `directive.choose.group.wizard` с `active_model='mrp.workorder'`. При отсутствии рабочих центров выводит предупреждение. + +--- + +## Имитация программных агентов (cron) + +**Файл:** `models/directive_directive.py` +**Метод:** `_cron_simulate_system_agents()` + +Запускается планировщиком для автоматического продвижения директив программных и машинных исполнителей по стадиям: + +| Текущая стадия | Действие | +|---|---| +| `planned` | `_set_stage('in_progress')` | +| `in_progress` | `action_done()` | + +Фильтр: `executor_type in ['software', 'machine']`, `stage_code in ['draft', 'planned', 'in_progress']`. + +--- + +## Представления + +**Файл:** `views/project_task_views.xml` + +Добавляет единообразный набор элементов в формы шести объектов: `project.task`, `sale.order`, `account.move`, `account.payment`, `stock.picking`, `mrp.production`. + +| Элемент | Расположение | Описание | +|---|---|---| +| Кнопка «Выбрать тип» | `header` | Открывает визард выбора группы шаблонов | +| Кнопка «Директивы» | `oe_button_box` | Открывает список директив объекта | +| Поле `directive_execution_status` | `sheet` | Текущий статус исполнения (readonly) | + +Для задачи (`project.task`) дополнительно добавляется кнопка «Demo: Callback» для ручного тестирования механизма callback. + +--- + +## Демо-пользователи + +**Файл:** `data/users.xml` + +| XML ID | Логин | Имя | +|---|---|---| +| `user_directive_executor` | `directive_executor` | Directive Executor | +| `user_directive_requester` | `directive_requester` | Directive Requester | +| `user_directive_dispatcher` | `directive_dispatcher` | Directive Dispatcher | + +Все пользователи получают только `base.group_user`. Роли директив назначаются через `base_user_role`. diff --git a/directive_test/__init__.py b/directive_test/__init__.py new file mode 100644 index 00000000..9a7e03ed --- /dev/null +++ b/directive_test/__init__.py @@ -0,0 +1 @@ +from . import models \ No newline at end of file diff --git a/directive_test/__manifest__.py b/directive_test/__manifest__.py new file mode 100644 index 00000000..75e3e877 --- /dev/null +++ b/directive_test/__manifest__.py @@ -0,0 +1,13 @@ +{ + "name": "Directive Test", + "version": "19.0.1.0.0", + "summary": "Тестовая интеграция слоя директив с project.task", + "license": "LGPL-3", + "depends": ["sale", "mail", "account", "account_payment", "mrp", "project", "directive_layer", "base_user_role", "stock"], + "data": [ + "data/users.xml", + "views/project_task_views.xml", + ], + "installable": True, + "application": False, +} diff --git a/directive_test/data/users.xml b/directive_test/data/users.xml new file mode 100644 index 00000000..478d1cec --- /dev/null +++ b/directive_test/data/users.xml @@ -0,0 +1,22 @@ + + + Directive Executor + directive_executor + directive_executor@example.com + + + + + Directive Requester + directive_requester + directive_requester@example.com + + + + + Directive Dispatcher + directive_dispatcher + directive_dispatcher@example.com + + + \ No newline at end of file diff --git a/directive_test/img_1.png b/directive_test/img_1.png new file mode 100644 index 00000000..dbeb3f7b Binary files /dev/null and b/directive_test/img_1.png differ diff --git a/directive_test/img_2.png b/directive_test/img_2.png new file mode 100644 index 00000000..3d4c44b1 Binary files /dev/null and b/directive_test/img_2.png differ diff --git a/directive_test/img_3.png b/directive_test/img_3.png new file mode 100644 index 00000000..a759b1b4 Binary files /dev/null and b/directive_test/img_3.png differ diff --git a/directive_test/models/__init__.py b/directive_test/models/__init__.py new file mode 100644 index 00000000..d233313f --- /dev/null +++ b/directive_test/models/__init__.py @@ -0,0 +1,7 @@ +from . import project_task +from . import sale_order +from . import directive_directive +from . import account_move +from . import account_payment +from . import mrp_workorder +from . import stock_picking \ No newline at end of file diff --git a/directive_test/models/account_move.py b/directive_test/models/account_move.py new file mode 100644 index 00000000..731b46bb --- /dev/null +++ b/directive_test/models/account_move.py @@ -0,0 +1,32 @@ +from odoo import models, fields + + +class AccountMove(models.Model): + _name = "account.move" + _inherit = ["account.move", "directive.mixin"] + + + def _directive_generation_spec(self): + return [ + { + "event": "on_write", + "key": "am_audit_trigger", + "field": "state", + "from": "draft", + "to": "posted", + "use_record_template_group": True, + "mode": "create_once", + # Генерируем только для входящих инвойсов от поставщиков + "domain": [("move_type", "=", "in_invoice")], + } + ] + + def action_audit_response(self, payload: dict): + """ + Вызывается агентом-аудитором. + """ + for move in self: + move.message_post( + body=f"Audit Bot: Обнаружен риск, 30/100." + f"Директива #{payload.get('directive_id')} завершена с предупреждением." + ) diff --git a/directive_test/models/account_payment.py b/directive_test/models/account_payment.py new file mode 100644 index 00000000..cbdb27c1 --- /dev/null +++ b/directive_test/models/account_payment.py @@ -0,0 +1,32 @@ +from odoo import models, fields + + +class AccountPayment(models.Model): + _name = 'account.payment' + _inherit = ["account.payment", "directive.mixin"] + + def _directive_generation_spec(self): + return [ + { + "event": "on_write", + "key": "pay_bank_trigger", + "field": "state", + "from": "draft", + "to": "in_process", + "use_record_template_group": True, + "mode": "create_once", + # Только для исходящих платежей + "domain": [("payment_type", "=", "outbound")], + } + ] + + def action_bank_gateway_response(self, payload: dict): + for pay in self: + bank_ref = f"REF-{pay.id}-X99" + + pay.message_post( + body=f"Bank Gateway: Платеж отправлен в банк." + f"Bank Reference: {bank_ref}" + f"Комиссия агента: 0.00 у.е." + ) + return True \ No newline at end of file diff --git a/directive_test/models/directive_directive.py b/directive_test/models/directive_directive.py new file mode 100644 index 00000000..9576db60 --- /dev/null +++ b/directive_test/models/directive_directive.py @@ -0,0 +1,27 @@ +from odoo import api, models + + +class Directive(models.Model): + _inherit = "directive.directive" + + @api.model + def _cron_simulate_system_agents(self): + """ + Этот метод имитирует работу внешних систем (WMS, Банк, AI). + Запускается раз в минуту. + """ + system_directives = self.search([ + ('executor_type', 'in', ['software', 'machine']), + ('stage_code', 'in', ['draft', 'planned', 'in_progress']), + ('stage_code', '!=', 'done') + ], limit=50) + + for d in system_directives: + + if d.stage_code == 'planned': + d._set_stage('in_progress') + print(f"Agent started directive {d.id}") + + elif d.stage_code == 'in_progress': + d.action_done() + print(f"Agent finished directive {d.id}") \ No newline at end of file diff --git a/directive_test/models/mrp_workorder.py b/directive_test/models/mrp_workorder.py new file mode 100644 index 00000000..15cb4569 --- /dev/null +++ b/directive_test/models/mrp_workorder.py @@ -0,0 +1,77 @@ +from odoo import models, fields + + +class MrpWorkorder(models.Model): + _name = "mrp.workorder" + _inherit = ["mrp.workorder", "directive.mixin"] + + def _directive_generation_spec(self): + return [ + { + "event": "on_write", + "key": "mrp_iot_trigger", + "field": "state", + "from": "pending", + "to": "ready", + "use_record_template_group": True, + "mode": "create_once", + "domain": [("name", "ilike", "резка")], + } + ] + + def action_iot_signal(self, payload: dict): + """ + Метод-обработчик завершения директивы оборудованием. + Записывает телеметрию в саму операцию и в головной заказ (MO). + """ + for wo in self: + telemetry = payload.get('telemetry', {}) + temp = telemetry.get('temperature', 59) + vibro = telemetry.get('vibration', 'Норма') + + message = ( + f"IoT CNC [{wo.name}]: Операция завершена.
" + f"Температура шпинделя: {temp}°C
" + f"Вибрация: {vibro}." + ) + + if wo.production_id: + wo.production_id.message_post( + body=f"Отчет по операции {wo.name}: {message}" + ) + return True + + +class MrpProduction(models.Model): + _inherit = 'mrp.production' + + def action_choose_directive_group(self): + + self.ensure_one() + + workorder = self.workorder_ids[:1] + + if not workorder: + return { + 'type': 'ir.actions.client', + 'tag': 'display_notification', + 'params': { + 'title': 'Внимание', + 'message': 'Сначала подтвердите заказ, чтобы появились операции (Work Orders)', + 'type': 'warning', + 'sticky': False, + } + } + + return { + "type": "ir.actions.act_window", + "name": f"Назначить директивы для: {workorder.name}", + "res_model": "directive.choose.group.wizard", + "view_mode": "form", + "target": "new", + "context": { + # КОСТЫЛЬ + "active_model": "mrp.workorder", + "active_id": workorder.id, + }, + } \ No newline at end of file diff --git a/directive_test/models/project_task.py b/directive_test/models/project_task.py new file mode 100644 index 00000000..1c43ef72 --- /dev/null +++ b/directive_test/models/project_task.py @@ -0,0 +1,44 @@ +from odoo import models + + +class ProjectTask(models.Model): + _name = 'project.task' + _inherit = ["project.task", "directive.mixin"] + + def directive_on_done_post_message(self, payload: dict): + for task in self: + task.message_post( + body=f"Директива выполнена: {payload.get('directive_name')})" + ) + return True + + # def _directive_generation_spec(self): + # return [ + # { + # "event": "on_callback", + # "callback": "action_demo_directive_callback", + # "mode": "create_once", + # "when": "after", + # "if_result": True, + # "use_record_template_group": True, + # "key": "demo_callback_v1", + # } + # ] + + def _directive_generation_spec(self): + return [ + { + "event": "on_write", + "key": "stage_draft_to_progress", + "field": "stage_id", + "from": 9, + "to": 10, + "use_record_template_group": True, + "mode": "create_once", + } + ] + + def action_demo_directive_callback(self): + for task in self: + task.message_post(body="Demo callback executed") + return True \ No newline at end of file diff --git a/directive_test/models/sale_order.py b/directive_test/models/sale_order.py new file mode 100644 index 00000000..2ddd699c --- /dev/null +++ b/directive_test/models/sale_order.py @@ -0,0 +1,31 @@ +from odoo import models, fields, api + + +class SaleOrder(models.Model): + _name = 'sale.order' + _inherit = ["sale.order", "directive.mixin"] + + def _directive_generation_spec(self): + return [ + { + "event": "on_write", + "key": "so_trigger_wms", + "field": "state", + "from": "draft", + "to": "sale", + "use_record_template_group": True, + "mode": "create_once", + } + ] + + def action_wms_response(self, payload: dict): + for order in self: + bin_location = "ZONE-A-ROW-5" + + order.message_post( + body=f"WMS Агент: Товар зарезервирован." + f"Ячейка: {bin_location}
" + f"Директива #{payload.get('directive_id')} закрыта успешно." + ) + + return True \ No newline at end of file diff --git a/directive_test/models/stock_picking.py b/directive_test/models/stock_picking.py new file mode 100644 index 00000000..f07a3ff6 --- /dev/null +++ b/directive_test/models/stock_picking.py @@ -0,0 +1,26 @@ +from odoo import models, fields + +class StockPicking(models.Model): + _name = 'stock.picking' + _inherit = ["stock.picking", "directive.mixin"] + + def _directive_generation_spec(self): + return [ + { + "event": "on_callback", + "callback": "button_validate", + "mode": "create_once", + "when": "after", + "if_result": True, + "use_record_template_group": True, + "key": "picking_done_check_finance", + } + ] + + def action_agv_callback(self, payload: dict): + for picking in self: + picking.message_post( + body=f"AGV Unit 01: Доставка в зону производства выполнена." + f"Батарея: 84%." + ) + return True \ No newline at end of file diff --git a/directive_test/views/project_task_views.xml b/directive_test/views/project_task_views.xml new file mode 100644 index 00000000..a85f3b06 --- /dev/null +++ b/directive_test/views/project_task_views.xml @@ -0,0 +1,198 @@ + + + project.task.form.directives.inherit + project.task + + + + + +
+
+
diff --git a/dms/static/src/js/views/file_kanban_record.esm.js b/dms/static/src/js/views/file_kanban_record.esm.js new file mode 100644 index 00000000..335fb08d --- /dev/null +++ b/dms/static/src/js/views/file_kanban_record.esm.js @@ -0,0 +1,59 @@ +// /** ******************************************************************************** +// Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +// License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +// **********************************************************************************/ +import {KanbanRecord} from "@web/views/kanban/kanban_record"; +import {useFileViewer} from "@web/core/file_viewer/file_viewer_hook"; +import {useService} from "@web/core/utils/hooks"; + +const videoReadableTypes = ["x-matroska", "mp4", "webm"]; +const audioReadableTypes = ["mp3", "ogg", "wav", "aac", "mpa", "flac", "m4a"]; + +export class FileKanbanRecord extends KanbanRecord { + setup() { + super.setup(); + this.store = useService("mail.store"); + this.fileViewer = useFileViewer(); + } + + isVideo(mimetype) { + return videoReadableTypes.includes(mimetype); + } + + isAudio(mimetype) { + return audioReadableTypes.includes(mimetype); + } + + /** + * @override + * + * Override to open the preview upon clicking the image, if compatible. + */ + onGlobalClick(ev) { + const self = this; + + if (ev.target.closest(".o_kanban_dms_file_preview")) { + const file_type = self.props.record.data.name.split(".")[1]; + let mimetype = ""; + + if (self.isVideo(file_type)) { + mimetype = `video/${file_type}`; + } else if (self.isAudio(file_type)) { + mimetype = "audio/mpeg"; + } else { + mimetype = self.props.record.data.mimetype; + } + + const attachment = this.store.Attachment.insert({ + id: self.props.record.data.id, + filename: self.props.record.data.name, + name: self.props.record.data.name, + mimetype: mimetype, + model_name: self.props.record.resModel, + }); + this.fileViewer.open(attachment); + return; + } + return super.onGlobalClick(ev); + } +} diff --git a/dms/static/src/js/views/file_kanban_renderer.esm.js b/dms/static/src/js/views/file_kanban_renderer.esm.js new file mode 100644 index 00000000..157f74fe --- /dev/null +++ b/dms/static/src/js/views/file_kanban_renderer.esm.js @@ -0,0 +1,17 @@ +// /** ******************************************************************************** +// Copyright 2020 Creu Blanca +// License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +// **********************************************************************************/ +import {FileKanbanRecord} from "./file_kanban_record.esm"; +import {KanbanRenderer} from "@web/views/kanban/kanban_renderer"; + +export class FileKanbanRenderer extends KanbanRenderer { + setup() { + super.setup(); + } +} + +FileKanbanRenderer.components = { + ...KanbanRenderer.components, + KanbanRecord: FileKanbanRecord, +}; diff --git a/dms/static/src/js/views/file_kanban_renderer.xml b/dms/static/src/js/views/file_kanban_renderer.xml new file mode 100644 index 00000000..e0dfc5da --- /dev/null +++ b/dms/static/src/js/views/file_kanban_renderer.xml @@ -0,0 +1,52 @@ + + + + + +
+ +
+
+
+ + + + + + + + + + +
diff --git a/dms/static/src/js/views/file_kanban_view.esm.js b/dms/static/src/js/views/file_kanban_view.esm.js new file mode 100644 index 00000000..0fb1f52b --- /dev/null +++ b/dms/static/src/js/views/file_kanban_view.esm.js @@ -0,0 +1,28 @@ +// /** ******************************************************************************** +// Copyright 2020 Creu Blanca +// Copyright 2017-2019 MuK IT GmbH +// Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +// License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +// **********************************************************************************/ + +import { + createFileDropZoneExtension, + createFileUploadExtension, +} from "./dms_file_upload.esm"; +import {FileKanbanRenderer} from "./file_kanban_renderer.esm"; +import {KanbanController} from "@web/views/kanban/kanban_controller"; +import {kanbanView} from "@web/views/kanban/kanban_view"; +import {patch} from "@web/core/utils/patch"; +import {registry} from "@web/core/registry"; + +patch(FileKanbanRenderer.prototype, createFileDropZoneExtension()); +patch(KanbanController.prototype, createFileUploadExtension()); +FileKanbanRenderer.template = "dms.KanbanRenderer"; + +export const FileKanbanView = { + ...kanbanView, + buttonTemplate: "dms.KanbanButtons", + Renderer: FileKanbanRenderer, +}; + +registry.category("views").add("file_kanban", FileKanbanView); diff --git a/dms/static/src/js/views/file_list_controller.esm.js b/dms/static/src/js/views/file_list_controller.esm.js new file mode 100644 index 00000000..632dd37c --- /dev/null +++ b/dms/static/src/js/views/file_list_controller.esm.js @@ -0,0 +1,13 @@ +// /** ******************************************************************************** +// Copyright 2020 Creu Blanca +// Copyright 2017-2019 MuK IT GmbH +// License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +// **********************************************************************************/ + +import {ListController} from "@web/views/list/list_controller"; + +export class FileListController extends ListController { + setup() { + super.setup(...arguments); + } +} diff --git a/dms/static/src/js/views/file_list_renderer.esm.js b/dms/static/src/js/views/file_list_renderer.esm.js new file mode 100644 index 00000000..08edd549 --- /dev/null +++ b/dms/static/src/js/views/file_list_renderer.esm.js @@ -0,0 +1,16 @@ +// /** ******************************************************************************** +// Copyright 2020 Creu Blanca +// License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +// **********************************************************************************/ + +import {ListRenderer} from "@web/views/list/list_renderer"; + +export class FileListRenderer extends ListRenderer { + setup() { + super.setup(); + } +} + +FileListRenderer.components = { + ...FileListRenderer.components, +}; diff --git a/dms/static/src/js/views/file_list_renderer.xml b/dms/static/src/js/views/file_list_renderer.xml new file mode 100644 index 00000000..6a88307b --- /dev/null +++ b/dms/static/src/js/views/file_list_renderer.xml @@ -0,0 +1,48 @@ + + + + +
+ +
+
+
+ + + + + + + + + + + + + + +
diff --git a/dms/static/src/js/views/file_list_view.esm.js b/dms/static/src/js/views/file_list_view.esm.js new file mode 100644 index 00000000..e41dadff --- /dev/null +++ b/dms/static/src/js/views/file_list_view.esm.js @@ -0,0 +1,28 @@ +// /** ******************************************************************************** +// Copyright 2020 Creu Blanca +// Copyright 2017-2019 MuK IT GmbH +// Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +// License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +// **********************************************************************************/ + +import { + createFileDropZoneExtension, + createFileUploadExtension, +} from "./dms_file_upload.esm"; +import {FileListRenderer} from "./file_list_renderer.esm"; +import {ListController} from "@web/views/list/list_controller"; +import {listView} from "@web/views/list/list_view"; +import {patch} from "@web/core/utils/patch"; +import {registry} from "@web/core/registry"; + +patch(FileListRenderer.prototype, createFileDropZoneExtension()); +patch(ListController.prototype, createFileUploadExtension()); +FileListRenderer.template = "dms.ListRenderer"; + +export const FileListView = { + ...listView, + buttonTemplate: "dms.ListButtons", + Renderer: FileListRenderer, +}; + +registry.category("views").add("file_list", FileListView); diff --git a/dms/static/src/js/views/search_panel.esm.js b/dms/static/src/js/views/search_panel.esm.js new file mode 100644 index 00000000..d71c743b --- /dev/null +++ b/dms/static/src/js/views/search_panel.esm.js @@ -0,0 +1,27 @@ +/* Copyright 2021-2024 Tecnativa - Víctor Martínez + * Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). + * License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */ + +import {SearchModel} from "@web/search/search_model"; + +export class DMSSearchPanel extends SearchModel { + _getCategoryDomain(excludedCategoryId) { + const domain = super._getCategoryDomain(...arguments); + for (const category of this.categories) { + if (category.id === Number(excludedCategoryId)) { + continue; + } + + // Make sure to filter selected category only for DMS hierarchies, + // not other Odoo models such as product categories + // where child_of could be better than "=" operator + if (category.activeValueId && this.resModel.startsWith("dms")) { + domain.push([category.fieldName, "=", category.activeValueId]); + } + if (domain.length === 0 && this.resModel === "dms.directory") { + domain.push([category.fieldName, "=", false]); + } + } + return domain; + } +} diff --git a/dms/static/src/models/attachment.esm.js b/dms/static/src/models/attachment.esm.js new file mode 100644 index 00000000..6ff6d5bf --- /dev/null +++ b/dms/static/src/models/attachment.esm.js @@ -0,0 +1,87 @@ +// /** ******************************************************************************** +// Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +// License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +// **********************************************************************************/ +import {Attachment} from "@mail/core/common/attachment_model"; +import {patch} from "@web/core/utils/patch"; + +patch(Attachment.prototype, { + _handleImage() { + if (this.model_name && this.model_name === "dms.file") { + return `/web/content?id=${this.id}&field=content&model=dms.file&filename_field=name&download=false`; + } + return `/web/image/${this.id}?signature=${this.checksum}`; + }, + _handlePdf() { + if (this.model_name && this.model_name === "dms.file") { + return ( + "/web/content?id=" + + this.id + + "&field=content&model=dms.file" + + "&filename_field=name" + ); + } + const pdf_lib = `/web/static/lib/pdfjs/web/viewer.html?file=`; + if ( + !this.accessToken && + this.originThread && + this.originThread.model === "mail.channel" + ) { + return `${pdf_lib}/mail/channel/${this.originThread.id}/attachment/${this.id}#pagemode=none`; + } + const accessToken = this.accessToken + ? `?access_token%3D${this.accessToken}` + : ""; + return `${pdf_lib}/web/content/${this.id}${accessToken}#pagemode=none`; + }, + _handleYoutube() { + const urlArr = this.url.split("/"); + let token = urlArr[urlArr.length - 1]; + if (token.includes("watch")) { + token = token.split("v=")[1]; + const amp = token.indexOf("&"); + if (amp !== -1) { + token = token.substring(0, amp); + } + } + return `https://www.youtube.com/embed/${token}`; + }, + get defaultSource() { + if (this.isImage) { + return this._handleImage(); + } + if (this.isPdf) { + return this._handlePdf(); + } + if (this.isUrlYoutube) { + return this._handleYoutube(); + } + if ( + !this.accessToken && + this.originThread && + this.originThread.model === "mail.channel" + ) { + return `/mail/channel/${this.originThread.id}/attachment/${this.id}`; + } + const accessToken = this.accessToken ? `?access_token=${this.accessToken}` : ""; + + if (this.model_name && this.model_name === "dms.file") { + return `/web/content?id=${this.id}&field=content&model=dms.file&filename_field=name`; + } + return `/web/content/${this.id}${accessToken}`; + }, + get downloadUrl() { + if ( + !this.accessToken && + this.originThread && + this.originThread.model === "mail.channel" + ) { + return `/mail/channel/${this.originThread.id}/attachment/${this.id}?download=true`; + } + if (this.model_name && this.model_name === "dms.file") { + return `/web/content?id=${this.id}&field=content&model=dms.file&filename_field=name&download=true`; + } + const accessToken = this.accessToken ? `access_token=${this.accessToken}&` : ""; + return `/web/content/ir.attachment/${this.id}/datas?${accessToken}download=true`; + }, +}); diff --git a/dms/static/src/models/attachment_image.esm.js b/dms/static/src/models/attachment_image.esm.js new file mode 100644 index 00000000..308ea8ea --- /dev/null +++ b/dms/static/src/models/attachment_image.esm.js @@ -0,0 +1,33 @@ +// /** ******************************************************************************** +// Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +// License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +// **********************************************************************************/ +import {LinkPreview} from "@mail/core/common/link_preview"; +import {patch} from "@web/core/utils/patch"; + +patch(LinkPreview, { + get imageUrl() { + return function compute() { + if (!this.attachment) { + return; + } + if ( + !this.attachment.accessToken && + this.attachment.originThread && + this.attachment.originThread.model === "mail.channel" + ) { + return `/mail/channel/${this.attachment.originThread.id}/image/${this.attachment.id}/${this.width}x${this.height}`; + } + const accessToken = this.attachment.accessToken + ? `?access_token=${this.attachment.accessToken}` + : ""; + if ( + this.attachment.model_name && + this.attachment.model_name === "dms.file" + ) { + return `/web/content?id=${this.attachment.id}&field=content&model=dms.file&filename_field=name&download=false`; + } + return `/web/image/${this.attachment.id}/${this.width}x${this.height}${accessToken}`; + }; + }, +}); diff --git a/dms/static/src/models/attachment_viewer_viewable.esm.js b/dms/static/src/models/attachment_viewer_viewable.esm.js new file mode 100644 index 00000000..7c338ed9 --- /dev/null +++ b/dms/static/src/models/attachment_viewer_viewable.esm.js @@ -0,0 +1,30 @@ +// /** ******************************************************************************** +// Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +// License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +// **********************************************************************************/ +import {LinkPreview} from "@mail/core/common/link_preview"; +import {patch} from "@web/core/utils/patch"; + +patch(LinkPreview, { + get imageUrl() { + return function compute() { + if ( + !this.attachmentOwner.accessToken && + this.attachmentOwner.originThread && + this.attachmentOwner.originThread.model === "mail.channel" + ) { + return `/mail/channel/${this.attachmentOwner.originThread.id}/image/${this.attachmentOwner.id}`; + } + const accessToken = this.attachmentOwner.accessToken + ? `?access_token=${this.attachmentOwner.accessToken}` + : ""; + if ( + this.attachmentOwner.model_name && + this.attachmentOwner.model_name === "dms.file" + ) { + return `/web/content?id=${this.attachmentOwner.id}&field=content&model=dms.file&filename_field=name&download=false`; + } + return `/web/image/${this.attachmentOwner.id}${accessToken}`; + }; + }, +}); diff --git a/dms/static/src/scss/portal.scss b/dms/static/src/scss/portal.scss new file mode 100644 index 00000000..870da4be --- /dev/null +++ b/dms/static/src/scss/portal.scss @@ -0,0 +1,12 @@ +/********************************************************************************** +* +* Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +* License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +* +**********************************************************************************/ + +.o_portal_contact_img { + width: 2.3em; + height: 2.3em; + object-fit: cover; +} diff --git a/dms/static/tests/tours/dms_portal_tour.esm.js b/dms/static/tests/tours/dms_portal_tour.esm.js new file mode 100644 index 00000000..3a69629e --- /dev/null +++ b/dms/static/tests/tours/dms_portal_tour.esm.js @@ -0,0 +1,42 @@ +// /** ******************************************************************************** +// Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +// License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +// **********************************************************************************/ +import {registry} from "@web/core/registry"; + +registry.category("web_tour.tours").add("dms_portal_mail_tour", { + url: "/my/dms", + test: true, + steps: () => [ + { + content: "Go to Mails directory", + trigger: ".tr_dms_directory_link:contains('Mails')", + run: "click", + }, + { + content: "Go to Mail_01.eml", + trigger: ".tr_dms_file_link:contains('Mail_01.eml')", + }, + ], +}); + +registry.category("web_tour.tours").add("dms_portal_partners_tour", { + url: "/my/dms", + test: true, + steps: () => [ + { + content: "Go to Partners directory", + trigger: ".tr_dms_directory_link:contains('Partners')", + run: "click", + }, + { + content: "Go to Joel Willis", + trigger: ".tr_dms_directory_link:contains('Joel Willis')", + run: "click", + }, + { + content: "Go to test.txt", + trigger: ".tr_dms_file_link:contains('test.txt')", + }, + ], +}); diff --git a/dms/template/portal.xml b/dms/template/portal.xml new file mode 100644 index 00000000..348a7d6d --- /dev/null +++ b/dms/template/portal.xml @@ -0,0 +1,139 @@ + + + + + + + diff --git a/dms/test/audio01.wav b/dms/test/audio01.wav new file mode 100644 index 00000000..2a479fc1 Binary files /dev/null and b/dms/test/audio01.wav differ diff --git a/dms/test/audio02.wav b/dms/test/audio02.wav new file mode 100644 index 00000000..179a8d3a Binary files /dev/null and b/dms/test/audio02.wav differ diff --git a/dms/test/audio03.mp3 b/dms/test/audio03.mp3 new file mode 100644 index 00000000..397abc2e Binary files /dev/null and b/dms/test/audio03.mp3 differ diff --git a/dms/test/audio04.mp3 b/dms/test/audio04.mp3 new file mode 100644 index 00000000..4667276e Binary files /dev/null and b/dms/test/audio04.mp3 differ diff --git a/dms/test/code01.aj b/dms/test/code01.aj new file mode 100644 index 00000000..bcbd327c --- /dev/null +++ b/dms/test/code01.aj @@ -0,0 +1,10 @@ +// HelloWorld.java +public class HelloWorld { + public static void say(String message) { + System.out.println(message); + } + + public static void sayToPerson(String message, String name) { + System.out.println(name + ", " + message); + } +} diff --git a/dms/test/code02.sh b/dms/test/code02.sh new file mode 100644 index 00000000..35d52ff5 --- /dev/null +++ b/dms/test/code02.sh @@ -0,0 +1,9 @@ +#!/bin/bash +## +## +## Copyright 2017-2019 MuK IT GmbH +## License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +## +## +STR="Hello World!" +echo $STR diff --git a/dms/test/code03.c b/dms/test/code03.c new file mode 100644 index 00000000..36c03ec2 --- /dev/null +++ b/dms/test/code03.c @@ -0,0 +1,12 @@ +/* + * + * Copyright 2017-2019 MuK IT GmbH + * License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + * + */ +#include + +int main(void) +{ + printf("hello, world\n"); +} diff --git a/dms/test/code04.cc b/dms/test/code04.cc new file mode 100644 index 00000000..0b030629 --- /dev/null +++ b/dms/test/code04.cc @@ -0,0 +1,13 @@ +/* + * + * Copyright 2017-2019 MuK IT GmbH + * License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + * + */ +#include + +int main() +{ + std::cout << "Hello, world!\n"; + return 0; +} diff --git a/dms/test/code05.cs b/dms/test/code05.cs new file mode 100644 index 00000000..8d94d8de --- /dev/null +++ b/dms/test/code05.cs @@ -0,0 +1,13 @@ +// +// Copyright 2017-2019 MuK IT GmbH +// License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +// +using System; + +class Program +{ + static void Main(string[] args) + { + Console.WriteLine("Hello, world!"); + } +} diff --git a/dms/test/code06.cbl b/dms/test/code06.cbl new file mode 100644 index 00000000..b89e22a9 --- /dev/null +++ b/dms/test/code06.cbl @@ -0,0 +1,5 @@ +IDENTIFICATION DIVISION. +PROGRAM-ID. hello-world. +PROCEDURE DIVISION. + DISPLAY "Hello, world!" + . diff --git a/dms/test/code07.coffee b/dms/test/code07.coffee new file mode 100644 index 00000000..4b65a573 --- /dev/null +++ b/dms/test/code07.coffee @@ -0,0 +1 @@ +console.log "Hello, World!" diff --git a/dms/test/code08.f b/dms/test/code08.f new file mode 100644 index 00000000..bd3dfb11 --- /dev/null +++ b/dms/test/code08.f @@ -0,0 +1,3 @@ +program helloworld + print *, "Hello world!" +end program helloworld diff --git a/dms/test/code09.go b/dms/test/code09.go new file mode 100644 index 00000000..64e44c3e --- /dev/null +++ b/dms/test/code09.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main() { + fmt.Println("Hello, World") +} diff --git a/dms/test/code10.groovy b/dms/test/code10.groovy new file mode 100644 index 00000000..f821e94d --- /dev/null +++ b/dms/test/code10.groovy @@ -0,0 +1,7 @@ +/********************************************************************************** +* +* Copyright 2017-2019 MuK IT GmbH +* License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +* +**********************************************************************************/ +println "Hello World" diff --git a/dms/test/code11.java b/dms/test/code11.java new file mode 100644 index 00000000..8678ee37 --- /dev/null +++ b/dms/test/code11.java @@ -0,0 +1,11 @@ +/********************************************************************************** +* +* Copyright 2017-2019 MuK IT GmbH +* License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +* +**********************************************************************************/ +class HelloWorldApp { + public static void main(String[] args) { + System.out.println("Hello World!"); // Prints the string to the console. + } +} diff --git a/dms/test/code12.sc b/dms/test/code12.sc new file mode 100644 index 00000000..133c2b06 --- /dev/null +++ b/dms/test/code12.sc @@ -0,0 +1,3 @@ +object HelloWorld extends App { + println("Hello, World!") + } diff --git a/dms/test/document01.pdf b/dms/test/document01.pdf new file mode 100644 index 00000000..99d31cef Binary files /dev/null and b/dms/test/document01.pdf differ diff --git a/dms/test/document02.doc b/dms/test/document02.doc new file mode 100644 index 00000000..9cb3f019 Binary files /dev/null and b/dms/test/document02.doc differ diff --git a/dms/test/document03.odt b/dms/test/document03.odt new file mode 100644 index 00000000..c963be92 Binary files /dev/null and b/dms/test/document03.odt differ diff --git a/dms/test/document04.rtf b/dms/test/document04.rtf new file mode 100644 index 00000000..2379b195 --- /dev/null +++ b/dms/test/document04.rtf @@ -0,0 +1,23 @@ +{\rtf1\ansi\ansicpg1252\uc1 \deff0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} +{\f73\froman\fcharset238\fprq2 Times New Roman CE;}{\f74\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f76\froman\fcharset161\fprq2 Times New Roman Greek;}{\f77\froman\fcharset162\fprq2 Times New Roman Tur;} +{\f78\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f79\froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f80\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f81\fswiss\fcharset238\fprq2 Arial CE;}{\f82\fswiss\fcharset204\fprq2 Arial Cyr;} +{\f84\fswiss\fcharset161\fprq2 Arial Greek;}{\f85\fswiss\fcharset162\fprq2 Arial Tur;}{\f86\fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f87\fswiss\fcharset178\fprq2 Arial (Arabic);}{\f88\fswiss\fcharset186\fprq2 Arial Baltic;}} +{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0; +\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red51\green102\blue255;}{\stylesheet{\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\fs24\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \snext0 Normal;}{\s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \b\f1\fs32\lang2057\langfe1033\kerning32\cgrid\langnp2057\langfenp1033 +\sbasedon0 \snext0 heading 1;}{\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \b\f1\fs26\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext0 heading 3;}{\*\cs10 \additive +Default Paragraph Font;}}{\info{\title The power of technology lies in the ability to match learning styles to the needs of individual learners}{\author Les Mason}{\operator Les Mason}{\creatim\yr2005\mo3\dy15\hr18\min11} +{\revtim\yr2005\mo3\dy15\hr18\min12}{\version1}{\edmins1}{\nofpages1}{\nofwords0}{\nofchars0}{\nofcharsws0}{\vern8203}}\paperw11906\paperh16838 \widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin +\dghspace180\dgvspace180\dghorigin1800\dgvorigin1440\dghshow1\dgvshow1\jexpand\viewkind1\viewscale117\viewzk2\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule \fet0\sectd +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang +{\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7 +\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}\pard\plain +\s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \b\f1\fs32\lang2057\langfe1033\kerning32\cgrid\langnp2057\langfenp1033 { +The power of technology lies in the ability to match learning styles to the needs of individual learners +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 { +\par }\pard\plain \s3\ql \li720\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin720\itap0 \b\f1\fs26\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cf17 The more I study the more I l}{\cf17 earn. +\par The more I learn the more I know +\par The more I know the more I forget +\par The more I forget the less I know +\par So why study?}{ +\par }} diff --git a/dms/test/image01.jpg b/dms/test/image01.jpg new file mode 100644 index 00000000..586ceb89 Binary files /dev/null and b/dms/test/image01.jpg differ diff --git a/dms/test/image02.jpg b/dms/test/image02.jpg new file mode 100644 index 00000000..7467c6f6 Binary files /dev/null and b/dms/test/image02.jpg differ diff --git a/dms/test/image03.jpg b/dms/test/image03.jpg new file mode 100644 index 00000000..a35fc1ae Binary files /dev/null and b/dms/test/image03.jpg differ diff --git a/dms/test/image04.jpg b/dms/test/image04.jpg new file mode 100644 index 00000000..25a3abe2 Binary files /dev/null and b/dms/test/image04.jpg differ diff --git a/dms/test/mail01.eml b/dms/test/mail01.eml new file mode 100644 index 00000000..1a70357f --- /dev/null +++ b/dms/test/mail01.eml @@ -0,0 +1,170 @@ +Return-Path: +To: Manuel Lemos +Subject: Testing Manuel Lemos' MIME E-mail composing and sending PHP class: HTML message +From: mlemos +Reply-To: mlemos +Sender: mlemos@acm.org +X-Mailer: http://www.phpclasses.org/mimemessage $Revision: 1.63 $ (mail) +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary="652b8c4dcb00cdcdda1e16af36781caf" +Message-ID: <20050430192829.0489.mlemos@acm.org> +Date: Sat, 30 Apr 2005 19:28:29 -0300 + + +--652b8c4dcb00cdcdda1e16af36781caf +Content-Type: multipart/related; boundary="6a82fb459dcaacd40ab3404529e808dc" + + +--6a82fb459dcaacd40ab3404529e808dc +Content-Type: multipart/alternative; boundary="69c1683a3ee16ef7cf16edd700694a2f" + + +--69c1683a3ee16ef7cf16edd700694a2f +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: quoted-printable + +This is an HTML message. Please use an HTML capable mail program to read +this message. + +--69c1683a3ee16ef7cf16edd700694a2f +Content-Type: text/html; charset=ISO-8859-1 +Content-Transfer-Encoding: quoted-printable + + + +Testing Manuel Lemos' MIME E-mail composing and sending PHP class: H= +TML message + + + + + + + +
+

Testing Manuel Lemos' MIME E-mail composing and sending PHP cla= +ss: HTML message

+
+

Hello Manuel,

+This message is just to let you know that the MIME E-mail message composing and sending PHP class is working as expected.

+

Here is an image embedded in a message as a separate part:

= +
+
Than= +k you,
+mlemos

+
+ + +--69c1683a3ee16ef7cf16edd700694a2f-- + +--6a82fb459dcaacd40ab3404529e808dc +Content-Type: image/gif; name="logo.gif" +Content-Transfer-Encoding: base64 +Content-Disposition: inline; filename="logo.gif" +Content-ID: + +R0lGODlhlgAjAPMJAAAAAAAA/y8vLz8/P19fX19f339/f4+Pj4+Pz7+/v/////////////////// +/////yH5BAEAAAkALAAAAACWACMAQwT+MMlJq7046827/2AoHYChGAChAkBylgKgKClFyEl6xDMg +qLFBj3C5uXKplVAxIOxkA8BhdFCpDlMK1urMTrZWbAV8tVS5YsxtxmZHBVOSCcW9zaXyNhslVcto +RBp5NQYxLAYGLi8oSwoJBlE+BiSNj5E/PDQsmy4pAJWQLAKJY5+hXhZ2dDYldFWtNSFPiXssXnZR +k5+1pjpBiDMJUXG/Jo7DI4eKfMSmxsJ9GAUB1NXW19jZ2tvc3d7f4OHi2AgZN5vom1kk6F7s6u/p +m3Ab7AOIiCxOyZuBIv8AOeTJIaYQjiR/kKTr5GQNE3pYSjCJ9mUXClRUsLxaZGciC0X+OlpoOuQo +ZKdNJnIoKfnxRUQh6FLG0iLxIoYnJd0JEKISJyAQDodp3EUDC48oDnUY7HFI3wEDRjzycQJVZCQT +Ol7NK+G0qgtkAcOKHUu2rNmzYTVqRMt2bB49bHompSchqg6HcGeANSMxr8sEa2y2HexnSEUTuWri +SSbkYh7BgGVAnhB1b2REibESYaRoBgqIMYx59tFM9AvQffVG49P5NMZkMlHKhJPJb0knmSKZ6kSX +JtbeF3Am7ocok6c7cM7pU5xcXiJJETUz16qPrzEfaFgZpvzn7h86YV5r/1mxXeAUMVyEIpnVUGpN +RlG2ka9b3lP3pm2l6u7P+l/YLj3+RlEHbz1C0kRxSITQaAcilVBMEzmkkEQO8oSOBNg9SN+AX6hV +z1pjgJiAhwCRsY8ZIp6xj1ruqCgeGeKNGEZwLnIwzTg45qjjjjz2GEA5hAUp5JBEFmnkkSCoWEcZ +X8yohZNK1pFGPQS4hx0qNSLJlk9wCQORYu5QiMd7bUzGVyNlRiOHSlpuKdGEItHQ3HZ18beRRyws +YSY/waDTiHf/tWlWUBAJiMJ1/Z0XXU7N0FnREpKM4NChCgbyRDq9XYpOplaKopN9NMkDnBbG+UMC +QwLWIeaiglES6AjGARcPHCWoVAiatcTnGTABZoLPaPG1phccPv366mEvWEFSLnj+2QaonECwcJt/ +e1Zw3lJvVMmftBdVNQS3UngLCA85YHIQOy6JO9N4eZW7KJwtOUZmGwOMWqejwVW6RQzaikRHX3yI +osKhDAq8wmnKSmdMwNidSOof9ZG2DoV0RfTVmLFtGmNk+CoZna0HQnPHS3AhRbIeDpqmR09E0bsu +soeaw994z+rwQVInvqLenBftYjLOVphLFHhV9qsnez8AEUbQRgO737AxChjmyANxuEFHSGi7hFCV +4jxLst2N8sRJYU+SHiAKjlmCgz2IffbLI5aaQR71hnkxq1ZfHSfKata6YDCJDMAQwY7wOgzhjxgj +VFQnKB5uX4mr9qJ79pann+VcfcSzsSCd2mw5scqRRvlQ6TgcUelYhu75iPE4JejrsJOFQAG01277 +7bjnrvvuvPfu++/ABy887hfc6OPxyCevPDdAVoDA89BHL/301Fdv/fXYZ6/99tx3Pz0FEQAAOw== + +--6a82fb459dcaacd40ab3404529e808dc +Content-Type: image/gif; name="background.gif" +Content-Transfer-Encoding: base64 +Content-Disposition: inline; filename="background.gif" +Content-ID: <4c837ed463ad29c820668e835a270e8a.gif> + +R0lGODlh+wHCAPMAAKPFzKLEy6HDyqHCyaDByJ/Ax56/xp2+xZ28xJy7w5u6wpq5wZm4wJm3v5i2 +vpe1vSwAAAAA+wHCAEME/hDISau9OOvNu/9gKI5kaZ5oqq5s675wLM90bd94ru987//AoHBILBqP +yKRyyWw6n9CodEqtWq+gwSHReHgfjobY8X00FIc019tIHAYS7dqcQCDm3vC4fD4QAhUBBFsMZF8O +hnkLCAYFW11tb1iTlJWWOXJdZZtmC24Eg3hgYntfbXainJ2fgBSZbG5wFAG0E6+RoAZ3CbwJCgya +p3cMbAyevQcFAgMGCcRmxr1uyszOxQq+wF4MdcPFx7zJApfk5eYhr3SSGemRsu3dc+4iAqELhZwO +0X6hkHUHCBRoGtUg0RkEAAUeKhhGAcICBQIODIPooIEBzCTmKcjGYSNd/go3VvQo65zJkyhTqlzJ +sqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CXBhhAwECaq1gPNCIwANDU +qmkMcG311apWULmyZt3alcPXAma1FgAlgCxVq2LbRt3LF0Y7hwWoEjLEDZUmff8AOjMkTB5gwYu3 +JbhIQUDEZw+4+aE1aNc0R2vcDYjoDBgpBoUDj95yzzRqbH7qgW4t5vUnAfVAoj7NwOOf1QloN7Ad +u1Xf41b+IlCNsa6rR7DWwTPccTnG5sYvCEKwgPGiZI64A9OsK/Q/BM/0YfuFz13VOwsULLhHps+f +98Hl0zeDRk0X9Qih/vLPWPjFN197aPyB3IJVBLDMdc5t4OB1A0QowYQQ0vIgdilgyGEgG1roYV0j +GufhhyBSWGF2s2yIYosqWsjgjDTWaOONOOao44489ujjj0AGKeSQRBZp5JFIJqnkkkw26eSTUMJU +llpYseXVXWGNdSGWZ6EVF5VWukUVXFdtRUCEU+bFYpRslqNcYKHgk1k8hxWWxjCM0VkdnINJRtkE +lqH3hWZ/CKJYOBBBJxppu/FWh2qzNUrcmQRE6lpvt+UWUKPD9cbIb5bWhmlxbbL5JoUywiMddHRQ +x591GWqwXXdsfJeoeMO5UZ4/AaaHKXv1xVKgfghuNuyB9fUHHYAA/u2CEIHlGbiffWuWyuSJMmKA +bXbbbtuhi9kCUOIEJY57oYsraoduuOfGWO2J6Vor77z01mvvvfjmq+++/Pbr778AByzwwAQXbPDB +CCfcZDobldLRVfLEEgerjQ1EEEemJMiioZEdkggYizSiqMQKl5wCw6qswg+rDTvc6h0Wq9KAJ5tV +oGpJF9YysXn8lCfNL8HE88xw4EyzTDNDR4MMNUhfk40mhXkDTdHimHzjzRpgDcB0MEeHswf1sCZn +GfrQDMrIAYZEkEEOJTQRQweBp5FIDTGCEUiHYWwRXHOPMpLdVgcu+OCEF2744YgnrvjijDfu+OOQ +Ry755JRXbvnl/phnrvnmnHfu+eegZ57RAqSUzptv75E+M+Bb66L6InZwZ7rpr31aLQBhb2pap548 +e7TsIX8dOr/pIIZQQphFHfGqEbtq/J2/DDrZ13Ga0jt8h/XX9TxvfRmmuPVUatb34INCplxakjtm +XOQ7aP74c+k1fE4MD7fefvxBbLEeLldsyq/4o9ZzHOOHylBFS7f4RJxQMx/8MeB4ggIDA02ziLno +wlfGoOByKnUAhZQNWfkzwAXzMEExVFB+86NJ/TDVC4SIZRzFs5Ni5OQ/p7XwLOOwQDXSswgFiYuD +Z4GMP8AjtvGgJk9aYU2davdCeyzRU2LpBwkb2KjvWCU4T/TN/u1S+BKtYUBrXFue8DYQKFoVAzXa +eJh/XiYPpZEOFhAMTnzkk8aQWQU+c7yHJkIGkGd4SkDhMJ9i5qMAOu4RAWfiYk1yxwvfaYCRA8oh +JF14x0bGhgSyaZY07JCMRDLyWWnxTOyc1UmweMaSL5zSKf/xQgnk5lA3TCWWVunCRCrylrjMpS53 +ycte+vKXwAymMIdJzGIa85jITKYyl8nMZjrzmdCMpjSnSc1qWvOa2MymvkY3u9IxMReyW92fuLm6 +2Kmum53SIgZyxx7e9C423AyeNnkUw8RsSnqumsfWKKYnCdozen6iHiGsF483gkF7PIND96oUP7KE +73zteyj8/tK3JfGVqaHkkmhYMDrPJqzwfjRUlij4hzE4ds1pdGSMxgYYjAQZEBRtSeDKSmMMEGYG +ghjU4+osGEF9ZNCEG3SEB2s6LTSIsKcl3CkKO2qEj24Sh/ucw/NmmCdXQQMbsbSlzZoGMkSSBYh5 +kWIkEhWc3aARiVc0qE+hSCklkvCbUpQgFTWYRCy+la1bZGoQvHgBMPIznyT7QBkNgsY05m+NNSQa +Lwx6ijvJsZB69IIdB5nHOjKij9twCCAVGJ7HGlKyiMyhXo0wyUtmoLS2LK0ID+XIEWRys5ycyzg+ +yQ9TtjB2lpyLbZ8qy91mVZK+ReWZVCkNVmp1tMhNrnKX/svc5jr3udCNrnSnS93qWve62M2udrfL +3e5697vgDa94x0ve8pr3vOhNr3rXy972uve98I2vfOdLXxrBS0Uv8lZGUaUh/OKXXRmAV7jMVV+X +QLK4vD0TaoHLWq1UEsEJFu0FXknLh3iyM5EssEtQlrK98ZN5QbNqyl71pwqEza752MfZEqrhljg1 +pYMKkBh3FuKTXtUX+LupMkwcETNCA40D6QNiA3tfdunXAkdOEX+1Ba68tjiqLbVOnKp60oNAam6J +fcyUvTYLAnDHOw8Jjx7Js71YTKWzxX1IV76iyayuWTCwDSIgKJxmqLI5zmp6sg5ZNdV7bkPGQWYh +0EzR/s8+A1THEt6hIrx6IbByRawKHKjfpEfExVREpUEdzKX3dJe5UaQ6UdT0p18VGCfPF2X8S4QD +QgaamI24hi1TtTxZyuVZ6AzK6gBnIbE66DmhImlzxAYouUq0XQ+oUhG039P+rAZgG7u1erYFyy6W +Tt85ddkmHak3PWVaWuePAC9F4Mh6dgdjB/A8tCqbscUxWLmumxp8jsa5A5RuY7xbwtHGtT+Phz69 +nGo0WC60DPt9u0AljxWG8kylh9hsRKw1jbiwx24cDsUKSRwYFPdIq2347NoWkSEAKnG++brnGes7 +sYH1QPVqVdDsOZZXUlN2WYO1soCA9JBoScjNQdvs/n3fKXaxYefOH9BDfD+Z5Db78Dv+WuWUd4Bj +YwPDx1bNiI03BoO7yRi9CzJBBLlQdj5tTbKIOFQqikHjruN6Bovlw5GnXZxjtMXbZ01O2NnhdawL +ASOFw8BIxpOSuutUYWfmBjW0U1S+gczhqy0Wzuhmd7Ur5RYW/01Tz3dKcpYVl/Isrs2jBSyZJ4H7 +LIq+4VYUL2NZaCMgQiY1LXSjFH09wWexvovGvvawX2q+d8/73vv+98APvvCHT/ziG//4yE++8pfP +/OY7//nQj770p0/96lv/+tjPvva3z/3ue//74A+/+MdP/vKb//zoT7/6e3Lf/3KryTDKUPvdBQIB +/q+JwOuPwYEhbFzcYDjDuPN/lARL/FdLRlcZwdUNnTRbGAZt+fcCHCYzGqd0NJZtrsYJFjFGJ2ZQ +m1A2kcZiD+gXLKNsMMZsTQdiFvg/IJUID7RjldFjhAVkGaM/6lASRfYu8KcuS6aDO4hkOfh7p7Jl +bBRlVxYSWSZlfVKDXfZltRJmADFmulJmb3BmBJhbb9YZp1RLV9hmwtUWdBZhnYeFCaZ7Rxdv/5Q8 +gKaCvNBrQ0hCZxhjLhgHXEV1PiQIjhBEkDZT6VFSmkFWhbBppMZBljZqVtZpIUGIqCNqevMYlhdf +qEYKslZ10zZibbgQDkN1IndyTkcLxiFTulZI/muYRsrjbKA4bNYwNR1nPsn2K6J4PKdYbKXYbSM3 +bSQVeWdybWwIa9Rmi0b3FwUEKAcUU+MGTr4AivP2hGSgbqDIbjDobssIb1IlbzSEbslob894gGUY +jYkxeyf3GABnhAK3jeTDYxE0J5uRcEtjdYUnaoMXHStGGxlnNxs4cYgARRt3Y8UobB5XVhhXjyTR +e0jnbfoURkGzDh+wcquACmqFUDD3iiw0LZFmczhmWTknkZ9FdK5IDH0GdArWGaB4kUXHewEpbSZH +kLX2AVA3dVPHamgjNQ8XZG0Ddl2XLF9HOmF3RPmTKGV3IGdXdWl3k2zXiPBVd3nXV3PHOkRpgk5A +lYlgg2F8Fw3WlnZW9HiCB2Q0Y3ic8k2Kl5V4JQhUiXgWFgqUh1e9h3mcpy2epxdm+XnjQ1EiMHoQ +pVtogiWuV3urBxGod4Xnw41huJfjKHvtg3t8GYKEWZiGeZiImZiKuZiM2ZiO+ZiQGZmSOZmUWZmW +eZmYmZmauZmc2ZlCEQEAOw== + +--6a82fb459dcaacd40ab3404529e808dc-- + +--652b8c4dcb00cdcdda1e16af36781caf +Content-Type: text/plain; name="attachment.txt" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="attachment.txt" + +VGhpcyBpcyBqdXN0IGEgcGxhaW4gdGV4dCBhdHRhY2htZW50IGZpbGUgbmFtZWQgYXR0YWNobWVu +dC50eHQgLg== + +--652b8c4dcb00cdcdda1e16af36781caf-- diff --git a/dms/test/mail02.eml b/dms/test/mail02.eml new file mode 100644 index 00000000..1427cfae --- /dev/null +++ b/dms/test/mail02.eml @@ -0,0 +1,44 @@ +MIME-Version: 1.0 +Received: by 10.220.191.194 with HTTP; Wed, 11 May 2011 12:27:12 -0700 (PDT) +Date: Wed, 11 May 2011 13:27:12 -0600 +Delivered-To: jncjkq@gmail.com +Message-ID: +Subject: Test +From: Bill Jncjkq +To: bookmarks@jncjkq.net +Content-Type: multipart/mixed; boundary=bcaec54eecc63acce904a3050f79 + +--bcaec54eecc63acce904a3050f79 +Content-Type: multipart/alternative; boundary=bcaec54eecc63acce604a3050f77 + +--bcaec54eecc63acce604a3050f77 +Content-Type: text/plain; charset=ISO-8859-1 + +-- +Bill Jncjkq + +--bcaec54eecc63acce604a3050f77 +Content-Type: text/html; charset=ISO-8859-1 + +
--
Bill Jncjkq
+ +--bcaec54eecc63acce604a3050f77-- +--bcaec54eecc63acce904a3050f79 +Content-Type: text/html; charset=US-ASCII; name="bookmarks-really-short.html" +Content-Disposition: attachment; filename="bookmarks-really-short.html" +Content-Transfer-Encoding: base64 +X-Attachment-Id: f_gnknv6u70 + +PCFET0NUWVBFIE5FVFNDQVBFLUJvb2ttYXJrLWZpbGUtMT4KCTxIVE1MPgoJPE1FVEEgSFRUUC1F +UVVJVj0iQ29udGVudC1UeXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgoJ +PFRpdGxlPkJvb2ttYXJrczwvVGl0bGU+Cgk8SDE+Qm9va21hcmtzPC9IMT4KCQk8RFQ+PEgzIEZP +TERFRD5UZWNoIE5ld3M8L0gzPgoJCTxETD48cD4KCQkJPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cu +Y25ldC5jb20vIj5DTmV0PC9BPgoJCQk8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy53aXJlZC5jb20v +Ij5XaXJlZCBOZXdzPC9BPgoJCTwvREw+PHA+CgkJPERUPjxIMyBGT0xERUQ+VG9vbHMgYW5kIFJl +ZmVyZW5jZTwvSDM+CgkJPERMPjxwPgoJCQk8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5tb25zdGVy +LmNvbS8iPk1vbnN0ZXIuY29tPC9BPgoJCQk8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy53ZWJtZC5j +b20vIj5XZWJNRDwvQT4KCQk8L0RMPjxwPgoJCTxEVD48SDMgRk9MREVEPlRyYXZlbDwvSDM+CgkJ +PERMPjxwPgoJCQk8RFQ+PEEgSFJFRj0iaHR0cDovL2ZvZG9ycy5jb20vIj5Gb2RvcnM8L0E+CgkJ +CTxEVD48QSBIUkVGPSJodHRwOi8vd3d3LnRyYXZlbG9jaXR5LmNvbS8iPlRyYXZlbG9jaXR5PC9B +PgoJCTwvREw+PHA+Cgk8L0RMPjxwPgo8L0hUTUw+ +--bcaec54eecc63acce904a3050f79-- diff --git a/dms/test/markdown.md b/dms/test/markdown.md new file mode 100644 index 00000000..721d2b1a --- /dev/null +++ b/dms/test/markdown.md @@ -0,0 +1,138 @@ +# An h1 header + +Paragraphs are separated by a blank line. + +2nd paragraph. _Italic_, **bold**, and `monospace`. Itemized lists look like: + +- this one +- that one +- the other one + +Note that --- not considering the asterisk --- the actual text content starts at +4-columns in. + +> Block quotes are written like so. +> +> They can span multiple paragraphs, if you like. + +Use 3 dashes for an em-dash. Use 2 dashes for ranges (ex., "it's all in chapters +12--14"). Three dots ... will be converted to an ellipsis. Unicode is supported. + +## An h2 header + +Here's a numbered list: + +1. first item +2. second item +3. third item + +Note again how the actual text starts at 4 columns in (4 characters from the left side). +Here's a code sample: + + # Let me re-iterate ... + for i in 1 .. 10 { do-something(i) } + +As you probably guessed, indented 4 spaces. By the way, instead of indenting the block, +you can use delimited blocks, if you like: + +``` +define foobar() { + print "Welcome to flavor country!"; +} +``` + +(which makes copying & pasting easier). You can optionally mark the delimited block for +Pandoc to syntax highlight it: + +```python +import time +# Quick, count to ten! +for i in range(10): + # (but not *too* quick) + time.sleep(0.5) + print i +``` + +### An h3 header + +Now a nested list: + +1. First, get these ingredients: + + - carrots + - celery + - lentils + +2. Boil some water. + +3. Dump everything in the pot and follow this algorithm: + + find wooden spoon + uncover pot + stir + cover pot + balance wooden spoon precariously on pot handle + wait 10 minutes + goto first step (or shut off burner when done) + + Do not bump wooden spoon or it will fall. + +Notice again how text always lines up on 4-space indents (including that last line which +continues item 3 above). + +Here's a link to [a website](http://foo.bar), to a [local doc](local-doc.html), and to a +[section heading in the current doc](#an-h2-header). Here's a footnote [^1]. + +[^1]: Footnote text goes here. + +Tables can look like this: + +size material color + +--- + +9 leather brown 10 hemp canvas natural 11 glass transparent + +Table: Shoes, their sizes, and what they're made of + +(The above is the caption for the table.) Pandoc also supports multi-line tables: + +--- + +keyword text + +--- + +red Sunsets, apples, and other red or reddish things. + +green Leaves, grass, frogs and other things it's not easy being. + +--- + +A horizontal rule follows. + +--- + +Here's a definition list: + +apples : Good for making applesauce. oranges : Citrus! tomatoes : There's no "e" in +tomatoe. + +Again, text is indented 4 spaces. (Put a blank line between each term/definition pair to +spread things out more.) + +Here's a "line block": + +| Line one | Line too | Line tree + +and images can be specified like so: + +![example image](example-image.jpg "An exemplary image") + +Inline math equations go in like so: $\omega = d\phi / dt$. Display math should get its +own line and be put in in double-dollarsigns: + +$$I = \int \rho R^{2} dV$$ + +And note that you can backslash-escape any punctuation characters which you wish to be +displayed literally, ex.: \`foo\`, \*bar\*, etc. diff --git a/dms/test/sheet01.xls b/dms/test/sheet01.xls new file mode 100644 index 00000000..795ff7c4 Binary files /dev/null and b/dms/test/sheet01.xls differ diff --git a/dms/test/sheet02.csv b/dms/test/sheet02.csv new file mode 100644 index 00000000..f9cf3866 --- /dev/null +++ b/dms/test/sheet02.csv @@ -0,0 +1,100 @@ +1,"Eldon Base for stackable storage shelf, platinum",Muhammed MacIntyre,3,-213.25,38.94,35,Nunavut,Storage & Organization,0.8 +2,"1.7 Cubic Foot Compact ""Cube"" Office Refrigerators",Barry French,293,457.81,208.16,68.02,Nunavut,Appliances,0.58 +3,"Cardinal Slant-D Ring Binder, Heavy Gauge Vinyl",Barry French,293,46.71,8.69,2.99,Nunavut,Binders and Binder Accessories,0.39 +4,R380,Clay Rozendal,483,1198.97,195.99,3.99,Nunavut,Telephones and Communication,0.58 +5,Holmes HEPA Air Purifier,Carlos Soltero,515,30.94,21.78,5.94,Nunavut,Appliances,0.5 +6,G.E. Longer-Life Indoor Recessed Floodlight Bulbs,Carlos Soltero,515,4.43,6.64,4.95,Nunavut,Office Furnishings,0.37 +7,"Angle-D Binders with Locking Rings, Label Holders",Carl Jackson,613,-54.04,7.3,7.72,Nunavut,Binders and Binder Accessories,0.38 +8,"SAFCO Mobile Desk Side File, Wire Frame",Carl Jackson,613,127.70,42.76,6.22,Nunavut,Storage & Organization, +9,"SAFCO Commercial Wire Shelving, Black",Monica Federle,643,-695.26,138.14,35,Nunavut,Storage & Organization, +10,Xerox 198,Dorothy Badders,678,-226.36,4.98,8.33,Nunavut,Paper,0.38 +11,Xerox 1980,Neola Schneider,807,-166.85,4.28,6.18,Nunavut,Paper,0.4 +12,Advantus Map Pennant Flags and Round Head Tacks,Neola Schneider,807,-14.33,3.95,2,Nunavut,Rubber Bands,0.53 +13,Holmes HEPA Air Purifier,Carlos Daly,868,134.72,21.78,5.94,Nunavut,Appliances,0.5 +14,"DS/HD IBM Formatted Diskettes, 200/Pack - Staples",Carlos Daly,868,114.46,47.98,3.61,Nunavut,Computer Peripherals,0.71 +15,"Wilson Jones 1"" Hanging DublLock Ring Binders",Claudia Miner,933,-4.72,5.28,2.99,Nunavut,Binders and Binder Accessories,0.37 +16,Ultra Commercial Grade Dual Valve Door Closer,Neola Schneider,995,782.91,39.89,3.04,Nunavut,Office Furnishings,0.53 +17,"#10-4 1/8"" x 9 1/2"" Premium Diagonal Seam Envelopes",Allen Rosenblatt,998,93.80,15.74,1.39,Nunavut,Envelopes,0.4 +18,Hon 4-Shelf Metal Bookcases,Sylvia Foulston,1154,440.72,100.98,26.22,Nunavut,Bookcases,0.6 +19,"Lesro Sheffield Collection Coffee Table, End Table, Center Table, Corner Table",Sylvia Foulston,1154,-481.04,71.37,69,Nunavut,Tables,0.68 +20,g520,Jim Radford,1344,-11.68,65.99,5.26,Nunavut,Telephones and Communication,0.59 +21,LX 788,Jim Radford,1344,313.58,155.99,8.99,Nunavut,Telephones and Communication,0.58 +22,Avery 52,Carlos Soltero,1412,26.92,3.69,0.5,Nunavut,Labels,0.38 +23,Plymouth Boxed Rubber Bands by Plymouth,Carlos Soltero,1412,-5.77,4.71,0.7,Nunavut,Rubber Bands,0.8 +24,"GBC Pre-Punched Binding Paper, Plastic, White, 8-1/2"" x 11""",Carl Ludwig,1539,-172.88,15.99,13.18,Nunavut,Binders and Binder Accessories,0.37 +25,"Maxell 3.5"" DS/HD IBM-Formatted Diskettes, 10/Pack",Carl Ludwig,1539,-144.55,4.89,4.93,Nunavut,Computer Peripherals,0.66 +26,Newell 335,Don Miller,1540,5.76,2.88,0.7,Nunavut,Pens & Art Supplies,0.56 +27,SANFORD Liquid Accent Tank-Style Highlighters,Annie Cyprus,1702,4.90,2.84,0.93,Nunavut,Pens & Art Supplies,0.54 +28,Canon PC940 Copier,Carl Ludwig,1761,-547.61,449.99,49,Nunavut,Copiers and Fax,0.38 +29,"Tenex Personal Project File with Scoop Front Design, Black",Carlos Soltero,1792,-5.45,13.48,4.51,Nunavut,Storage & Organization,0.59 +30,Col-Erase Pencils with Erasers,Grant Carroll,2275,41.67,6.08,1.17,Nunavut,Pens & Art Supplies,0.56 +31,"Imation 3.5"" DS/HD IBM Formatted Diskettes, 10/Pack",Don Miller,2277,-46.03,5.98,4.38,Nunavut,Computer Peripherals,0.75 +32,"White Dual Perf Computer Printout Paper, 2700 Sheets, 1 Part, Heavyweight, 20 lbs., 14 7/8 x 11",Don Miller,2277,33.67,40.99,19.99,Nunavut,Paper,0.36 +33,Self-Adhesive Address Labels for Typewriters by Universal,Alan Barnes,2532,140.01,7.31,0.49,Nunavut,Labels,0.38 +34,Accessory37,Alan Barnes,2532,-78.96,20.99,2.5,Nunavut,Telephones and Communication,0.81 +35,Fuji 5.2GB DVD-RAM,Jack Garza,2631,252.66,40.96,1.99,Nunavut,Computer Peripherals,0.55 +36,Bevis Steel Folding Chairs,Julia West,2757,-1766.01,95.95,74.35,Nunavut,Chairs & Chairmats,0.57 +37,Avery Binder Labels,Eugene Barchas,2791,-236.27,3.89,7.01,Nunavut,Binders and Binder Accessories,0.37 +38,Hon Every-Day Chair Series Swivel Task Chairs,Eugene Barchas,2791,80.44,120.98,30,Nunavut,Chairs & Chairmats,0.64 +39,"IBM Multi-Purpose Copy Paper, 8 1/2 x 11"", Case",Eugene Barchas,2791,118.94,30.98,5.76,Nunavut,Paper,0.4 +40,Global Troy Executive Leather Low-Back Tilter,Edward Hooks,2976,3424.22,500.98,26,Nunavut,Chairs & Chairmats,0.6 +41,XtraLife ClearVue Slant-D Ring Binders by Cardinal,Brad Eason,3232,-11.83,7.84,4.71,Nunavut,Binders and Binder Accessories,0.35 +42,Computer Printout Paper with Letter-Trim Perforations,Nicole Hansen,3524,52.35,18.97,9.03,Nunavut,Paper,0.37 +43,6160,Dorothy Wardle,3908,-180.20,115.99,2.5,Nunavut,Telephones and Communication,0.57 +44,Avery 49,Aaron Bergman,4132,1.32,2.88,0.5,Nunavut,Labels,0.36 +45,Hoover Portapower Portable Vacuum,Jim Radford,4612,-375.64,4.48,49,Nunavut,Appliances,0.6 +46,Timeport L7089,Annie Cyprus,4676,-104.25,125.99,7.69,Nunavut,Telephones and Communication,0.58 +47,Avery 510,Annie Cyprus,4676,85.96,3.75,0.5,Nunavut,Labels,0.37 +48,Xerox 1881,Annie Cyprus,4676,-8.38,12.28,6.47,Nunavut,Paper,0.38 +49,LX 788,Annie Cyprus,4676,1115.69,155.99,8.99,Nunavut,Telephones and Communication,0.58 +50,"Cardinal Slant-D Ring Binder, Heavy Gauge Vinyl",Annie Cyprus,5284,-3.05,8.69,2.99,Nunavut,Binders and Binder Accessories,0.39 +51,"Memorex 4.7GB DVD-RAM, 3/Pack",Clay Rozendal,5316,514.07,31.78,1.99,Nunavut,Computer Peripherals,0.42 +52,Unpadded Memo Slips,Don Jones,5409,-7.04,3.98,2.97,Nunavut,Paper,0.35 +53,"Adams Telephone Message Book W/Dividers/Space For Phone Numbers, 5 1/4""X8 1/2"", 300/Messages",Beth Thompson,5506,4.41,5.88,3.04,Nunavut,Paper,0.36 +54,"Eldon Expressions Desk Accessory, Wood Pencil Holder, Oak",Frank Price,5569,-0.06,9.65,6.22,Nunavut,Office Furnishings,0.55 +55,Bell Sonecor JB700 Caller ID,Michelle Lonsdale,5607,-50.33,7.99,5.03,Nunavut,Telephones and Communication,0.6 +56,Avery Arch Ring Binders,Ann Chong,5894,87.68,58.1,1.49,Nunavut,Binders and Binder Accessories,0.38 +57,APC 7 Outlet Network SurgeArrest Surge Protector,Ann Chong,5894,-68.22,80.48,4.5,Nunavut,Appliances,0.55 +58,"Deflect-o RollaMat Studded, Beveled Mat for Medium Pile Carpeting",Joy Bell,5925,-354.90,92.23,39.61,Nunavut,Office Furnishings,0.67 +59,Accessory4,Joy Bell,5925,-267.01,85.99,0.99,Nunavut,Telephones and Communication,0.85 +60,Personal Creations Ink Jet Cards and Labels,Skye Norling,6016,3.63,11.48,5.43,Nunavut,Paper,0.36 +61,High Speed Automatic Electric Letter Opener,Barry Weirich,6116,-1759.58,1637.53,24.49,Nunavut,"Scissors, Rulers and Trimmers",0.81 +62,Xerox 1966,Grant Carroll,6182,-116.79,6.48,6.65,Nunavut,Paper,0.36 +63,Xerox 213,Grant Carroll,6182,-67.28,6.48,7.86,Nunavut,Paper,0.37 +64,"Boston Electric Pencil Sharpener, Model 1818, Charcoal Black",Adrian Hane,6535,-19.33,28.15,8.99,Nunavut,Pens & Art Supplies,0.57 +65,Hammermill CopyPlus Copy Paper (20Lb. and 84 Bright),Skye Norling,6884,-61.21,4.98,4.75,Nunavut,Paper,0.36 +66,"Telephone Message Books with Fax/Mobile Section, 5 1/2"" x 3 3/16""",Skye Norling,6884,119.09,6.35,1.02,Nunavut,Paper,0.39 +67,Crate-A-Files,Andrew Gjertsen,6916,-141.27,10.9,7.46,Nunavut,Storage & Organization,0.59 +68,"Angle-D Binders with Locking Rings, Label Holders",Ralph Knight,6980,-77.28,7.3,7.72,Nunavut,Binders and Binder Accessories,0.38 +69,"80 Minute CD-R Spindle, 100/Pack - Staples",Dorothy Wardle,6982,407.44,39.48,1.99,Nunavut,Computer Peripherals,0.54 +70,"Bush Westfield Collection Bookcases, Dark Cherry Finish, Fully Assembled",Dorothy Wardle,6982,-338.27,100.98,57.38,Nunavut,Bookcases,0.78 +71,12-1/2 Diameter Round Wall Clock,Dorothy Wardle,6982,52.56,19.98,10.49,Nunavut,Office Furnishings,0.49 +72,SAFCO Arco Folding Chair,Grant Carroll,7110,1902.24,276.2,24.49,Nunavut,Chairs & Chairmats, +73,"#10 White Business Envelopes,4 1/8 x 9 1/2",Barry Weirich,7430,353.20,15.67,1.39,Nunavut,Envelopes,0.38 +74,3M Office Air Cleaner,Beth Paige,7906,271.78,25.98,5.37,Nunavut,Appliances,0.5 +75,"Global Leather and Oak Executive Chair, Black",Sylvia Foulston,8391,-268.36,300.98,64.73,Nunavut,Chairs & Chairmats,0.56 +76,Xerox 1936,Nicole Hansen,8419,70.39,19.98,5.97,Nunavut,Paper,0.38 +77,Xerox 214,Nicole Hansen,8419,-86.62,6.48,7.03,Nunavut,Paper,0.37 +78,Carina Double Wide Media Storage Towers in Natural & Black,Nicole Hansen,8833,-846.73,80.98,35,Nunavut,Storage & Organization,0.81 +79,Staples General Use 3-Ring Binders,Beth Paige,8995,8.05,1.88,1.49,Nunavut,Binders and Binder Accessories,0.37 +80,Xerox 1904,Beth Paige,8995,-78.02,6.48,5.86,Northwest Territories,Paper,0.36 +81,Luxo Professional Combination Clamp-On Lamps,Beth Paige,8995,737.94,102.3,21.26,Northwest Territories,Office Furnishings,0.59 +82,Xerox 217,Beth Paige,8995,-191.28,6.48,8.19,Northwest Territories,Paper,0.37 +83,Revere Boxed Rubber Bands by Revere,Beth Paige,8995,-21.49,1.89,0.76,Northwest Territories,Rubber Bands,0.83 +84,"Acco Smartsocket Table Surge Protector, 6 Color-Coded Adapter Outlets",Sylvia Foulston,9126,884.08,62.05,3.99,Northwest Territories,Appliances,0.55 +85,"Tennsco Snap-Together Open Shelving Units, Starter Sets and Add-On Units",Bryan Davis,9127,-329.49,279.48,35,Northwest Territories,Storage & Organization,0.8 +86,Hon 4070 Series Pagoda Round Back Stacking Chairs,Joy Bell,9509,2825.15,320.98,58.95,Northwest Territories,Chairs & Chairmats,0.57 +87,Xerox 1887,Joy Bell,9509,2.13,18.97,5.21,Northwest Territories,Paper,0.37 +88,Xerox 1891,Joy Bell,9509,707.15,48.91,5.81,Northwest Territories,Paper,0.38 +89,Avery 506,Alan Barnes,9763,75.13,4.13,0.5,Northwest Territories,Labels,0.39 +90,"Bush Heritage Pine Collection 5-Shelf Bookcase, Albany Pine Finish, *Special Order",Grant Carroll,9927,-270.63,140.98,53.48,Northwest Territories,Bookcases,0.65 +91,"Lifetime Advantage Folding Chairs, 4/Carton",Grant Carroll,9927,3387.35,218.08,18.06,Northwest Territories,Chairs & Chairmats,0.57 +92,Microsoft Natural Multimedia Keyboard,Grant Carroll,9927,-82.16,50.98,6.5,Northwest Territories,Computer Peripherals,0.73 +93,"Staples Wirebound Steno Books, 6"" x 9"", 12/Pack",Delfina Latchford,10022,-3.88,10.14,2.27,Northwest Territories,Paper,0.36 +94,"GBC Pre-Punched Binding Paper, Plastic, White, 8-1/2"" x 11""",Don Jones,10437,-191.22,15.99,13.18,Northwest Territories,Binders and Binder Accessories,0.37 +95,Bevis Boat-Shaped Conference Table,Doug Bickford,10499,31.21,262.11,62.74,Northwest Territories,Tables,0.75 +96,"Linden 12"" Wall Clock With Oak Frame",Doug Bickford,10535,-44.14,33.98,19.99,Northwest Territories,Office Furnishings,0.55 +97,Newell 326,Doug Bickford,10535,-0.79,1.76,0.7,Northwest Territories,Pens & Art Supplies,0.56 +98,Prismacolor Color Pencil Set,Jamie Kunitz,10789,76.42,19.84,4.1,Northwest Territories,Pens & Art Supplies,0.44 +99,Xerox Blank Computer Paper,Anthony Johnson,10791,93.36,19.98,5.77,Northwest Territories,Paper,0.38 +100,600 Series Flip,Ralph Knight,10945,4.22,95.99,8.99,Northwest Territories,Telephones and Communication,0.57 diff --git a/dms/test/sheet03.ods b/dms/test/sheet03.ods new file mode 100644 index 00000000..b0c9c683 Binary files /dev/null and b/dms/test/sheet03.ods differ diff --git a/dms/test/slide01.odp b/dms/test/slide01.odp new file mode 100644 index 00000000..bf8cb46e Binary files /dev/null and b/dms/test/slide01.odp differ diff --git a/dms/test/slide02.ppt b/dms/test/slide02.ppt new file mode 100644 index 00000000..0cd4ac59 Binary files /dev/null and b/dms/test/slide02.ppt differ diff --git a/dms/test/text.rst b/dms/test/text.rst new file mode 100644 index 00000000..da5445c9 --- /dev/null +++ b/dms/test/text.rst @@ -0,0 +1,382 @@ +A ReStructuredText Primer +========================= + +:Author: Richard Jones +:Version: $Revision: 5801 $ +:Copyright: This document has been placed in the public domain. + +.. contents:: + + +The text below **contains** links that look like "(quickref__)". These +are relative links that point to the `Quick reStructuredText`_ user +reference. If these links don't work, please refer to the `master +quick reference`_ document. + +__ +.. _Quick reStructuredText: quickref.html +.. _master quick reference: + http://docutils.sourceforge.net/docs/user/rst/quickref.html + +.. Note:: This document is an informal introduction to + reStructuredText. + + +Structure +--------- + +From the **outset**, let me say that "Structured Text" is probably a bit +of a misnomer. It's more like "Relaxed Text" that uses certain +consistent patterns. These patterns are interpreted by a HTML +converter to produce "Very Structured Text" that can be used by a web +browser. + +The most basic pattern recognised is a **paragraph** (quickref__). +That's a chunk of text that is separated by blank lines (one is +enough). Paragraphs must have the same indentation -- that is, line +up at their left edge. Paragraphs that start indented will result in +indented quote paragraphs. For example:: + + This is a paragraph. It's quite + short. + + This paragraph will result in an indented block of + text, typically used for quoting other text. + + This is another one. + +Results in: + + This is a paragraph. It's quite + short. + + This paragraph will result in an indented block of + text, typically used for quoting other text. + + This is another one. + +__ quickref.html#paragraphs + + +Text styles +----------- + +(quickref__) + +__ quickref.html#inline-markup + +Inside paragraphs and other bodies of text, you may additionally mark +text for *italics* with "``*italics*``" or **bold** with +"``**bold**``". This is called "inline markup". + +If you want something to appear as a fixed-space literal, use +"````double back-quotes````". Note that no further fiddling is done +inside the double back-quotes -- so asterisks "``*``" etc. are left +alone. + +If you find that you want to use one of the "special" characters in +text, it will generally be OK -- reStructuredText is pretty smart. +For example, this lone asterisk * is handled just fine, as is the +asterisk in this equation: 5*6=30. If you actually +want text \*surrounded by asterisks* to **not** be italicised, then +you need to indicate that the asterisk is not special. You do this by +placing a backslash just before it, like so "``\*``" (quickref__), or +by enclosing it in double back-quotes (inline literals), like this:: + + ``*`` + +__ quickref.html#escaping + +.. Tip:: Think of inline markup as a form of (parentheses) and use it + the same way: immediately before and after the text being marked + up. Inline markup by itself (surrounded by whitespace) or in the + middle of a word won't be recognized. See the `markup spec`__ for + full details. + +__ ../../ref/rst/restructuredtext.html#inline-markup + + +Lists +----- + +Lists of items come in three main flavours: **enumerated**, +**bulleted** and **definitions**. In all list cases, you may have as +many paragraphs, sublists, etc. as you want, as long as the left-hand +side of the paragraph or whatever aligns with the first line of text +in the list item. + +Lists must always start a new paragraph -- that is, they must appear +after a blank line. + +**enumerated** lists (numbers, letters or roman numerals; quickref__) + __ quickref.html#enumerated-lists + + Start a line off with a number or letter followed by a period ".", + right bracket ")" or surrounded by brackets "( )" -- whatever you're + comfortable with. All of the following forms are recognised:: + + 1. numbers + + A. upper-case letters + and it goes over many lines + + with two paragraphs and all! + + a. lower-case letters + + 1. with a sub-list starting at a different number + 2. make sure the numbers are in the correct sequence though! + + I. upper-case roman numerals + + i. lower-case roman numerals + + (1) numbers again + + 1) and again + + Results in (note: the different enumerated list styles are not + always supported by every web browser, so you may not get the full + effect here): + + 1. numbers + + A. upper-case letters + and it goes over many lines + + with two paragraphs and all! + + a. lower-case letters + + 1. with a sub-list starting at a different number + 2. make sure the numbers are in the correct sequence though! + + I. upper-case roman numerals + + i. lower-case roman numerals + + (1) numbers again + + 1) and again + +**bulleted** lists (quickref__) + __ quickref.html#bullet-lists + + Just like enumerated lists, start the line off with a bullet point + character - either "-", "+" or "*":: + + * a bullet point using "*" + + - a sub-list using "-" + + + yet another sub-list + + - another item + + Results in: + + * a bullet point using "*" + + - a sub-list using "-" + + + yet another sub-list + + - another item + +**definition** lists (quickref__) + __ quickref.html#definition-lists + + Unlike the other two, the definition lists consist of a term, and + the definition of that term. The format of a definition list is:: + + what + Definition lists associate a term with a definition. + + *how* + The term is a one-line phrase, and the definition is one or more + paragraphs or body elements, indented relative to the term. + Blank lines are not allowed between term and definition. + + Results in: + + what + Definition lists associate a term with a definition. + + *how* + The term is a one-line phrase, and the definition is one or more + paragraphs or body elements, indented relative to the term. + Blank lines are not allowed between term and definition. + + +Preformatting (code samples) +---------------------------- +(quickref__) + +__ quickref.html#literal-blocks + +To just include a chunk of preformatted, never-to-be-fiddled-with +text, finish the prior paragraph with "``::``". The preformatted +block is finished when the text falls back to the same indentation +level as a paragraph prior to the preformatted block. For example:: + + An example:: + + Whitespace, newlines, blank lines, and all kinds of markup + (like *this* or \this) is preserved by literal blocks. + Lookie here, I've dropped an indentation level + (but not far enough) + + no more example + +Results in: + + An example:: + + Whitespace, newlines, blank lines, and all kinds of markup + (like *this* or \this) is preserved by literal blocks. + Lookie here, I've dropped an indentation level + (but not far enough) + + no more example + +Note that if a paragraph consists only of "``::``", then it's removed +from the output:: + + :: + + This is preformatted text, and the + last "::" paragraph is removed + +Results in: + +:: + + This is preformatted text, and the + last "::" paragraph is removed + + +Sections +-------- + +(quickref__) + +__ quickref.html#section-structure + +To break longer text up into sections, you use **section headers**. +These are a single line of text (one or more words) with adornment: an +underline alone, or an underline and an overline together, in dashes +"``-----``", equals "``======``", tildes "``~~~~~~``" or any of the +non-alphanumeric characters ``= - ` : ' " ~ ^ _ * + # < >`` that you +feel comfortable with. An underline-only adornment is distinct from +an overline-and-underline adornment using the same character. The +underline/overline must be at least as long as the title text. Be +consistent, since all sections marked with the same adornment style +are deemed to be at the same level:: + + Chapter 1 Title + =============== + + Section 1.1 Title + ----------------- + + Subsection 1.1.1 Title + ~~~~~~~~~~~~~~~~~~~~~~ + + Section 1.2 Title + ----------------- + + Chapter 2 Title + =============== + +This results in the following structure, illustrated by simplified +pseudo-XML:: + +
+ + Chapter 1 Title + <section> + <title> + Section 1.1 Title + <section> + <title> + Subsection 1.1.1 Title + <section> + <title> + Section 1.2 Title + <section> + <title> + Chapter 2 Title + +(Pseudo-XML uses indentation for nesting and has no end-tags. It's +not possible to show actual processed output, as in the other +examples, because sections cannot exist inside block quotes. For a +concrete example, compare the section structure of this document's +source text and processed output.) + +Note that section headers are available as link targets, just using +their name. To link to the Lists_ heading, I write "``Lists_``". If +the heading has a space in it like `text styles`_, we need to quote +the heading "```text styles`_``". + + +Document Title / Subtitle +````````````````````````` + +The title of the whole document is distinct from section titles and +may be formatted somewhat differently (e.g. the HTML writer by default +shows it as a centered heading). + +To indicate the document title in reStructuredText, use a unique adornment +style at the beginning of the document. To indicate the document subtitle, +use another unique adornment style immediately after the document title. For +example:: + + ================ + Document Title + ================ + ---------- + Subtitle + ---------- + + Section Title + ============= + + ... + +Note that "Document Title" and "Section Title" above both use equals +signs, but are distict and unrelated styles. The text of +overline-and-underlined titles (but not underlined-only) may be inset +for aesthetics. + + +Images +------ + +(quickref__) + +__ quickref.html#directives + +To include an image in your document, you use the the ``image`` directive__. +For example:: + + .. image:: https://picsum.photos/200/300/?random + +results in: + +.. image:: https://picsum.photos/200/300/?random + +The ``images/biohazard.png`` part indicates the filename of the image +you wish to appear in the document. There's no restriction placed on +the image (format, size etc). If the image is to appear in HTML and +you wish to supply additional information, you may:: + + .. image:: images/biohazard.png + :height: 100 + :width: 200 + :scale: 50 + :alt: alternate text + +See the full `image directive documentation`__ for more info. + +__ ../../ref/rst/directives.html +__ ../../ref/rst/directives.html#images diff --git a/dms/test/text.txt b/dms/test/text.txt new file mode 100644 index 00000000..e0f98f53 --- /dev/null +++ b/dms/test/text.txt @@ -0,0 +1,27 @@ +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus condimentum sagittis lacus, laoreet luctus ligula laoreet ut. Vestibulum ullamcorper accumsan velit vel vehicula. Proin tempor lacus arcu. Nunc at elit condimentum, semper nisi et, condimentum mi. In venenatis blandit nibh at sollicitudin. Vestibulum dapibus mauris at orci maximus pellentesque. Nullam id elementum ipsum. Suspendisse cursus lobortis viverra. Proin et erat at mauris tincidunt porttitor vitae ac dui. + +Donec vulputate lorem tortor, nec fermentum nibh bibendum vel. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent dictum luctus massa, non euismod lacus. Pellentesque condimentum dolor est, ut dapibus lectus luctus ac. Ut sagittis commodo arcu. Integer nisi nulla, facilisis sit amet nulla quis, eleifend suscipit purus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam euismod ultrices lorem, sit amet imperdiet est tincidunt vel. Phasellus dictum justo sit amet ligula varius aliquet auctor et metus. Fusce vitae tortor et nisi pulvinar vestibulum eget in risus. Donec ante ex, placerat a lorem eget, ultricies bibendum purus. Nam sit amet neque non ante laoreet rutrum. Nullam aliquet commodo urna, sed ullamcorper odio feugiat id. Mauris nisi sapien, porttitor in condimentum nec, venenatis eu urna. Pellentesque feugiat diam est, at rhoncus orci porttitor non. + +Nulla luctus sem sit amet nisi consequat, id ornare ipsum dignissim. Sed elementum elit nibh, eu condimentum orci viverra quis. Aenean suscipit vitae felis non suscipit. Suspendisse pharetra turpis non eros semper dictum. Etiam tincidunt venenatis venenatis. Praesent eget gravida lorem, ut congue diam. Etiam facilisis elit at porttitor egestas. Praesent consequat, velit non vulputate convallis, ligula diam sagittis urna, in venenatis nisi justo ut mauris. Vestibulum posuere sollicitudin mi, et vulputate nisl fringilla non. Nulla ornare pretium velit a euismod. Nunc sagittis venenatis vestibulum. Nunc sodales libero a est ornare ultricies. Sed sed leo sed orci pellentesque ultrices. Mauris sollicitudin, sem quis placerat ornare, velit arcu convallis ligula, pretium finibus nisl sapien vel sem. Vivamus sit amet tortor id lorem consequat hendrerit. Nullam at dui risus. + +Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed feugiat semper velit consequat facilisis. Etiam facilisis justo non iaculis dictum. Fusce turpis neque, pharetra ut odio eu, hendrerit rhoncus lacus. Nunc orci felis, imperdiet vel interdum quis, porta eu ipsum. Pellentesque dictum sem lacinia, auctor dui in, malesuada nunc. Maecenas sit amet mollis eros. Proin fringilla viverra ligula, sollicitudin viverra ante sollicitudin congue. Donec mollis felis eu libero malesuada, et lacinia risus interdum. + +Etiam vitae accumsan augue. Ut urna orci, malesuada ut nisi a, condimentum gravida magna. Nulla bibendum ex in vulputate sagittis. Nulla facilisi. Nullam faucibus et metus ac consequat. Quisque tempor eros velit, id mattis nibh aliquet a. Aenean tempor elit ut finibus auctor. Sed at imperdiet mauris. Vestibulum pharetra non lacus sed pulvinar. Sed pellentesque magna a eros volutpat ullamcorper. In hac habitasse platea dictumst. Donec ipsum mi, feugiat in eros sed, varius lacinia turpis. Donec vulputate tincidunt dui ac laoreet. Sed in eros dui. Pellentesque placerat tristique ligula eu finibus. Proin nec faucibus felis, eu commodo ipsum. + +Integer eu hendrerit diam, sed consectetur nunc. Aliquam a sem vitae leo fermentum faucibus quis at sem. Etiam blandit, quam quis fermentum varius, ante urna ultricies lectus, vel pellentesque ligula arcu nec elit. Donec placerat ante in enim scelerisque pretium. Donec et rhoncus erat. Aenean tempor nisi vitae augue tincidunt luctus. Nam condimentum dictum ante, et laoreet neque pellentesque id. Curabitur consectetur cursus neque aliquam porta. Ut interdum nunc nec nibh vestibulum, in sagittis metus facilisis. Pellentesque feugiat condimentum metus. Etiam venenatis quam at ante rhoncus vestibulum. Maecenas suscipit congue pellentesque. Vestibulum suscipit scelerisque fermentum. Nulla iaculis risus ac vulputate porttitor. + +Mauris nec metus vel dolor blandit faucibus et vel magna. Ut tincidunt ipsum non nunc dapibus, sed blandit mi condimentum. Quisque pharetra interdum quam nec feugiat. Sed pellentesque nulla et turpis blandit interdum. Curabitur at metus vitae augue elementum viverra. Sed mattis lorem non enim fermentum finibus. Sed at dui in magna dignissim accumsan. Proin tincidunt ultricies cursus. Maecenas tincidunt magna at urna faucibus lacinia. + +Quisque venenatis justo sit amet tortor condimentum, nec tincidunt tellus viverra. Morbi risus ipsum, consequat convallis malesuada non, fermentum non velit. Nulla facilisis orci eget ligula mattis fermentum. Aliquam vel velit ultricies, sollicitudin nibh eu, congue velit. Donec nulla lorem, euismod id cursus at, sollicitudin et arcu. Proin vitae tincidunt ipsum. Vivamus elementum eleifend justo, placerat interdum nulla rutrum id. + +Phasellus fringilla luctus magna, a finibus justo dapibus a. Nam risus felis, rhoncus eget diam sit amet, congue facilisis nibh. Interdum et malesuada fames ac ante ipsum primis in faucibus. Praesent consequat euismod diam, eget volutpat magna convallis at. Mauris placerat pellentesque imperdiet. Nulla porta scelerisque enim, et scelerisque neque bibendum in. Proin eget turpis nisi. Suspendisse ut est a erat egestas eleifend at euismod arcu. Donec aliquet, nisi sed faucibus condimentum, nisi metus dictum eros, nec dignissim justo odio id nulla. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Maecenas sollicitudin, justo id elementum eleifend, justo neque aliquet nibh, finibus malesuada metus erat eget neque. Suspendisse nec auctor orci. Aenean et vestibulum nulla. Nullam hendrerit augue tristique, commodo metus id, sodales lorem. Etiam feugiat dui est, vitae auctor risus convallis non. + +Maecenas turpis enim, consectetur eget lectus eu, hendrerit posuere lacus. Praesent efficitur, felis eget dapibus consectetur, nisi massa dignissim enim, nec semper dolor est eu urna. Nullam ut sodales lorem. Aliquam dapibus faucibus diam. Vestibulum vel magna et dolor gravida imperdiet ut sit amet sem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur elementum metus tincidunt nulla euismod ultricies. Duis elementum nec neque in porttitor. Nulla sagittis lorem elit, et consectetur ante laoreet eu. Maecenas nulla tellus, scelerisque ac erat sed, fermentum dapibus metus. Donec tincidunt fermentum molestie. + +Sed consequat mi at maximus faucibus. Pellentesque aliquet tincidunt sapien vel auctor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Praesent accumsan nunc eget leo aliquam, facilisis hendrerit turpis egestas. Morbi in ultricies mauris, a eleifend turpis. Quisque fringilla massa iaculis risus ultrices, sit amet tincidunt dui varius. Quisque maximus porta tristique. Proin tincidunt, turpis ut tempor pretium, lectus ipsum ullamcorper leo, ac tincidunt felis dui non leo. Aenean porta augue ligula, non consequat ipsum aliquet et. Suspendisse ut suscipit ex. Pellentesque vitae lacinia arcu. Curabitur eget tincidunt nulla, non bibendum metus. Nullam mi ipsum, eleifend vitae tortor pulvinar, facilisis sollicitudin ipsum. + +Vestibulum molestie risus lorem, at feugiat lorem congue sed. Phasellus ullamcorper laoreet enim, nec aliquam turpis scelerisque et. Etiam dictum metus in elit aliquam dapibus. Vivamus vel lectus velit. Nam sed purus luctus, commodo dui quis, malesuada dui. Nulla porttitor aliquet elit sit amet viverra. Proin tempor nulla urna, non aliquet metus maximus quis. Aliquam ac lectus nec mi aliquam sagittis. Quisque venenatis quam eget nisl tempor, egestas rutrum eros eleifend. Nullam venenatis commodo velit, non tempor mauris fermentum ut. In a metus quis erat cursus sagittis. Donec congue nisl in viverra egestas. + +Vestibulum facilisis ligula magna, eu ornare lectus varius et. Mauris facilisis faucibus quam, quis mollis eros convallis non. Interdum et malesuada fames ac ante ipsum primis in faucibus. Praesent sit amet rutrum erat. Suspendisse potenti. Donec lorem mi, sagittis a fringilla sit amet, sagittis bibendum mauris. In in diam et lorem rutrum eleifend a et felis. Sed ac magna quis enim faucibus dictum. Suspendisse blandit enim eu ex laoreet gravida. + +Suspendisse sed semper felis. Etiam mattis magna mi, suscipit ullamcorper tellus euismod sed. Aenean congue scelerisque ligula id sodales. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nunc sem lectus, gravida ac dui non, pharetra posuere leo. Maecenas lacus libero, facilisis et elit vitae, commodo facilisis sem. Vivamus id nisl nulla. Integer at maximus dui. Ut a tincidunt lorem. Vivamus vitae ligula vel lacus cursus condimentum. Phasellus quis mauris lobortis, finibus lorem in, vulputate ex. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed faucibus aliquam metus, quis varius elit porttitor id. Vivamus dignissim sollicitudin scelerisque. Morbi tincidunt, dolor quis vehicula consequat, dui diam condimentum nunc, vitae scelerisque odio libero nec ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; diff --git a/dms/test/vector.svg b/dms/test/vector.svg new file mode 100644 index 00000000..11413434 --- /dev/null +++ b/dms/test/vector.svg @@ -0,0 +1 @@ +<?xml version="1.0" standalone="no"?><!-- Generator: Gravit.io --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="isolation:isolate" viewBox="0 0 250 250" width="250" height="250"><defs><clipPath id="_clipPath_llXK6vhsfjTbW54SAQzuHm194MDf7H3y"><rect width="250" height="250"/></clipPath></defs><g clip-path="url(#_clipPath_llXK6vhsfjTbW54SAQzuHm194MDf7H3y)"><defs><mask id="_mask_8YF3kr9IOeRmlealccZwRVRUFQgI7lh9"><path d="M -21.25 10 L 271.25 10 L 271.25 240 L -21.25 240 L -21.25 10 Z" style="stroke:black;fill:white;stroke-miterlimit:10;"/></mask><mask id="_mask_PMOlF2aP8rrfoLDLWXapKxtbGGQnuraN"><path d="M -21.25 10 L 271.25 10 L 271.25 240 L -21.25 240 L -21.25 10 Z" style="stroke:black;fill:white;stroke-miterlimit:10;"/></mask></defs><g mask="url(#_mask_PMOlF2aP8rrfoLDLWXapKxtbGGQnuraN)"><g mask="url(#_mask_8YF3kr9IOeRmlealccZwRVRUFQgI7lh9)"/></g><g mask="url(#_mask_8YF3kr9IOeRmlealccZwRVRUFQgI7lh9)"><image width="3393" height="2668" transform="matrix(0.086,0,0,0.086,-21.25,10)" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAADUEAAApsCAYAAABaIc3kAAAgAElEQVR4XuzbMREAAAwCseLfdG38kCrgQld2jgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAmGBhbOJRoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgTOC8gQECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECP7iR6UAACAASURBVBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABKwuN0wAAIABJREFUAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrufZt2MaAAAAhGH+Xc/GjjoghRfhCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBwgrIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTWAk5Q63qEI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDACcoGCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYCzhBresRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABJygbIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgLeAEta5HOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEnKBsgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBtYAT1Loe4QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQcIKyAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE1gJOUOt6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAnKBggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWAs4Qa3rEY4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAScoGyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYC3gBLWuRzgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJygbIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbWAE9S6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHCCsgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNYCTlDreoQjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQMAJygYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFgLOEGt6xGOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEnKBsgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAt4AS1rkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgScoGyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIG1gBPUuh7hCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBwgrIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTWAk5Q63qEI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDACcoGCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYCzhBresRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABJygbIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgLeAEta5HOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEnKBsgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBtYAT1Loe4QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQcIKyAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE1gJOUOt6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAnKBggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWAs4Qa3rEY4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAScoGyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYC3gBLWuRzgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJygbIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbWAE9S6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHCCsgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNYCTlDreoQjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQMAJygYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFgLOEGt6xGOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEnKBsgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAt4AS1rkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgScoGyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIG1gBPUuh7hCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBwgrIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTWAk5Q63qEI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDACcoGCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYCzhBresRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABJygbIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgLeAEta5HOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEnKBsgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBtYAT1Loe4QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQcIKyAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE1gJOUOt6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAnKBggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWAs4Qa3rEY4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAScoGyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYC3gBLWuRzgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJygbIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbWAE9S6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHCCsgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNYCTlDreoQjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQMAJygYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFgLOEGt6xGOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEnKBsgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAt4AS1rkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgScoGyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIG1gBPUuh7hCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBwgrIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTWAk5Q63qEI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDACcoGCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYCzhBresRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABJygbIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgLeAEta5HOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEnKBsgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBtYAT1Loe4QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQcIKyAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE1gJOUOt6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAnKBggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWAs4Qa3rEY4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAScoGyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYC3gBLWuRzgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJygbIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbWAE9S6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAGZf5HAAAgAElEQVRAgAABAgQIEHCCsgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNYCTlDreoQjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQMAJygYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFgLOEGt6xGOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEnKBsgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAt4AS1rkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgScoGyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIG1gBPUuh7hCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBwgrIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTWAk5Q63qEI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDACcoGCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYCzhBresRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABJygbIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgLeAEta5HOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEnKBsgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBtYAT1Loe4QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQcIKyAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE1gJOUOt6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAnKBggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWAs4Qa3rEY4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAScoGyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYC3gBLWuRzgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJygbIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbWAE9S6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHCCsgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNYCTlDreoQjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQMAJygYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFgLOEGt6xGOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEnKBsgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAt4AS1rkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgScoGyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIG1gBPUuh7hCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBwgrIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTWAk5Q63qEI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDACcoGCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYCzhBresRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABJygbIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgLeAEta5HOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEnKBsgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBtYAT1Loe4QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQcIKyAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE1gJOUOt6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAnKBggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWAs4Qa3rEY4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAScoGyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYC3gBLWuRzgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJygbIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbWAE9S6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHCCsgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNYCTlDreoQjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQMAJygYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFgLOEGt6xGOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEnKBsgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAt4AS1rkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgScoGyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIG1gBPUuh7hCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBwgrIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTWAk5Q63qEI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDACcoGCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYCzhBresRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABJygbIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgLeAEta5HOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEnKBsgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBtYAT1Loe4QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQcIKyAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE1gJOUOt6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAnKBggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWAs4Qa3rEY4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAScoGyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYC3gBLWuRzgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJygbIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbWAE9S6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHCCsgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNYCTlDreoQjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQMAJygYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFgLOEGt6xGOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEnKBsgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAt4AS1rkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgScoGyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIG1gBPUuh7hCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBwgrIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTWAk5Q63qEI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDACcoGCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYCzhBresRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABJygbIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgLeAEta5HOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEnKBsgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBtYAT1Loe4QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQcIKyAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE1gJOUOt6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAnKBggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWAs4Qa3rEY4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAScoGyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYC3gBLWuRzgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJygbIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbWAE9S6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHCCsgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNYCTlDreoQjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQMAJygYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFgLOEGt6xGOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEnKBsgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAt4AS1rkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgScoGyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIG1gBPUuh7hCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBwgrIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTWAk5Q63qEI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDACcoGCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYCzhBresRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABJygbIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgLeAEta5HOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEnKBsgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBtYAT1Loe4QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQcIKyAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE1gJOUOt6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAnKBggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWAs4Qa3rEY4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAScoGyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYC3gBLWuRzgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJygbIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbWAE9S6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHCCsgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNYCTlDreoQjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQMAJygYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFgLOEGt6xGOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEnKBsgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAt4AS1rkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgScoGyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIG1gBPUuh7hCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBwgrIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTWAk5Q63qEI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDACcoGCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYCzhBresRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABJygbIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDNgiagAACAASURBVECAAAECBAgQIEBgLeAEta5HOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEnKBsgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBtYAT1Loe4QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQcIKyAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE1gJOUOt6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAnKBggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWAs4Qa3rEY4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAScoGyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYC3gBLWuRzgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJygbIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbWAE9S6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHCCsgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNYCTlDreoQjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQMAJygYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFgLOEGt6xGOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEnKBsgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAt4AS1rkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgScoGyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIG1gBPUuh7hCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBwgrIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTWAk5Q63qEI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDACcoGCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYCzhBresRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABJygbIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgLeAEta5HOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEnKBsgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBtYAT1Loe4QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQcIKyAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE1gJOUOt6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAnKBggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWAs4Qa3rEY4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAScoGyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYC3gBLWuRzgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJygbIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbWAE9S6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHCCsgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNYCTlDreoQjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQMAJygYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFgLOEGt6xGOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEnKBsgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAt4AS1rkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgScoGyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIG1gBPUuh7hCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBwgrIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTWAk5Q63qEI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDACcoGCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYCzhBresRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABJygbIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgLeAEta5HOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEnKBsgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBtYAT1Loe4QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQcIKyAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE1gJOUOt6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAnKBggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWAs4Qa3rEY4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAScoGyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYC3gBLWuRzgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJygbIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbWAE9S6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHCCsgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNYCTlDreoQjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQMAJygYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFgLOEGt6xGOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEnKBsgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAt4AS1rkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgScoGyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIG1gBPUuh7hCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBwgrIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTWAk5Q63qEI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDACcoGCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYCzhBresRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABJygbIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgLeAEta5HOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEnKBsgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBtYAT1Loe4QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQcIKyAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE1gJOUOt6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAnKBggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWAs4Qa3rEY4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAScoGyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYC3gBLWuRzgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJygbIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbWAE9S6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHCCsgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNYCTlDreoQjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQMAJygYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFgLOEGt6xGOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEnKBsgQIAAAQIEYu/uYbSq1v4B36tmBujEUMg/fAQqBgstSGRM/CiIKJzCExEGE4JhjApTMMURRNBiKAbUOERCIgNitBAUQ+FHIphQaHFgKgxKXiyI2AEz1Ouf7TuelyOgM2vPxzPPc+1S9+/ea13roZidfa9FgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAg0toAmqoZfH4AgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ0ATlN0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEMLaIJq6OUxOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIENEH5DRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0NACmqAaenkMjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABTVB+AwQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQINLSAJqiGXh6DI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBAE5TfAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECDS2gCaqhl8fgCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDQBOU3QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAQwtogmro5TE4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQ0QfkNECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQ0AKaoBp6eQyOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAFNUH4DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAg0tIAmqIZeHoMjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQEATlN8AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQINLaAJqqGXx+AIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIENAE5TdAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBDC2iCaujlMTgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBDRB+Q0QIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINDQApqgGnp5DI4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAU1QfgMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECDS0gCaohl4egyNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAQBOU3wABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAg0toAmqoZfH4AgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ0ATlN0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEMLaIJq6OUxOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIENEH5DRAgQIAAAQIECBAgQIAAAQIEGkQg5zw3Is5ExKaU0oUGGZZhECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEJh2AU1Q074EBkCAAAECBAgQIECAAAECBAgQ+F+BnPOBiHg1IoYiojOldJ0NAQIECBAgQIAAAQIECBAgQIDAxAvknKt3L9VmNC4CBAgQIECAAAECBAgQIECAAIEZIqAJaoYslGESIECAAAECBAgQIECAAAECzS1QfXgTEd/eNsuzKaXqv7kIECBAgAABAgQIECBAgAABAgQmUCDnvDsiXo+IFU7jnkBYpQgQIECAAAECBAgQIECAAAECkyygCWqSgZUnQIAAAQIECBAgQIAAAQIECIxFIOd8JSIe+NO9gymlTWPJu4cAAQIECBAgQIAAAQIECBAgQODvBXLO1buWD0bvHEopdfx9yh0ECBAgQIAAAQIECBAgQIAAAQKNIKAJqhFWwRgIECBAgAABAgQIECBAgACBlha4bffhuzm8kFI60tJAJk+AAAECBAgQIECAAAECBAgQmACBnHPV8HQmIubcVm57SunABJRXggABAgQIECBAgAABAgQIECBAYJIFNEFNMrDyBAgQIECAAAECBAgQIECAAIG/Ehj9+Ob83yg9mlKqPtBxESBAgAABAgQIECBAgAABAgQIFAjknOdGRHUS9+0NUFWlGxHRkVKq/p+LAAECBAgQIECAAAECBAgQIECggQU0QTXw4hgaAQIECBAgQIAAAQIECBAg0PwCOecLEbH8b2bqY5zm/ymYIQECBAgQIECAAAECBAgQIDBJAqMNUNUGM/d6B3M2pdQ5SY9XlgABAgQIECBAgAABAgQIECBAYIIENEFNEKQyBAgQIECAAAECBAgQIECAAIHxCuScd0fE62PMDUVEZ0rp+hjvdxsBAgQIECBAgAABAgQIECBAgEBE5JyPRETX32BsTykdAEaAAAECBAgQIECAAAECBAgQINC4ApqgGndtjIwAAQIECBAgQIAAAQIECBBoYoGc84KIqE6BmjOOaX6eUnpmHPe7lQABAgQIECBAgAABAgQIECDQ0gLj2ISmOol7gQ1oWvrnYvIECBAgQIAAAQIECBAgQIBAgwtogmrwBTI8AgQIECBAgAABAgQIECBAoDkFcs5nImJVwezeTiltK8iJECBAgAABAgQIECBAgAABAgRaSiDnvCkiPhjHpG1AMw4stxIgQIAAAQIECBAgQIAAAQIEplpAE9RUi3seWT/BkgAAIABJREFUAQIECBAgQIAAAQIECBAg0PICOeeqiWl/DYgXUkpHauRFCRAgQIAAAQIECBAgQIAAAQJNLZBz7oiIahOa8ZzCXZmsTSl91tQ4JkeAAAECBAgQIECAAAECBAgQmKECmqBm6MIZNgECBAgQIECAAAECBAgQIDAzBXLOCyLiQsEHOH+e8IqUUlXHRYAAAQIECBAgQIAAAQIECBAgcJtAznnu6PuXBwpgbkTEgpTS9YKsCAECBAgQIECAAAECBAgQIECAwCQKaIKaRFylCRAgQIAAAQIECBAgQIAAAQJ/Fsg5VzsJPz0BMtUHOR0ppSsTUEsJAgQIECBAgAABAgQIECBAgEDTCOScq41jlteY0GBKaVONvCgBAgQIECBAgAABAgQIECBAgMAkCGiCmgRUJQkQIECAAAECBAgQIECAAAECdxPIOT8TEScnUGcoIjrtTDyBokoRIECAAAECBAgQIECAAAECM1og53wkIromYBKPppTOTEAdJQgQIECAAAECBAgQIECAAAECBCZIQBPUBEEqQ4AAAQIECBAgQIAAAQIECBD4K4Gc89yIqE5tmjPBUnYmnmBQ5QgQIECAAAECBAgQIECAAIGZKZBz3hYR+ydo9L+MnsJ9fYLqKUOAAAECBAgQIECAAAECBAgQIFBTQBNUTUBxAgQIECBAgAABAgQIECBAgMBYBHLOn0XE02O5t+CeN1JKuwtyIgQIECBAgAABAgQIECBAgACBphCYhBO4K5e3U0pVY5WLAAECBAgQIECAAAECBAgQIECgAQQ0QTXAIhgCAQIECBAgQIAAAQIECBAg0NwCOefOiPh2kmf5QkrpyCQ/Q3kCBAgQIECAAAECBAgQIECAQMMJ5Jw7IuLMJJzAXc310ZRSVdtFgAABAgQIECBAgAABAgQIECAwzQKaoKZ5ATyeAAECBAgQIECAAAECBAgQaG6BnPPciLgQEQ9M8kxvRERnSql6losAAQIECBAgQIAAAQIECBAg0BICU/DuZSilVDVZuQgQIECAAAECBAgQIECAAAECBKZZQBPUNC+AxxMgQIAAAQIECBAgQIAAAQLNLZBzPhARr07RLKtGqAUppetT9DyPIUCAAAECBAgQIECAAAECBAhMq0DOudoQZvkkD+KNlNLuSX6G8gQIECBAgAABAgQIECBAgAABAn8joAnKT4QAAQIECBAgQIAAAQIECBAgMEkCOefOiPh2ksrfq+zQ6IlQGqGmGN7jCBAgQIAAAQIECBAgQIAAgakVyDkfiYiuKXrqCidwT5G0xxAgQIAAAQIECBAgQIAAAQIE7iGgCcpPgwABAgQIECBAgAABAgQIECAwSQI55ysR8cAklf+rsoMppU3T8FyPJECAAAECBAgQIECAAAECBAhMiUDOeVtE7J+Sh/3vQ4ZSSh1T+DyPIkCAAAECBAgQIECAAAECBAgQ+JOAJig/CQIECBAgQIAAAQIECBAgQIDAJAjknHdHxOslpX/86XIsXbywJHp7ZntK6UDdIvIECBAgQIAAAQIECBAgQIAAgUYTmKbTtysG71sa7cdgPAQIECBAgAABAgQIECBAgEBLCWiCaqnlNlkCBAgQIECAAAECBAgQIEBgKgRyztWuwOdLn9W5dn08/ODy6Nu5o7TEH7m1KaXP6haRJ0CAAAECBAgQIECAAAECBAg0isDoe5czETFnGsZ0IyI6UkrV6d8uAgQIECBAgAABAgQIECBAgACBKRbQBDXF4B5HgAABAgQIECBAgAABAgQINL9AzvlCRCwvmem7h4/GO4cHf4++tv2l6Hp2XUmZPzLVhzmdKaVqPC4CBAgQIECAAAECBAgQIECAwIwWyDnPjYiqAarovUs1+R/OD8XFS5frvHM5m1LqnNGQBk+AAAECBAgQIECAAAECBAgQmKECmqBm6MIZNgECBAgQIECAAAECBAgQINCYAjnn3RHxesnofvzpcjy1Yct/RQ/u2xOPPbKypNwfmV9Gdyi+XqeILAECBAgQIECAAAECBAgQIEBgugVyzlUD1KrScVy99lusGX33curYoZg/777SUttTSgdKw3IECBAgQIAAAQIECBAgQIAAAQJlApqgytykCBAgQIAAAQIECBAgQIAAAQJ3COScF0REderSnBKeNRtfjIuXfv6v6Oz2tjg+0B9LFy8sKflHZiil1FGngCwBAgQIECBAgAABAgQIECBAYDoFcs5HIqKrdAzDI7difXfPf969PPzg8vhwoL+0XHX69oKUkk1nSgXlCBAgQIAAAQIECBAgQIAAAQIFApqgCtBECBAgQIAAAQIECBAgQIAAAQJ3E6izG/HgJyfizf3v3RV22ZJFvzdCtbfNqgM/mFLaVKeALAECBAgQIECAAAECBAgQIEBgOgRyztU7jQ/qPLu7d1d8ffbcf5Xo29kb61Y/UVr285TSM6VhOQIECBAgQIAAAQIECBAgQIAAgfELaIIav5kEAQIECBAgQIAAAQIECBAgQOAOgZzztojYX0Jz9dpvsWbDlrg5PHLPeM3dif+ouz2ldKBkjDIECBAgQIAAAQIECBAgQIAAgekQyDl3RsS3dZ791oGBOPLxp3eUqE7gPnPyozobz6xNKX1WZ2yyBAgQIECAAAECBAgQIECAAAECYxfQBDV2K3cSIECAAAECBAgQIECAAAECBO4qkHNeEBEXImJOCdHz3T3x/b+H/ja6bvWT0bdzx9/e9zc3PJpSOlO3iDwBAgQIECBAgAABAgQIECBAYLIFcs4dEVG9xyh651KN78Tpr6J3b989h/r4qpUx0LendCo3ImJBSul6aQE5AgQIECBAgAABAgQIECBAgACBsQtoghq7lTsJECBAgAABAgQIECBAgAABAncVyDlXO/4+XcIz+MmJeHP/e2OO9u3sjXWrnxjz/Xe5sfo4pzOlVDVtuQgQIECAAAECBAgQIECAAAECDSmQc5472gC1vHSAP/50OZ7asOVv4wf37YnHHln5t/fd44bBlNKm0rAcAQIECBAgQIAAAQIECBAgQIDA2AU0QY3dyp0ECBAgQIAAAQIECBAgQIAAgTsEcs7PRMTJEprhkVvRufa5uDk8Mq748YP98dCK4u9/qmdVx05VjVB2KR6XvJsJECBAgAABAgQIECBAgACBqRLIOVcnQK0qfd7Va7/Fmg1bxvTeZXZ7W5w5+VG0t80qfZyTt0vl5AgQIECAAAECBAgQIECAAAEC4xDQBDUOLLcSIECAAAECBAgQIECAAAECBG4XGN2R+EpEzCmR6e7dFV+fPTfuaPVhzvGB/li6eOG4s7cFzqaUOusUkCVAgAABAgQIECBAgAABAgQITIZAzvlARLxaWrvaeGZ9d09cvPTzmEusW/1k9O3cMeb7/3TjLxHRYcOZUj45AgQIECBAgAABAgQIECBAgMDYBDRBjc3JXQQIECBAgAABAgQIECBAgACBOwRyzkcioquE5pvvzsXWHbtKor9nli1Z9HsjVI0diqsygymlTcWDECRAgAABAgQIECBAgAABAgQITLBAzrl6V/FBnbKlG8/UPH377ZTStjrjliVAgAABAgQIECBAgAABAgQIEPhrAU1QfiEECBAgQIAAAQIECBAgQIAAgQKBnHN1itK3BdGodiPuXPtc3BweKYn/J/P4qpUx0LenVo2IeCGlVDVzuQgQIECAAAECBAgQIECAAAEC0yqQc+6IiPN1BvHWgYE48vGnRSXm3z8vvjh2qM6mM4+mlM4UPVyIAAECBAgQIECAAAECBAgQIEDgbwU0Qf0tkRsIECBAgAABAgQIECBAgAABAv8tkHOeGxEXIuKBEpvevfvixOkvS6J3ZDb98x/xr23ddWv5QKeuoDwBAgQIECBAgAABAgQIECBQSyDnvGD0fcuc0kInTn8VvXv7SuO/52q+axlKKVWNXC4CBAgQIECAAAECBAgQIECAAIFJENAENQmoShIgQIAAAQIECBAgQIAAAQLNLZBzPhARr5bM8ofzQ7F+a09J9J6Zvp29sW71E3Vq3oiIjpTSlTpFZAkQIECAAAECBAgQIECAAAECJQKjG85UJygtL8lXmR9/uhzru3tqn7xd1Tp+sD8eWlE8lDdSSrtL5yFHgAABAgQIECBAgAABAgQIECBwbwFNUH4dBAgQIECAAAECBAgQIECAAIFxCOScOyPi23FE/nPr8MiteGrDlrj667WS+F9mvjh2KJYuXlin7lBEdKaUrtcpIkuAAAECBAgQIECAAAECBAgQGK9AzvmziHh6vLk/7q/euXSufW5CGqCqmsuWLIpTR98vHU6VW5FSqk4RdxEgQIAAAQIECBAgQIAAAQIECEyggCaoCcRUigABAgQIECBAgAABAgQIEGh+gZxz9QFL0VbAbx0YiCMffzopSLPb2+LUsUMxf959dep/nlJ6pk4BWQIECBAgQIAAAQIECBAgQIDAeATqnLhdPadqgKpOgLp46efxPPZv731lc1e8vHnj3953jxuGUkodpWE5AgQIECBAgAABAgQIECBAgACBuwtogvLLIECAAAECBAgQIECAAAECBAiMUSDnvDsiXh/j7f912w/nh2L91p6S6Jgz1S7Fxwf6o71t1pgzd7nx7ZTStjoFZAkQIECAAAECBAgQIECAAAECYxHIOW+KiA/Gcu+97unduy9OnP6yTol7ZmuevL09pXRgUgamKAECBAgQIECAAAECBAgQIECgRQU0QbXowps2AQIECBAgQIAAAQIECBAgMD6BnHO1e+/58aX+7+41G1+c8B2J7zaWx1etjIG+PaXD/CP3QkrpSN0i8gQIECBAgAABAgQIECBAgACBewnUfddS1X338NF45/DgpCFXG86cOvp+af0bEdGRUrpSWkCOAAECBAgQIECAAAECBAgQIEDgvwU0QflFECBAgAABAgQIECBAgAABAgTGIJBzvhARy8dw6x23TPYHOX9+4Cubu+LlzRtLhnp7ZkVKqZqziwABAgQIECBAgAABAgQIECAwoQI55wURUb13mFNa+MTpr6J3b19pfMy517a/FF3Prhvz/X+68WxKqbM0LEeAAAECBAgQIECAAAECBAgQIPDfApqg/CIIECBAgAABAgQIECBAgAABAn8jkHPeFhH7S6B+/OlyPLVhS0m0VqZvZ2+sW/1EnRp2K66jJ0uAAAECBAgQIECAAAECBAjcVSDnPDcizpRuNlMVrd63rO/uiZvDI5OuPLu9LU4dOxTz591X+qztKaUDpWE5AgQIECBAgAABAgQIECBAgACB/xPQBOXXQIAAAQIECBAgQIAAAQIECBD4C4G6OxOv2fhiXLz085QbVx/oHB/oj6WLF9Z59lBEdKaUrtcpIkuAAAECBAgQIECAAAECBAgQ+EMg5/xZRDxdKjI8cis61z43JQ1Qf4zx4QeXx4cD/aVDrjaaWeD9SimfHAECBAgQIECAAAECBAgQIEDg/wQ0Qfk1ECBAgAABAgQIECBAgAABAgT+QiDnXO1MvKoEafCTE/Hm/vdKohOSqRqhzpz8KNrbZtWpN5hS2lSngCwBAgQIECBAgAABAgQIECBAoBLIOe+OiNdLNaoGqOoEqOnYcOa17S9F17PrSof+eUrpmdKwHAECBAgQIECAAAECBAgQIECAwP8KaILySyBAgAABAgQIECBAgAABAgQI3EMg57wtIvaXAF299lus2bBlSnclvts4ly1Z9PuJUDUbod5IKVUfKbkIECBAgAABAgQIECBAgAABAkUCOedqk5UPisKjod69++LE6S/rlCjOTsBmM2tTStUpWC4CBAgQIECAAAECBAgQIECAAIFCAU1QhXBiBAgQIECAAAECBAgQIECAQHML5JznRsSViJhTMtPnu3vi+38PlUQnPLNu9ZPRt3NH3bovpJSO1C0iT4AAAQIECBAgQIAAAQIECLSeQM65IyKq07aL3rNUYtN94nY1hsdXrYyBvj2lC3gjIhaklK6XFpAjQIAAAQIECBAgQIAAAQIECLS6gCaoVv8FmD8BAgQIECBAgAABAgQIECBwV4Gcc7Uz79MlPI3wUc6fx/3K5q54efPGkun8kak+1OlMKV2oU0SWAAECBAgQIECAAAECBAgQaC2BuhvNVFrffHcutu7Y1RBwB/fticceWVk6lsGUUnUilosAAQIECBAgQIAAAQIECBAgQKBAQBNUAZoIAQIECBAgQIAAAQIECBAg0NwCOednIuJkySyHR25F59rn4ubwSEl8UjM1P9KpxmbH4kldIcUJECBAgAABAgQIECBAgEBzCYw2QFUnQC0vndmPP12O9d09DfOuZXZ7W5w5+VG0t80qndKjKaXKxEWAAAECBAgQIECAAAECBAgQIDBOAU1Q4wRzOwECBAgQIECAAAECBAgQINDcAnV3J+7u3RVfnz3XkEjVRzrHB/pj6eKFdcY3NHoi1PU6RWQJECBAgAABAgQIECBAgACB5hfIOR+JiK7SmVabzTy1YUtc/fVaaYlJya1b/WT07dxRWvuXiOhIKXm3UiooR4AAAQIECBAgQIAAAQIECLSsgCaoll16EydAgAABAgQIECBAgAABAgTuJlDn45xvvjsXW3fsamjY+ffPiy+OHaqzW3E1v8GU0qaGnqjBESBAgAABAgQIECBAgAABAtMqkHPeHRGv1xnEmo0vxsVLP9cpMWnZ4wf746EVxQdcvZ1S2jZpg1OYAAECBAgQIECAAAECBAgQINCkApqgmnRhTYsAAQIECBAgQIAAAQIECBAYv0DOuTMivh1/MqLambhz7XNxc3ikJD6lmWVLFsWpo+/Xfeb2lNKBukXkCRAgQIAAAQIECBAgQIAAgeYTyDlXm6d8UGdmvXv3xYnTX9YpManZCdho5tGU0plJHaTiBAgQIECAAAECBAgQIECAAIEmE9AE1WQLajoECBAgQIAAAQIECBAgQIBAmUDOeW5EXIiIB0oqNPqHOX+e07rVT0bfzh0lU709szal9FndIvIECBAgQIAAAQIECBAgQIBA8wjknDsiomrumVM6q8FPTsSb+98rjU9ZbtM//xH/2tZd+rxfUkoLSsNyBAgQIECAAAECBAgQIECAAIFWFNAE1Yqrbs4ECBAgQIAAAQIECBAgQIDAHQI55+pUo1dLaH44PxTrt/aURKc189r2l6Lr2XV1xnAjIjpTSlXzmIsAAQIECBAgQIAAAQIECBBocYHRTWau1GmA+ua7c7F1x64ZI3n8YH88tGJ56XjfSCntLg3LESBAgAABAgQIECBAgAABAgRaTUATVKutuPkSIECAAAECBAgQIECAAAECdwjknDsj4tsSmuGRW/HUhi1x9ddrJfFpzxzctycee2RlnXH8EhEdKaXrdYrIEiBAgAABAgQIECBAgAABAjNfIOdcbZRS3BH040+XY313T9wcHpkxGMuWLIpTR9+vM94VNpipwydLgAABAgQIECBAgAABAgQItJKAJqhWWm1zJUCAAAECBAgQIECAAAECBO4qUOcDnbcODMSRjz+dsbKz29vi+EB/LF28sM4chlJKHXUKyBIgQIAAAQIECBAgQIAAAQIzWyDnfCQiukpnMZM3mnllc1e8vHlj6dS9VymVkyNAgAABAgQIECBAgAABAgRaTkATVMstuQkTIECAAAECBAgQIECAAAECtwvknHdHxOslKtXuxNUpUDP9qnYsrhqh2ttm1ZnKYEppU50CsgQIECBAgAABAgQIECBAgMDMFMg5b4uI/XVG/3x3T3z/76E6JaY1+8WxQ3U2mXkjpVS9o3IRIECAAAECBAgQIECAAAECBAj8hYAmKD8PAgQIECBAgAABAgQIECBAoGUFcs7V6UXnSwHWbHwxLl76uTTeULmHH1weHw701x3T9pTSgbpF5AkQIECAAAECBAgQIECAAIGZI5BzfiYiTtYZce/efXHi9Jd1Skx7ttpk5tTR90vHcSMiOlJKV0oLyBEgQIAAAQIECBAgQIAAAQIEWkFAE1QrrLI5EiBAgAABAgQIECBAgAABAncVyDlfiIjlJTzvHj4a7xweLIk2bGbd6iejb+eOuuN7NKV0pm4ReQIECBAgQIAAAQIECBAgQKDxBUY3mKneA8wpHe2J019F796+0nhD5V7b/lJ0PbuudExnU0qdpWE5AgQIECBAgAABAgQIECBAgEArCGiCaoVVNkcCBAgQIECAAAECBAgQIEDgDoGc87aI2F9C8+NPl+OpDVtKog2f6dvZG+tWP1FnnNXOxZ0pparBzEWAAAECBAgQIECAAAECBAg0qUDOeW5EVH//P1A6xR/OD8X6rT2l8YbLzW5vi1PHDsX8efeVjs0p26VycgQIECBAgAABAgQIECBAgEBLCGiCaollNkkCBAgQIECAAAECBAgQIEDgdoGc84LRj3SKdil+vrsnvv/3UNOiHj/YHw+tKDog6w+TCqdqhLretEgmRoAAAQIECBAgQIAAAQIEWlygzgnbFV21ycz67p64OTzSVJIPP7g8PhzoL51TtblMR0rpSmkBOQIECBAgQIAAAQIECBAgQIBAMwtogmrm1TU3AgQIECBAgAABAgQIECBA4K4COeczEbGqhGfwkxPx5v73SqIzJlPtWnx8oD+WLl5YZ8xnU0qddQrIEiBAgAABAgQIECBAgAABAo0pkHM+EhFdpaMbHrn1ewPUxUs/l5Zo6Nxr21+KrmfXlY7x85TSM6VhOQIECBAgQIAAAQIECBAgQIBAMwtogmrm1TU3AgQIECBAgAABAgQIECBA4A6BnPOmiPighObqtd9izYYtTbdD8d0sli1Z9HsjVHvbrBKqPzKDKaXK20WAAAECBAgQIECAAAECBAg0iUDOeVtE7K8znWY/ZbvaYObMyY/qvFdZm1L6rI6xLAECBAgQIECAAAECBAgQIECgGQU0QTXjqpoTAQIECBAgQIAAAQIECBAgcFeBnPPciLgSEXNKiJr9A50/mzy+amUM9O0pobo980JKqdod2kWAAAECBAgQIECAAAECBAjMcIGcc3VC0ck60+jduy9OnP6yTokZka35XuVGRCxIKV2fEZM1SAIECBAgQIAAAQIECBAgQIDAFAlogpoiaI8hQIAAAQIECBAgQIAAAQIEpl8g51ztoPt0yUhOnP4qevf2lURndGbTP/8R/9rWXXcOj6aUztQtIk+AAAECBAgQIECAAAECBAhMn0DOuSMiqr/vizaXqUbeau9XDu7bE489srJ00T5PKVVNZy4CBAgQIECAAAECBAgQIECAAIFRAU1QfgoECBAgQIAAAQIECBAgQIBASwjU2al4eORWdK59Lm4Oj7SE1Z8n2bezN9atfqLO3KvdiztSStUpXC4CBAgQIECAAAECBAgQIEBghgmMnq5dNUAtLx36D+eHYv3WntL4jMzNbm+LMyc/iva2WaXjt7FMqZwcAQIECBAgQIAAAQIECBAg0JQCmqCacllNigABAgQIECBAgAABAgQIELhdYPRDnaoBp2in4u7eXfH12XMtjfrFsUOxdPHCOgZDEdGZUrpep4gsAQIECBAgQIAAAQIECBAgMPUCOeeqAWpV6ZOvXvst1mzY0pIbzKxb/WT07dxRSvfL6MYy3qeUCsoRIECAAAECBAgQIECAAAECTSWgCaqpltNkCBAgQIAAAQIECBAgQIAAgbsJ5JwPRMSrJTrffHcutu7YVRJtqky1c/GpY4di/rz76szr85TSM3UKyBIgQIAAAQIECBAgQIAAAQJTK5BzPhIRXaVPrU7YXt/dExcv/VxaYsbnjh/sj4dWFB+i9XZKaduMRzABAgQIECBAgAABAgQIECBAgMAECGiCmgBEJQgQIECAAAECBAgQIECAAIHGFcg5d0bEtyUjrD7S6Vz7XEvuUnw3r2VLFsXxgf5ob5tVwvlHxoc7dfRkCRAgQIAAAQIECBAgQIDAFArknDdFxAd1HumE7Yj598+L6pTtGu9UHk0pVadxuQgQIECAAAECBAgQIECAAAECLS2gCaqll9/kCRAgQIAAAQIECBAgQIBAcwvknOdGxIWIeKBkpm8dGIgjH39aEm3azOOrVsZA356683shpVTtIu0iQIAA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wydLgAABAgQIECBAgAABAgQINKKAJqhGXBVjIkCAAAECBAgQIECAAAECBO4qkHOuGl+KtsB99/DReOfwINkGEKi5k3E1g6HRRqjrDTAdQyBAgAABAgQIECBAgAABAg0nMNoAVZ0AVfQepZrQjz9djvXdPXFzeKTh5tcqA3plc1e8vHlj6XSHUkrVSWAuAgQIECBAgAABAgQIECBAgEDTCGiCapqlNBECBAgQIECAAAECBAgQINDcAjnn3RHxesksq492qlOgXI0hMLu9LY4P9MfSxQvrDOhsSqmzTgFZAgQIECBAgAABAgQIECDQrAI55yMR0VU6Pydql8pNfO6LY4fqvEN5I6VUvVNzESBAgAABAgQIECBAgAABAgSaQkATVFMso0kQIECAAAECBAgQIECAAIHmFsg5L4iI/ymd5ZqNL8bFSz+XxuUmQWDZkkW/N0K1t82qU30wpbSpTgFZAgQIECBAgAABAgQIECDQbAJ1NpL5w8K7lMb5VVTvUE4dfb90QDcioiOldKW0gBwBAgQIECBAgAABAgQIECBAoJEENEE10moYCwECBAgQIECAAAECBAgQIHBXgZzzmYhYVcLz7uGj8c7hwZKozCQLPL5qZQz07an7lBdSStXu1i4CBAgQIECAAAECBAgQINDyAjnnarOQD+pA9O7dFydOf1mnhOwEC7yyuSte3ryxtKrTtEvl5AgQIECAAAECBAgQIECAAIGGE9AE1XBLYkAECBAgQIAAAQIECBAgQIDA7QI5520Rsb9E5eq136LzmedKojJTJLDpn/+If23rrvu0R1NKVaOciwABAgQIECBAgAABAgQItKxAzrkjIqq/j+eUIgx+ciLe3P9eaVxukgRmt7fFqWOHYv68+0qfsD2ldKA0LEeAAAECBAgQIECAAAECBAgQaBQBTVCNshLGQYAAAQIECBAgQIAAAQIECNwhkHNeEBEXSj/eeb67J77/9xDZBhfo29kb61Y/UWeUNyKiI6V0pU4RWQIECBAgQIAAAQIECBAgMFMFcs5zI6L6u7i4Aeqb787F1h27ZipB04/74QeXx4cD/aXz9O6kVE6OAAECBAgQIECAAAECBAgQaCgBTVANtRwGQ4AAAQIECBAgQIAAAQIECNwukHOudi9eVaJi5+IStenLfHHsUCxdvLDOAKput86U0vU6RWQJECBAgAABAgQI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bbbxQR2N3r374sTpL+uUkG1hgeMH++OhFctLBd5IKVXv/FwECBAgQIAAAQIECBAgQIAAgWkR0AQ1LeweSoAAAQIECBAgQIAAAQIEmlsg59wREedLZ9m5dn1c/fVaaVyOwH8Eau5w/EedR1NKZ7ASIECAAAECBAgQIECAAIE6AnXfl1TPfvfw0Xjn8GCdYci2uMD8++fFmZPH6yisSCldqFNAlgABAgQIECBAgAABAgQIECBQKqAJqlROjgABAgQIECBAgAABAgQIELinQM65+hCiaEtZH/P4YU20QN/O3li3+ok6ZW9ERKcPfOoQyhIgQIAAAQIECBAgQKC1BXLOCyKiel8yp1TixOmvondvX2lcjsB/BF7Z3BUvb95YKjKUUqo2QHIRIECAAAECBAgQIECAAAECBKZcQBPUlJN7IAECBAgQIECAAAECBAgQaG6BnPPuiHi9ZJY//nQ5ntqwpSQqQ+AvBb44diiWLl5YR2lotBHqep0isgQIECBAgAABAgQIECDQegI557kRUZ0wXLRhTCVWvTNZ390TN4dHWg/QjCdFoOa7kjdSStU7QBcBAgQIECBAgAABAgQIECBAYEoFNEFNKbeHESBAgAABAgQIECBAgACB5haou6vxmo0vxsVLPzc3ktlNi8Ds9rY4dexQzJ93X53nf55SeqZOAVkCBAgQIECAAAECBAgQaD2BnPNnEfF06cyHR25F59rnNECVAsrdVWDZkkVx6uj7dXT+X0rpSp0CsgQIECBAgAABAgQIECBAgACB8QpoghqvmPsJECBAgAABAgQIECBAgACBewrknKtdjVeVEL17+Gi8c3iwJCpDYEwC1cc9xwf6o71t1pjuv8dNb6eUttUpIEuAAAECBAgQIECAAAECrSNQ58TsSqlqgKpOgLJpTOv8ZqZypq9s7oqXN28sfeTZlFJnaViOAAECBAgQIECAAAECBAgQIFAioAmqRE2GAAECBAgQIECAAAECBAgQuEMg51w1huwvobl67bdYs2GLHY1L8GTGJfD4qpUx0LdnXJm73PxCSulI3SLyBAgQIECAAAECBAgQINDcAjnnTRHxQZ1Z9u7dFydOf1mnhCyBvxQ489lHdU7O3p5SOoCYAAECBAgQIECAAAECBAgQIDBVApqgpkracwgQIECAAAECBAgQIECAQBML5JwXRMSFiJhTMs3nu3vi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tPnekaFYua6nJCpDgMAUEei86454qLur7mgWp5SqYkoXAQIECBAgQIAAAQIEpqRAznlZROyvM7jezVti38HX6zQhS4DAJAls2/J43PSrG0p7dxJ2qZwcAQIECBAgQIAAAQIECBCY4gKKoKb4AzI8AgQIECBAgAABAgQIECDwbYGc86KIOFKiMjxyNm5dtTZOfHayJC5DgMAUEujb2Bsrlt5cZ0TVrsiLUkrH6zQiS4AAAQIECBAgQIAAgUYIjL7/OBQRs0rb33fwjejd3FcalyNAYJIFZra3xaH9L0R724zSkdyYUqp+jrgIECBAgAABAgQIECBAgACBJhJQBNVED9NUCBAgQIAAAQIECBAgQKD5BXLO1cktC0tm+uTAYOx88eWSqAwBAlNMoFoItHewPxZcdUWdkQ1FREdK6VSdRmQJECBAgAABAgQIECAwngI559kRUb3/mFfarpOwS+XkCEwtgZqnYX86ugGM9x5T67EaDQECBAgQIECAAAECBAgQqCWgCKoWnzABAgQIECBAgAABAgQIEJg4gZzzpoh4tKTHYx99cu4UKBcBAs0jMA47IlcYr6SUljWPipkQIECAAAECBAgQIDDdBXLO1cktS0rnUb0DWdnVE2eGR0qbkCNAYAoJ7N3WH9ctLtoTqprFUyml7ik0HUMhQIAAAQIECBAgQIAAAQIEagoogqoJKE6AAAECBAgQIECAAAECBCZCIOe8KCKOlPZ12+r74+iHH5fG5QgQmKIC11x95bkTodrbZtQZ4WMpparI0kWAAAECBAgQIECAAIFJFcg574yINaWDGB45e64AyjuQUkE5AlNPYO7lc+K1PdvrvPtYnFKqTpdzESBAgAABAgQIECBAgAABAk0goAiqCR6iKRAgQIAAAQIECBAgQIBA8wvU2QX5mR274+kdu5ofyQwJtKjAiqW3RN/GDXVnf29KqVps6CJAgAABAgQIECBAgMCkCOScOyPiuTqdd/U+Er8//E6dJmQJEJiCAp133REPdXeVjmwopVRtMOUiQIAAAQIECBAgQIAAAQIEmkBAEVQTPERTIECAAAECBAgQIECAAIHmFsg5d0fE1pJZHvvok7h11dqSqAwBAtNI4Lf3rYnf3Le6zohPR0SHnZHrEMoSIECAgVckAgAAIABJREFUAAECBAgQIFAqkHPuiIi3SvNV7smBwdj54st1mpAlQGAKC1SnQS246orSEToFu1ROjgABAgQIECBAgAABAgQITDEBRVBT7IEYDgECBAgQIECAAAECBAgQ+LZAznl+RHwQEbNKZO7p6ol33x8qicoQIDDNBPo29saKpTfXGXVVCDU/pXSqTiOyBAgQIECAAAECBAgQuBiBnHN1Qsuh0ncfVV/7Dr4RvZv7LqZb9xIgMM0Errn6ynh19+/qjHqxzV/q8MkSIECAAAECBAgQIECAAIGpIaAIamo8B6MgQIAAAQIECBAgQIAAAQIXFMg5V4uAlpTw7HppXzyx9dmSqAwBAtNQYGZ7W+wd7K+zK3I166pqsjoRSiHUNPwMGDIBAgQIECBAgACB6SaQc549WgC1sHTsTsEulZMjMP0Eap6EPZRSqoouXQQIECBAgAABAgQIECBAgMA0FlAENY0fnqETIECAAAECBAgQIECAQHML5Jw7I+K5klmeOPl53LZqbZwZHimJyxAgME0F5l4+J17bsz3a22bUmcGulFL188dFgAABAgQIECBAgACBhgrU2fylGpj3Hw19PBonMCUFqvceC666onRs61NKA6VhOQIECBAgQIAAAQIECBAgQGDyBRRBTf4zMAICBAgQIECAAAECBAgQIHCewOhOyMcjYlYJzz1dPfHu+9WBLi4CBFpN4Jqrr4xXd/+u7rQfSyltqtuIPAECBAgQIECAAAECBL5LIOe8MyLWlAoNj5yNlV09cfTDj0ubkCNAYBoKXH/twnh+sL905KcjYlFKqXrv6iJAgAABAgQIECBAgAABAgSmoYAiqGn40AyZAAECBAgQIECAAAECBJpfIOd8ICJuL5npvoNvRO/mvpKoDAECTSKwYukt0bdxQ93ZLE8pVT+LXAQIECBAgAABAgQIEBhXgTqnX38zkK7eR+L3h98Z13FpjACB6SHw8PoHYs2dK0oHezil1FEaliNAgAABAgQIECBAgAABAgQmV0AR1OT6650AAQIECBAgQIAAAQIECJwnkHNeFhH7S2iqXZA7lt8dZ4ZHSuIyBAg0kUDNBUGVRLU7ckdK6YMmYjEVAgQIECBAgAABAgQmWSDnXBUfvFVnGE8ODMbOF1+u04QsAQLTWGBme1u8umd7zJ1zWeks1qeUBkrDcgQIECBAgAABAgQIECBAgMDkCSiCmjx7PRMgQIAAAQIECBAgQIAAgfMEcs6zI+J4RMwq4bELcomaDIHmFdi25fG46Vc31JngpxGxKKV0qk4jsgQIECBAgAABAgQIEKgEcs7zI6LaaKHovUfVhhOwfZYIEKgErr92YTw/2F+KUW38Mt/7jlI+OQIECBAgQIAAAQIECBAgMHkCiqAmz17PBAgQIECAAAECBAgQIEDgPIGcc7UD6YMlNG++/U6s2/BISVSGAIEmFah2Rt472B8LrrqizgyHUkqL6jQgS4AAAQIECBAgQIAAgdGNXw5FxMJSjWMffRK3rlpbGpcjQKDJBPo29saKpTeXzuqVlNKy0rAcAQIECBAgQIAAAQIECBAgMDkCiqAmx12vBAgQIECAAAECBAgQIEDgPIGcc0dEvFVCMzxy9twioBOfnSyJyxAg0MQCcy+fE6/t2R7tbTPqzHJXSqmzTgOyBAgQIECAAAECBAi0tkDO+UBE3F6qUL376Fh+d5wZHiltQo4AgSYTqDZ/ObT/hTrvPJanlKqfTS4CBAgQIECAAAECBAgQIEBgmggogpomD8owCRAgQIAAAQIECBAgQKC5BUZ3Q/4gIuaVzPTJgcHY+eLLJVEZAgRaQOD6axfG84P9dWe6PqVUnVbnIkCAAAECBAgQIECAwEUJ1Dn5uuqoKoBa2dUTRz/8+KL6dTMBAs0v8OslN8Rg3+OlEz0dEfNTSqdKG5AjQIAAAQIECBAgQIAAAQIEJlZAEdTEeuuNAAECBAgQIECAAAECBAhcUKDOYqD3jgzFynU9ZAkQIPC9AiuW3hJ9GzfUVbJDcl1BeQIECBAgQIAAAQItJpBzrk6Vfa7OtHs3b4l9B1+v04QsAQJNLLBty+Nx069uKJ2h069L5eQIECBAgAABAgQIECBAgMAkCCiCmgR0XRIgQIAAAQIECBAgQIAAgW8L5JwXRcSREpVqJ+RbV62NE5+dLInLECDQYgJ9G3tjxdKb68y62iG5I6VUnVznIkCAAAECBAgQIECAwPcK1Hnn8U3Dz+zYHU/v2EWaAAEC3ykws70tDu1/IdrbZpQq3ZhSOlQaliNAgAABAgQIECBAgAABAgQmTkAR1MRZ64kAAQIECBAgQIAAAQIECFxQIOdcFRMsLOGxEKhETYZAawvs3dYf1y0u+pHzDdzQaCHUqdaWNHsCBAgQIECAAAECBL5PIOc8PyKqdx6zSqX2HXwjejf3lcblCBBoIYHOu+6Ih7q7Smf8aUQsSil511EqKEeAAAECBAgQIECAAAECBCZIQBHUBEHrhgABAgQIECBAgAABAgQIXEgg57wpIh4t0Tn20SfnToFyESBA4GIEqt2R9w72x4KrrriY2N/fezil1FGnAVkCBAgQIECAAAECBJpXIOc8OyKqU1WKd2Co3nus7OqJM8MjzQtlZgQIjKtAzY1fnkopdY/rgDRGgAABAgQIECBAgAABAgQIjLuAIqhxJ9UgAQIECBAgQIAAAQIECBAYm0DOeVFEHBnb3effddvq++Pohx+XxuUIEGhhgWuuvvJcIVR724w6CrtSSp11GpAlQIAAAQIECBAgQKA5BXLOByLi9tLZDY+cjY7ldyuAKgWUI9CiAnMvnxOv7dle533HjSmlqoDTRYAAAQIECBAgQIAAAQIECExRAUVQU/TBGBYBAgQIECBAgAABAgQINL9Azrn6g/qSkpk+s2N3PL1jV0lUhgABAucErr92YTw/2F9X496U0s66jcgTIECAAAECBAgQINA8AjnngYh4sHRGVQFUdQKUjV9KBeUItLZA5113xEPdXaUIQymlauMqFwECBAgQIECAAAECBAgQIDBFBRRBTdEHY1gECBAgQIAAAQIECBAg0NwCOefuiNhaMssTJz+PjmV3l0RlCBAg8DcCNRcGfdOWXZJ9rggQIECAAAECBAgQOCeQc65Oi32uDkfv5i2x7+DrdZqQJUCgxQWq06AWXHVFqcJjKaVNpWE5AgQIECBAgAABAgQIECBAoLECiqAa66t1AgQIECBAgAABAgQIECBwnkDOeX5EfBARs0p47unqiXffHyqJyhAgQOA8gb6NvbFi6c11ZE5HREdKqfq55iJAgAABAgQIECBAoEUFcs7V6SnVqddF7zsqNidft+iHx7QJjLPANVdfGa/u/l2dVhd7z1GHT5YAAQIECBAgQIAAAQIECDROQBFU42y1TIAAAQIECBAgQIAAAQIELiiQc64WBC0p4dn10r54YuuzJVEZAgQIfKdAzR2Sq3arysyqEOoUZgIECBAgQIAAAQIEWk8g5zw7Io7XKYB68+13Yt2GR1oPz4wJEGiIwG/vWxO/uW91adtDKaWqsNNFgAABAgQIECBAgAABAgQITDEBRVBT7IEYDgECBAgQIECAAAECBAg0t0DOeVlE7C+Z5YmTn8dtq9bGmeGRkrgMAQIEvlNgZntbvLpne8ydc1kdpVdSStXPOBcBAgQIECBAgAABAi0kMFoAVW34srB02sc++iRWdvV451EKKEeAwAUFam76sj6lNICWAAECBAgQIECAAAECBAgQmFoCiqCm1vMwGgIECBAgQIAAAQIECBBoYoG6uyLf09UT775fHbbiIkCAwPgLXHP1lbF3sD/a22bUafyplFJ3nQZkCRAgQIAAAQIECBCYXgI5550RsaZ01MMjZ+PWVWvjxGcnS5uQI0CAwAUFrr92YTw/2F+qczoiFqWUqlPuXAQIECBAgAABAgQIECBAgMAUEVAENUUehGEQIECAAAECBAgQIECAQPML5JwPRMTtJTN98+13Yt2GR0qiMgQIEBizwK+X3BCDfY+P+f7vuPHelFK1CNJFgAABAgQIECBAgECTC+ScN0XEo3Wmedvq++Pohx/XaUKWAAEC3ynw8PoHYs2dK0qFDqeUOkrDcgQIECBAgAABAgQIECBAgMD4CyiCGn9TLRIgQIAAAQIECBAgQIAAgfMEcs7LImJ/CU21I3LH8rvjzPBISVyGAAECFyXQedcd8VB310VlLnDz4pTSB3UbkSdAgAABAgQIECBAYOoK5Jw7I+K5OiPs3bwl9h18vU4TsgQIEPhegZntbfHqnu0xd85lpVLrU0oDpWE5AgQIECBAgAABAgQIECBAYHwFFEGNr6fWCBAgQIAAAQIECBAgQIDAeQI559kRURUDzCvh6ep9JH5/+J2SqAwBAgSKBPo29saKpTcXZUdDpyNiUUrpeJ1GZAkQIECAAAECBAgQmJoCOedFEXEoImaVjnDXS/viia3PlsblCBAgMGaB669dGM8P9o/5/r+7sXrHMT+ldKq0ATkCBAgQIECAAAECBAgQIEBg/AQUQY2fpZYIECBAgAABAgQIECBAgMAFBXLO1U6hD5bwvPn2O7FuwyMlURkCBAgUC1S7JO8d7I8FV11R3EZEDEVEh0VCdQhlCRAgQIAAAQIECEw9gdHNXqoND4oLoLzvmHrP1YgINLtAzQ1fXkkpLWt2I/MjQIAAAQIECBAgQIAAAQLTQUAR1HR4SsZIgAABAgQIECBAgAABAtNWIOfcERFvlUxgeORs3LpqbZz47GRJXIYAAQK1BKpCqEP7X4j2thl12rFIqI6eLAECBAgQIECAAIEpJjBaAFWdALWwdGjHPvokVnb1xJnhkdIm5AgQIHDRAuPwnmN5SunARXcsQIAAAQIECBAgQIAAAQIECIyrgCKoceXUGAECBAgQIECAAAECBAgQ+HeB0YVBH0TEvBKXJwcGY+eLL5dEZQgQIDAuAtdcfeW5E6FqFkI9llLaNC4D0ggBAgQIECBAgAABApMqkHPeGRFrSgdhw5dSOTkCBMZD4NdLbojBvsdLmzodEfOdeF3KJ0eAAAECBAgQIECAAAECBMZHQBHU+DhqhQABAgQIECBAgAABAgQInCeQc64W/T9aQvPekaFYua6nJCpDgACBcRVYsfSW6Nu4oW6b96aUqsWSLgIECBAgQIAAAQIEpqlAzrk7IrbWGf5tq++Pox9+XKcJWQIECNQS2Lbl8bjpVzeUtrErpdRZGpYjQIAAAQIECBAgQIAAAQIE6gsogqpvqAUCBAgQIECAAAECBAgQIHCeQM55UUQcKaGxK3KJmgwBAo0U+O19a+I3962u00W1W3JHSqk6Hc9FgAABAgQIECBAgMA0E8g5L4uI/XWG3bt5S+w7+HqdJmQJECBQW2Bme1sc2v9CnVOvb0wpHao9EA0QIECAAAECBAgQIECAAAECRQKKoIrYhAgQIECAAAECBAgQIECAwPcL5Jyrhf4LS5ye2bE7nt6xqyQqQ4AAgYYJ9G3sjRVLb67TflUINT+ldKpOI7IECBAgQIAAAQIECEyswOhGL9WC/1mlPe87+Eb0bu4rjcsRIEBgXAVqnnr9aUQs8n5jXB+JxggQIECAAAECBAgQIECAwJgFFEGNmcqNBAgQIECAAAECBAgQIEBgbAI5500R8ejY7v7bu4599EncumptSVSGAAECDRWodkreO9gfC666ok4/Q6MnQimEqqMoS4AAAQIECBAgQGCCBHLOsyOi2uhlXmmX7x0ZipXrekrjcgQIEGiIwN5t/XHd4qI9rKrxPJVS6m7IwDRKgAABAgQIECBAgAABAgQIfK+AIigfEAIECBAgQIAAAQIECBAgMI4COef5EfHPpU3etvr+OPrhx6VxOQIECDRUYO7lc+K1PdujvW1GnX52pZQ66zQgS4AAAQIECBAgQIDAxAjUOem6GmG12cvKrp44MzwyMQPWCwECBMYoMA7vOG5MKVWn5LkIECBAgAABAgQIECBAgACBCRRQBDWB2LoiQIAAAQIECBAgQIAAgeYXyDlXf/heUjLTZ3bsjqd37CqJyhAgQGDCBK65+sp4dffv6vb3WEqpOjXPRYAAAQIECBAgQIDAFBXIOe+MiDWlwxseOXuuAMpmL6WCcgQINFqg86474qHurtJuhlJKi0rDcgQIECBAgAABAgQIECBAgECZgCKoMjcpAgQIECBAgAABAgQIECBwnkDOuTsitpbQnDj5eXQsu7skKkOAAIEJF1ix9Jbo27ihbr/LU0oH6jYiT4AAAQKTL5Bznp1SOjX5IzECAgQIEBgvgTrvOL4Zwz1dPfHu+0PjNSTtECBAoCECe7f1x3WLF5a2bZOXUjk5AgQIECBAgAABAgQIECBQKKAIqhBOjAABAgQIECBAgAABAgQIfFsg5zw/Ij6IiFklMhYGlajJECAwmQIPr38g1ty5os4QTkdER0qp+tnpIkCAAIFpKjC6SL463e94RHSnlKqTUV0ECBAgMI0Fcs7LImJ/nSn0bt4S+w6+XqcJWQIECEyIwDiceL3Yu40JeVQ6IUCAAAECBAgQIECAAAEC5wQUQfkgECBAgAABAgQIECBAgACBcRDIOVeLPZeUNLXrpX3xxNZnS6IyBAgQmFSBbVsej5t+dUOdMXwaEYucHlKHUJYAAQKTI5Bz7oiInREx7+9G8MpoMVRVFOUiQIAAgWkmkHNeFBHVO46iTV6q6e47+Eb0bu6bZjM3XAIEWlngt/etid/ct7qUYCilVP3sdBEgQIAAAQIECBAgQIAAAQITIKAIagKQdUGAAAECBAgQIECAAAECzS1QZ4fkEyc/j9tWrY0zwyPNjWR2BAg0pcDM9rbYO9gfC666os78LBaqoydLgACBCRYYPQF1ICJu/56uq9P+qnsGFLpO8APSHQECBGoI5Jxnj55y/fcFrmNu9b0jQ7FyXc+Y73cjAQIEporAa3u213m/sT6lVH3/dREgQIAAAQIECBAgQIAAAQINFlAE1WBgzRMgQIAAAQIECBAgQIBAcwuMLhCqdrkv2iH5nq6eePf9oeZGMjsCBJpaYO7lc6JaKNTeNqPOPHellDrrNCBLgAABAo0VGP3e2x0Rj15ET9WJf90ppQMXkXErAQIECEySQJ1TrqshH/vok1jZ1WOjl0l6frolQKCewDVXXxmv7v5daSPVJgDVSddOQy0VlCNAgAABAgQIECBAgAABAmMUUAQ1Rii3ESBAgAABAgQIECBAgACBCwnknKsFnd+3C/53wr359juxbsMjYAkQIDDtBa6/dmE8P9hfdx52Ta4rKE+AAIEGCeScq0LVTRFRejLI4YjotCi0QQ9IswQIEBgHgZzzzohYU9rU8MjZcwVQRz/8uLQJOQIECEy6wMPrH4g1d64oHcfhlFJHaViOAAECBAgQIECAAAECBAgQGJuAIqixObmLAAECBAgQIECAAAECBAicJ5BzXhYR+0toqsVBHcvvtjtyCZ4MAQJTUmDF0luib+OGumNb7rSQuoTyBAgQGD+BnHO1iLMqfloyTq0+VbWXUjo1Tu1phgABAgTGQWC02PW5Ok056bqOniwBAlNFYGZ7W7y6Z3vMnXNZ6ZBs8FIqJ0eAAAECBAgQIECAAAECBMYooAhqjFBuI0CAAAECBAgQIECAAAEC3xbIOc+OiA9Kd8Pv6n0kfn/4HagECBBoKoG+jb2xYunNdeZ0OiI6UkrVz1cXAQIECEySwOh33YE6J4J8z9Crn/XdKaXqxBEXAQIECEyywGjB61t1hvHkwGDsfPHlOk3IEiBAYMoI1DztuvquO1/R/5R5nAZCgAABAgQIECBAgAABAk0ooAiqCR+qKREgQIAAAQIECBAgQIBA4wVyztWi0AdLenrvyFCsXNdTEpUhQIDAlBfYu60/rlu8sM44h0YLoZwSUkdRlgABAoUCOefq5KfuiJhV2MRYY9XP+6oY6tBYA+4jQIAAgfEVyDkviojq53Dxz/x9B9+I3s194zswrREgQGCSBR5e/0CsuXNF6SheSSktKw3LESBAgAABAgQIECBAgAABAt8voAjKJ4QAAQIECBAgQIAAAQIECFykQJ1dkodHzsatq9bGic9OXmSvbidAgMD0EJjZ3hZ7B/tjwVVX1Bnw4ZRSR50GZAkQIEDg4gRGv+NWpzPNu7hk7bt3RcSmlNLx2i1pgAABAgTGLDB66l9VAFW8g8Gxjz45947DRYAAgWYTqN5tHNr/QrS3zSid2vKU0oHSsBwBAgQIECBAgAABAgQIECDw3QKKoHw6CBAgQIAAAQIECBAgQIDARQiMLhL6oHRx6JMDg7HzxZcvoke3EiBAYPoJXHP1lecKoWosFqomvSul1Dn9Zm/EBAgQmF4COef5EVEVPy2ZxJGfjoiBlFJ1CpWLAAECBCZAIOdcFUAV/+w/cfLzuG3V2jgzPDIBo9UFAQIEJl7g10tuiMG+x0s7rr7fzk8pOeW6VFCOAAECBAgQIECAAAECBAh8h4AiKB8NAgQIECBAgAABAgQIECBwEQI552ph5qMXEfnrre8dGYqV63pKojIECBCYdgLXX7swnh/srzvue1NK1cJ8FwECBAiMs8BocX/13fbBcW66TnOfRkS3XfPrEMoSIEDghwVyztV37DU/fOeF76hOuV7Z1RNHP/y4tAk5AgQITAuBbVsej5t+dUPpWG3uUionR4AAAQIECBAgQIAAAQIEvkdAEZSPBwECBAgQIECAAAECBAgQGKNAznlRRBwZ4+3n3daxfGWc+OxkaVyOAAEC006g86474qHurrrjvjGlVO1S7yJAgACBcRLIOVcn7Q1ExKxxanK8mzkcEZ0ppePj3bD2CBAg0OoCo78Dnqvj0NX7SPz+8Dt1mpAlQIDAtBCY2d4Wh/a/UOeka+80psWTNkgCBAgQIECAAAECBAgQmE4CiqCm09MyVgIECBAgQIAAAQIECBCYVIGc8wcRsbBkEM/s2B1P79hVEpUhQIDAtBbo29gbK5beXGcOpyOiI6VU/Qx2ESBAgEANgZxzx2jxU9F32hpdl0Yfq8abUjpV2oAcAQIECPy7wOjvgbfqmDw5MBg7X3y5ThOyBAgQmFYCK5beEn0bN5SOuTrpdJHvs6V8cgQIECBAgAABAgQIECBA4HwBRVA+FQQIECBAgAABAgQIECBAYAwCOedNEfHoGG4975ZjH30St65aWxKVIUCAQFMIvLZneyy46oo6cxkaLYSyCL6OoiwBAi0rkHOeHxHV99k10xChKobtTintnIZjN2QCBAhMGYHR062rE1aLTwHcd/CN6N3cN2XmZCAECBCYKIG92/rjusXF+wg8lVLqnqix6ocAAQIECBAgQIAAAQIECDS7gCKoZn/C5keAAAECBAgQIECAAAECtQVGF41WJ5AULRS6bfX9cfTDj2uPQwMECBCYrgIz29vi1T3bY+6cy+pM4ZWU0rI6DcgSIECgFQVGi/mrRZdF32XHYvbp8Ncx+9L/ELMuaeifnQ5XhVwppWoBv4sAAQIELkIg5zw7Iqqfn8Ur+G3wchHgbiVAoOkE5l4+J6oNXtrbZpTO7UbfY0vp5AgQIECAAAECBAgQIECAwN8KNPSvUbAJECBAgAABAgQIECBAgEAzCOScq4VCS0rm8syO3fH0jl0lURkCBAg0lcA1V18Zewf76ywYqjzsntxUnwqTIUCgkQI556pwdCAi5jWqn9Nf5dj03tkYGPoiZl+aYuAX7bFmwU8a1d037VZfrquToZwO2Ghp7RMg0DQCOecDEXF76YROnPw8blu1Ns4Mj5Q2IUeAAIFpL9B51x3xUHdX6Tw+TSlVp7O6CBAgQIAAAQIECBAgQIAAgZoCiqBqAooTIECAAAECBAgQIECAQHML5JyrXfO3lszSIqESNRkCBJpZ4NdLbojBvsfrTvHelNLOuo3IEyBAoFkFcs6LRoufior4x+ry1NAXsemfzsapL/PfRDrmXhKbrpsRS37247E2VXLf6WqOKaVNJWEZAgQItJJAzrkqiH2wdM7DI2djZVePE65LAeUIEGgqgb3b+uO6xcWH6j3m+2tTfRxMhgABAgQIECBAgAABAgQmSUAR1CTB65YAAQIECBAgQIAAAQIEpr5AzrnanfODiJhVMtp7unri3feHSqIyBAgQaFqBmjsnf+OyOKVU/Xx2ESBAgMCoQM55dkRURUHFC93Hgnn4T3+J7j8Mxwf/+m/fe3vngp/EwC/bY9YlDf1T1KcR0ZlSqk5udREgQIDA3wnknDsj4rk6ML2bt8S+g6/XaUKWAAECTSNQnXL96u7f1ZmP9xl19GQJECBAgAABAgQIECBAgEBENPQvT4QJECBAgAABAgQIECBAgMB0Fsg5H4iI20vmsOulffHE1mdLojIECBBoeoG+jb2xYunNdeZZnQCyKKV0vE4jsgQIEGgWgdHTS6sCqKLi/bE4fDr8dXT/cSQO/I8vx3L7uXtmX5pi089nxIMLfzrmTOGNh0eLofxeKAQUI0Cg+QRGTwY8Umdmz+zYHU/v2FWnCVkCBAg0ncBv71sTv7lvdem8hlJK1cmtLgIECBAgQIAAAQIECBAgQKBQQBFUIZwYAQIECBAgQIAAAQIECDS3QM55WUTsL5nliZOfx22r1saZ4ZGSuAwBAgSaXmBme1vsHeyPBVddUWeu1VF7HSmlU3UakSVAgMB0Fsg5d0TEQEQsbNQ8Tn+VY2Doi3P/nPoyF3Uzv/1HsfOmmbHkZz8uyl9E6LHKw++GixBzKwECTSlQ92TrCmXfwTeid3NfU/qYFAECBOoKvLZne513Go+llKoNDFwECBAgQIAAAQIECBAgQIBAgYAiqAI0EQIECBAgQIAAAQIECBBoboGc8+yIqHaRL9pJv6v3kfj94XeaG8nsCBAgUFOgKoQ6tP+FaG+bUaelV1JKVdGqiwABAi0lMLq4vSp+Kjq1dKyZ1JhnAAAgAElEQVRYu479OTa9dzaOD3891sj33rfsP18aA79oi3ntPxqX9r6jkU8jYlNKaWcjO9E2AQIEpqrA6DuNQ3UKZI999Ems7OqxuctUfcjGRYDApAtcc/WV8eru35WOw+nWpXJyBAgQIECAAAECBAgQIEAgIhRB+RgQIECAAAECBAgQIECAAIG/E8g5HyhdUPrm2+/Eug2PMCVAgACBMQhUi4aqE6FqFkLZQXkM1m4hQKA5BEYXtndHRPVPUcH+WCSG/vXfovuPI3HoxFdjuf2i79l03YzoXvjTmHVJQ/9MdbhySil9cNEDFCBAgMA0FqjzTqOa9vDI2ehYfrcCqGn8GTB0AgQmRuDh9Q/EmjtXlHZ2OKVUnerqIkCAAAECBAgQIECAAAECBC5SoKF/XbrIsbidAAECBAgQIECAAAECBAhMukDOufrj81slA7FQqERNhgCBVhdYsfSW6Nu4oS7DvU78qEsoT4DAVBfIOXdWJxxFxLxGjfX0Vzm6/zAcO4/9uVFd/LXd+e0/iqoYas2CnzS6r12jxVCnGt2R9gkQIDDZAjnn6pTAB0vHUb3XqE6AOvrhx6VNyBEgQKBlBKoTrl/dsz3mzrmsdM7rU0rVz20XAQIECBAgQIAAAQIECBAgcBECiqAuAsutBAgQIECAAAECBAgQINDcAqM761c7xRctLO3qfSR+f/id5kYyOwIECDRA4Lf3rYnf3Le6TsunI6LDaR91CGUJEJiqAjnnRRFRLY5c0sgxPjX0RWz6p7Nx6svcyG7Oa7tj7iUx8Iu2WPiP/9DIfqvfE5ssMm0ksbYJEJhsgdFi2efqjKN385bYd/D1Ok3IEiBAoKUErr92YTw/2F865+o76qKU0vHSBuQIECBAgAABAgQIECBAgEArCiiCasWnbs4ECBAgQIAAAQIECBAgcEGBOjsmv3dkKFau6yFLgAABAoUCfRt7Y8XSmwvT52LV4qH5KSUnfdRRlCVAYMoIjBboV8VPaxo5qMN/+kt0vnkmjg9/3chufrDtzgU/iYFftsesSxr6p6tPI6IzpXToBwfkBgIECEwjgdGC2SN1hvzMjt3x9I7q8DwXAQIECFyMwMPrH4g1d664mMi3730lpbSsNCxHgAABAgQIECBAgAABAgRaUaChf0lqRVBzJkCAAAECBAgQIECAAIHpKZBz7oiIt0pGPzxyNm5dtTZOfHayJC5DgAABAhExs70t9g72x4KrrqjjMTR6IpRCqDqKsgQITLpAzrm7OrkoImY1ajCfDn8dnf99OA6d+KpRXVx0u7MvTbHp5zPiwYU/vejsRQZeiYhuu+5fpJrbCRCYkgKjRbPVKSLFvzP2HXwjejf3Tcn5GRQBAgSmukD1PuPQ/heivW1G6VCXp5QOlIblCBAgQIAAAQIECBAgQIBAqwkogmq1J26+BAgQIECAAAECBAgQIHBBgZxztWBoXgnPkwODsfPFl0uiMgQIECDwLYG5l8+J1/Zsr7NwqGptV0qpEywBAgSmo8BoYf7O0u+lY5nz6a9yDAx9EZveOzuW2yflnkX/+A/nToVa8rMfN7r/xyJiwCmCjWbWPgECjRIYLYCqTrdbWNrHsY8+iZVdPXFmeKS0CTkCBAi0vMCvl9wQg32Plzo42bpUTo4AAQIECBAgQIAAAQIEWlJAEVRLPnaTJkCAAAECBAgQIECAAIFvC+Scq132Hy1Ree/IUKxc11MSlSFAgACBCwhcc/WV8eru39W1eSylVP1sdxEgQGBaCOSc50dEVfy0pJED3nXsz9H9x+E49WVuZDfj1vay/3xpDPyiLea1/2jc2rxAQ5+Ongpl9/1GKmubAIGGCOScq98da0obd7J1qZwcAQIEzhfYtuXxuOlXN5TSvJJSWlYaliNAgAABAgQIECBAgAABAq0koAiqlZ62uRIgQIAAAQIECBAgQIDAeQI550URcaSUpmP5yjjx2cnSuBwBAgQIXEBgxdJbom/jhro2y1NKFrTXVZQnQKChAqMneHSXFuSPdXCH//SXcyc/HTrx1VgjU+a+2Zem6F7403P/zLqkoX/WOjxaDPXBlJm8gRAgQOB7BOps6PJNs7etvj+OfvgxZwIECBAYB4GZ7W1xaP8LdU63vjGlVJ3u5yJAgAABAgQIECBAgAABAgS+R6Chfy0iT4AAAQIECBAgQIAAAQIEprpAzrla5LiwZJzP7NgdT+/YVRKVIUCAAIEfEHh4/QOx5s4VdZxOR0RHSsli9jqKsgQINEwg59wZEQMRMatRnZz+Kkf3H4Zj57E/N6qLCWt3fvuPYuCXbXH7f7q00X0+FRGbUkqnGt2R9gkQIFAqMPo75LnSfJXr3bwl9h18vU4TsgQIECDwdwI1N3WpTihd5HuojxUBAgQIECBAgAABAgQIEPh+AUVQPiEECBAgQIAAAQIECBAg0LICdXZNPvbRJ3HrqrUta2fiBAgQmAiBbVsej5t+dUOdriwgqqMnS4BAQwRyzh1VkU1ELGlIB6ONPvZPZ2Ng6Is49WVuZDcT3nbH3Eti4BdtsfAf/6GRfVeFtFUhVFWk5iJAgMCUEhg90bo6KaS4iHbXS/viia3PTql5GQwBAgSaRWDvtv64bnHRnlsVwVMppeqkWBcBAgQIECBAgAABAgQIECDwHQKKoHw0CBAgQIAAAQIECBAgQKAlBXLO8yOiOh2kaNHQbavvj6MfftySdiZNgACBiRKY2d4Wewf7Y8FVV9TpciiltKhOA7IECBAYD4Gc8+zRk5/WjEd739XGK//8ZXT/YSSOD3/dyG4mve3uhT+NTdfNiFmXNPRPXUMR0Z1SqooNXAQIEJh0gdHfJcdL32VUE3jz7Xdi3YZHJn0uBkCAAIFmFZh7+Zx4bc/2aG+bUTrFG33/LKWTI0CAAAECBAgQIECAAIFWEGjoX4ZaAdAcCRAgQIAAAQIECBAgQGB6CuScq4WMRbvvP7Njdzy9Y9f0nLhREyBAYJoJjMPioWrGu1JKndNs6oZLgEATCYyeQFrt6F5UgD8Wik+Hv47O/z4ch058NZbbm+Ke2Zem2PTzGfHgwp82ej6vjBZDVYUHLgIECEyKwGgBVPUuo/h4kepU65VdPXFmeGRS5qBTAgQItIpA5113xEPdXaXT/TSlVG3g5SJAgAABAgQIECBAgAABAgQuIKAIyseCAAECBAgQIECAAAECBFpOIOdcLUDdWjLxEyc/j9tWrbVgqARPhgABAoUC11+7MJ4f7C9M/zW2PqU0ULcReQIECFyMQM552ejpT/MuJncx957+Ksem987GwNAXFxNrqnsX/eM/xMAv22PJz37cyHmdHn2WAymlU43sSNsECBC4kEDOeWdEFJ8mODxyNm5dtTZOfHYSMAECBAhMgMDebf1x3eLiutXHUkqbJmCYuiBAgAABAgQIECBAgAABAtNOQBHUtHtkBkyAAAECBAgQIECAAAECdQRyztUumh+U7sJ/T1dPvPv+UJ0hyBIgQIBAgcCKpbdE38YNBcm/iSxPKR2o24g8AQIEfkhg9DtntVi96OTRH2r/m3+/69ifo/uPw3HqyzzWSFPf17ngJ7Hpuhkxr/1HjZznp6OnQvl90khlbRMg8DcCoycKPlqH5bbV98fRDz+u04QsAQIECFyEwDVXXxmv7v7dRSTOu3VxSql6j+0iQIAAAQIECBAgQIAAAQIEviWgCMrHgQABAgQIECBAgAABAgRaSiDnXC1WvL1k0rte2hdPbH22JCpDgAABAuMg0LexN1YsvblOS9UpHh0WEdUhlCVA4PsEcs6zI6Lasf3BRkod/tNfovsPw/HBv/5bI7uZlm3PvjRF98KfxqM/n9Ho8R+OiM6U0vFGd6R9AgRaW2D0VMH9dRR6N2+JfQdfr9OELAECBAgUCPz2vjXxm/tWFyTPRYZSSotKw3IECBAgQIAAAQIECBAgQKBZBRRBNeuTNS8CBAgQIECAAAECBAgQOE+gzsKh4ZGz0bH87jgzPEKWAAECBCZRYO+2/rhu8cI6I6iO86sKoU7VaUSWAAECfy+Qc+6MiIHSE0fHIvrp8NfR/ceROPA/vhzL7S19z/z2H8XAL9vi9v90aaMdnqoK3/xeaTSz9gm0pkDOuVr8fqjO7xYburTmZ8esCRCYOgKv7dkeC666onRAj6WUqk0WXAQIECBAgAABAgQIECBAgMCogCIoHwUCBAgQIECAAAECBAgQaAmB0V35q13aZ5VMuKv3kfj94XdKojIECBAgMI4CM9vbYu9gf50FRNVoDqeUOsZxWJoiQKCFBXLO1c+TqvipVoXm9xGe/irHwNAX5/459WVuYe2Ln3rH3Eti539tj3ntP7r48NgT1UmD3SmlnWOPuJMAAQLfLzD6HuODiJhXavXekaFYua6nNC5HgAABAuMgcM3VV8aru39X2lL1PXOR00dL+eQIECBAgAABAgQIECBAoBkFFEE141M1JwIECBAgQIAAAQIECBA4TyDnfCAibi+hefPtd2LdhkdKojIECBAg0ACBagFRVQjV3jajTuu7UkrVqS0uAgQIFAnknOePFj8Vfccca6ev/POX0f2HkTg+/PVYI+67gED3wp/GputmxKxLGvqnseq0waoYqjq1xUWAAIFaAjnnqgCquMD22EefxMquHida13oKwgQIEBgfgYfXPxBr7lxR2piNXErl5AgQIECAAAECBAgQIECgKQUa+peephQzKQIECBAgQIAAAQIECBCYdgKju/O/VTLw4ZGz0bH8bouGSvBkCBAg0ECB669dGM8P9tft4V6ndtQllCfQegKjJ3N0V8UupaeMjkVt6F//Lbr/OBKHTnw1ltvdMwaB2ZemGPhFe6xZ8JMx3F3rll0RscmO/bUMhQm0tEDOuTpZbk0pQvUuoyqAOvrhx6VNyBEgQIDAOApUp1q/umd7zJ1zWWmr61NK1emzLgIECBAgQIAAAQIECBAg0PICiqBa/iMAgAABAgQIECBAgAABAs0tMLpItdo9eV7JTHs3b4l9B18vicoQIECAQIMFOu+6Ix7q7qrby41O7KhLKE+gdQRyzstGT38q+m45FqnTX+XY9N7ZGBj6Yiy3u6dAYNE//kMM/LI9lvzsxwXpMUdOV5+VlNKmMSfcSIAAgYjIOVdFtlvrYNzT1RPvvl8dTuciQIAAgakiUHMzl+q75SJF9lPlaRoHAQIECBAgQIAAAQIECEymgCKoydTXNwECBAgQIECAAAECBAg0XCDnXO2Q+WBJR+8dGYqV63pKojIECBAgMEECfRt7Y8XSm+v0Vi0k6kgpVQWzLgIECFxQIOe8aLT4aUkjiZ4a+iI2/dPZOPVlbmQ32h4V6Fzwk3PFULMuaeifyz6tTg1LKR0AT4AAgR8SGC223f9D933fv7eZSx09WQIECDRW4OH1D8SaO1eUdvJKSqnalMFFgAABAgQIECBAgAABAgRaWqChf9VpaVmTJ0CAAAECBAgQIECAAIFJF8g5d0TEWyUDGR45G7euWhsnPjtZEpchQIAAgQkUeG3P9lhw1RV1eqy2ya8KoU7VaUSWAIHmExg9VbQ6yaeoqH6sIof/9JfofPNMHB/+eqwR942TwOxLU3Qv/Gk8+vMZ49TidzZzOCI67d7faGbtE5i+AqMFt4ciYlbpLPYdfCN6N/eVxuUIECBAoMECM9vb4tU922PunMtKe1quuL6UTo4AAQIECBAgQIAAAQIEmkVAEVSzPEnzIECAAAECBAgQIECAAIHzBHLO1akeC0tonhwYjJ0vvlwSlSFAgACBCRYYh0VE1YjtqDzBz013BKa6QM65OyKqAqjixeg/NMdPh7+O7j+OxIH/8eUP3erfN1hgfvuPYudNM2PJz37c4J7isepUMYW3jWbWPoHpJTBadFu9w5hXOnKnWZfKyREgQGBiBX695IYY7Hu8tNPqNOv5vkuW8skRIECAAAECBAgQIECAQDMIKIJqhqdoDgQIECBAgAABAgQIECBwnkDOuVqw+mgJjYVDJWoyBAgQmFyBa66+MvYO9kd7W62TPJ5KKVVFDy4CBFpYYPQ00Z11FqL/EN/pr3IMDH0Rm947+0O3+vcTLNAx95LY+V/bY177jxrZc7V4tTulVH3OXAQIEIg6m7hUfMc++iRWdvXEmeERmgQIECAwDQS2bXk8bvrVDaUjtYlLqZwcAQIECBAgQIAAAQIECDSFgCKopniMJkGAAAECBAgQIECAAAEC3xbIOS+KiCOlKretvj+OfvhxaVyOAAECBCZJoOZuyt+M+l6L0ifpAeqWwCQL5JznVyf0RMTtjRzKrmN/Plf8dHz460Z2o+2aApuumxHdC38asy5p6J/SDlenjaWUDtUcrjgBAtNYIOdcFUSuKZ3C8MjZcwVQ3mOUCsoRIEBg4gWqE60P7X+hzkYuN/oOOfHPTY8ECBAgQIAAAQIECBAgMDUEGvqXm6kxRaMgQIAAAQIECBAgQIAAgVYTqLOD8jM7dsfTO3a1Gpn5EiBAoGkEOu+6Ix7q7qo7n8UppQ/qNiJPgMD0EMg5z65O5Sk9RXSsszz8p7+cK346dOKrsUbcN8kCsy9NMfCL9liz4CeNHkn1PyDVyVCnGt2R9gkQmFoCOefOiHiuzqju6eqJd98fqtOELAECBAhMgkDNjVw+jYhFvj9OwoPTJQECBAgQIECAAAECBAhMuoAiqEl/BAZAgAABAgQIECBAgAABAuMpkHOuFrBuLWnz2EefxK2r1pZEZQgQIEBgCgn0beyNFUtvrjOi06OLiY7XaUSWAIGpLzC6+HxTRMxr1GhPf5Wj+w/DsfPYnxvVhXYbLNAx95KoToZa8rMfN7Kn6nfPQEqp+jy6CBBoAYGcc0dEvFVnqk8ODMbOF1+u04QsAQIECEyiwN5t/XHd4oWlI3gqpVS9C3cRIECAAAECBAgQIECAAIGWElAE1VKP22QJECBAgAABAgQIECDQ3AI55/kRUZ3cMatkpretvj+OfvhxSVSGAAECBKaQwMz2ttg72B8Lrrqizqiq7fQ77Kpch1CWwNQVGF14XhWbLGnkKB/7p7MxMPRFnPoyN7IbbU+QQOeCn8TAL9tj1iUN/fNatat/Z0rp0ARNSzcECEyCQM55UURU/50Xvb+ohrzv4BvRu7lvEkavSwIECBAYL4G5l8+J1/Zsj/a2GaVN3uh7YymdHAECBAgQIECAAAECBAhMV4GG/pVmuqIYNwECBAgQIECAAAECBAhMT4Gcc7WAqGgh666X9sUTW5+dnhM3agIECBA4T6AqhDq0/4U6C4mqNl9JKS3DS4BA8wjknGdXp+1ExJpGzurwn/4SnW+eiePDXzeyG21PgsDsS1Ns+vmMeHDhTxvd++HRYiinEjZaWvsEJlhg9HdR9f6i+OgPJ1lP8EPTHQECBBoo0HnXHfFQd1dpD5+mlKqNwVwECBAgQIAAAQIECBAgQKBlBBRBtcyjNlECBAgQIECAAAECBAg0t0DOuTsitpbM8sTJz+O2VWvjzPBISVyGAAECBKaowDVXX3nuRKgaOypXM3sspVSdFuMiQGCaC+Scq/+Wq++Mxadu/BDBp8NfR+d/H45DJ776oVub5t//L5//P/Efh/5b/Fvb/xr/8l/WxP+8pOHFQVPCbn77j2LnTTNjyc9+3OjxPFYV7jmZsNHM2icwcQJ1NnCpRukdxsQ9Kz0RIEBgogT2buuP6xYX18Z6bzFRD0o/BAgQIECAAAECBAgQIDAlBBRBTYnHYBAECBAgQIAAAQIECBAgUEdgdBflaof0ogWt93T1xLvvD9UZgiwBAgQITFGBFUtvib6NG+qO7t6U0s66jcgTIDA5Ajnnjoio/hue16gRnP4qx8DQF7HpvbON6mLKtfvjkX+J//h//7do/+Ttv47tf/74p3Hqmv89/t+F/8eUG2+jBrTsP18aA79oi3ntP2pUF1W7n0bEJr+LGkmsbQITI5Bzrn4fFZ9GODxyNlZ29cTRDz+emAHrhQABAgQmRGDu5XPi0P69dfpanFL6oE4DsgQIECBAgAABAgQIECBAYLoIKIKaLk/KOAkQIECAAAECBAgQIEDgOwVyzgci4vYSol0v7Ysntj5bEpUhQIAAgWki8Nv71sRv7ltdZ7SnI6LDgqI6hLIEJl4g5zx/tPhpSSN733Xsz9H9x+E49WVuZDdTpu3/8NUXMfvo/xmzj/5f8R/+8sUFx/VvM/4x/uXna+Ls//Zfpsy4Gz2QTdfNiO6FP41ZlzT0T2+Hq9PM/D5q9NPUPoHGCOScOyPiuTqtd/U+Er8//E6dJmQJECBAYIoK1Hx3MZRSWjRFp2ZYBAgQIECAAAECBAgQIEBgXAUa+peYcR2pxggQIECAAAECBAgQIECAwAUEcs7LImJ/CU61g3LH/8fe/QdXVd/7/n99AkkgyYaUCQ3K9UKLOol3pkEHcKaopPdYvZRREZ3bjgiJM1460GnZ8oeZuS0apD0z4Q/ctFOYcpwxwdKxZxRRh3K09pQIdkbgq6Qzx2RUWjgerCkZGthJMAnk851Puu31B5C919pr77X2fq4Z/sp6vz/v92Nt3cne670+9z6gc8kBL+HEIIAAAghESKBtY4tWLLvDT8VuEGquMabfTxJiEUAgeIHULqFxSY8HuVrnh6OKH0zqWN+FIJcJVe7KD45q5pEOTR7sS6uu87X1+uvX12q0amZa50f9pLmxSXLDUE11U4JupSM1DMV7UtDS5EcgSwKpXQl/7yfdTxLb1f7s835SEIsAAgggEHKBl5/Zqbrr5nmtcpMxptVrMHEIIIAAAggggAACCCCAAAIIREWAIaioXCnqRAABBBBAAAEEEEAAAQQQ+IJA6gbXE5Kme+HhCcpe1IhBAAEEoikwLVal3du3+rmZyDXeldoRipvOo/kyoOoiEEjtspHw+vthOkQnkxfVenhQ7T0fp3N6QZxTfuakao52aGpvt6d++uuW6kzD/Rorq/AUH7WgxtllStxSpYaayUGW7oZzW40x7vXOgQACIRaw1rqdOQ74eW/as+9VtWxuC3GXlIYAAgggkA2B+uuv1Uu7fuE1lfv9cL4xxn1ezoEAAggggAACCCCAAAIIIIBAwQowBFWwl5bGEEAAAQQQQAABBBBAAIHCF7DWtktq8tLpa6+/obWPPuYllBgEEEAAgYgKzL5qltxTlWNVlX466DDGNPtJQCwCCGRfILXDhhsGach+9v+XcdORQSW6htQ/bINcJjS5S0aGNPNoh2LHX/dd01hpxfggVH/9Ut+5opKguW6KErfGNL0s0K/jTkpqNsa4AQsOBBAImUDq4S3uv0/P70897x3XXavWhKwzykEAAQQQCErgBw836fsPr/aavtMY0+g1mDgEEEAAAQQQQAABBBBAAAEEoiAQ6LcuUQCgRgQQQAABBBBAAAEEEEAAgWgKpG50/b2X6pMDg2q89wGdSw54CScGAQQQQCDCAj6fqvxJ55uMMa0RZqB0BApGwFo71+2G43UwPl2IF/88rPjBAZ1IXkw3JPLnzeh6TtXd+1UyOpTVXi5U1qh38Vqdr70hq3nDmqy63Kh1YaXWNwS+C9aLkuI8+T+srwTqKlYBa+1eSfd47f/UR726e9UaPr/wCkgcAgggEEEBt5P1S8/s1OxZtV6rf4TdQr3SEYcAAggggAACCCCAAAIIIBAFAYagonCVqBEBBBBAAAEEEEAAAQQQQOAzAqknKR+TNMcLTcvmLdqz7xUvocQggAACCBSAwIpld6pt46N+O7nXGONuauVAAIE8CVhr3fBTXNL0oEro6rug+KEBHTg1EtQSocs7tfcd1b6xQ5MH+wKtbfCaBepbsFqjVTMDXScsyefXTB7fFWrJ1aVBl7RJUsIY0x/0QuRHAIErC1hr3Q6F6706uQe4rFy3Qd3vvu81BXEIIIAAAhEVuPmmBv1y+1av1Z+VNJ/heK98xCGAAAIIIIAAAggggAACCIRdgCGosF8h6kMAAQQQQAABBBBAAAEEEPiCgJ8biQ6/3aWVazegigACCCBQ5AI/euR7avr2Cj8K7qaiRmOMG8rlQACBHApYa5e7IQ+vA/HplHp2xKr18KASXdndBSmdtfN1TunAaX35Dzs0tbc7pyWc+dp96q//lsbKAt8pKad9XW6x5V8tV+KWKs2JTQqynpOpXaEY1g1SmdwIXEHAWtss6Wk/SDzAxY8esQgggED0BXx+bvGiMcb93cSBAAIIIIAAAggggAACCCCAQMEJMARVcJeUhhBAAAEEEEAAAQQQQACBwhaw1jZK+r2XLt1TlO9atUan/vKRl3BiEEAAAQQKTGDHlid0+22L/XTlbjJ3T1dmtw0/isQikKaAtXZ+avhpSZohnk7b1jWk1iOD6h+2nuKjFlQyMqQZXc+pumd/3kofK61Q38LVOjcv0Eubt/4+v3B1uVG8oWL83/SyQL+q60wNQzGwG5qrTyHFIJB6v3rbT68/e2qXfvpUh58UxCKAAAIIRFxgWqxKLz2zU7Nn1XrthB2svcoRhwACCCCAAAIIIIAAAgggEGqBQL9ZCXXnFIcAAggggAACCCCAAAIIIBBJAWutu4GvwUvxP0lsV/uzz3sJJQYBBBBAoAAF3A1Fu7dvVd118/x012WMcYMZHAggEJCAtbZaUquk9QEtMZ6288NRxQ8mdazvQpDLhCr3tOOdqjmySyWj4djxavhLc8aHoc7X3hAqp6CKmRubpMStVbrnK+VBLfFJ3m3uvyGGdoNmJj8CkrV2riT3ucV0rx579r2qls1tXsOJQwABBBAoIIFvLlms7W1PeO3I7WA9l98BvfIRhwACCCCAAAIIIIAAAgggEFYBhqDCemWoCwEEEEAAAQQQQAABBBBA4AsC1lp38+vjXmgOv92llWs3eAklBgEEEECggAVmXzVLLz+zU7GqSj9ddhhjmv0kIBYBBC4tYK2NpwagPN9MPpHtyeRFxQ8NaO+fhic6tfw5tocAACAASURBVGB+PrX3nfHhp/K/uQ3twnck592mM1+7X6NVM8NXXAAVNc4uU+KWKjXUTA4g+z9Suptg3SBUIshFyI1AMQukhnYPeH1wi7Pree+4Vq7boHPJgWKmpHcEEEAAgU8J+NzF+kVjzHJAEUAAAQQQQAABBBBAAAEEECgkAYagCulq0gsCCCCAAAIIIIAAAgggUMAC1lq3y8bbXlu8e/V31f3u+17DiUMAAQQQKGCBm29q0C+3b/Xb4SPcWO6XkHgE/p+AtbZRkhvW8LQDaDqWZ0esEl1D4//6h206IZE/p3TgtGqO7lLlB0dD38tYaYX665eqv/5bGiurCH292Sgw3lCh1kWVml4W6Nd3XZLixhg3qMGBAAJZFLDW7pV0j9eUyYFBNd77AANQXgGJQwABBApUwO1ifeCFX/l5eMu9xhj3HsWBAAIIIIAAAggggAACCCCAQEEIBPotSkEI0QQCCCCAAAIIIIAAAggggEAoBKy1x7zeBPuzp3bpp091hKIPikAAAQQQCKfAimV3qm3jo36L48Yiv4LEF72AtXZuavjJ803k6SB29Hys1sODOpG8mM7pkT+nZGRI1d2/0Yw/Ph+5Xi5U1uj0wiYNXrMgcrV7Kbi63Kh1YaXWNwQ++PViahjqhJc6iUEAgc8KWGvd4O56ry5uAMrtAMXDW7wKEocAAggUtsA3lyzW9rYnvDbptn+db4zp95qAOAQQQAABBBBAAAEEEEAAAQTCJMAQVJiuBrUggAACCCCAAAIIIIAAAghcUsBaG5f0pBeenveO665Va7yEEoMAAgggUGQCbRtbtGLZHX66Piup0RjjBnc5EEAgAwFrbbUbyEj9m55BaEandvVdUPzQgA6cGskoLsonTzveqRldz2nyYF+U29D52nr1LWjS8Iw5ke4j3eLn10xW4taYllxdmm6Il/Pc+5Yb3EhwU6wXPmIQ+LuAtbZZ0tN+PFo2b9Gefa/4SUEsAggggECBC+zesVWLbvS8Ue42Y4z7e4sDAQQQQAABBBBAAAEEEEAAgcgLMAQV+UtIAwgggAACCCCAAAIIIIBAYQukdgNwN5N7uhn2wXUb9OZbXYWNRHcIIIAAAlkT8HlTkauDJyxn7WqQqFgEUjePt0oKbLrl7IhV/GBS7T0fFwurpva+Mz78NLW3u6B6Ts67TacXNGmsLPCdkkLh1lw3Ra2LKjUnNinIetx7V9wYszfIRciNQCEKWGvnS3rbT2/sXu1Hj1gEEECgeARmXzVLLz+zU7GqSq9Nf8MYc8BrMHEIIIAAAggggAACCCCAAAIIhEWAIaiwXAnqQAABBBBAAAEEEEAAAQQQuKSAtdZ9MbvEC0/Hr/fox0/+3EsoMQgggAACRSowLVal3du3qu66eX4EOo0xjX4SEItAMQikbhx3u9B4+l0vXaNtXUNqPTKo/mGbbkikzysdOK0Zf3xOseOvR7qPKxU/Vlqh/vqlOtNwf8H2+OnGqsuN4g0Venyh5xte03XqlNRsjDmRbgDnIVDMAqldDN1/L54e2uLs9ux7VS2b24qZkd4RQAABBDIQaP7OffphfF0GEZ85lYe2eJUjDgEEEEAAAQQQQAABBBBAIFQCDEGF6nJQDAIIIIAAAggggAACCCCAwKcFrLVxSU96UTn1Ua/uXrVG55IDXsKJQQABBBAoYoH6668dH4Ty8XRlp9dhjGkuYkZaR+CyAqmbxt3wU1OQTJ0fjqr5tXM6kbwY5DKhyu12fqru3q+S0aFQ1RVUMRcqa9S7eK3O194Q1BKhyjs3NkmJW6t0z1fKg65rm6RWY0x/0AuRH4GoCqTey9xDWxq89tDz3nGtXLeBzy28AhKHAAIIFKmAzx2sNxlj3C68HAgggAACCCCAAAIIIIAAAghEVoAhqMheOgpHAAEEEEAAAQQQQAABBApbwO8TlR9ct0FvvtVV2Eh0hwACCCAQmMDNNzXol9u3+s3/kDGm3W8S4hEoJIHUkLu76c7zrhkTeZxMXlT80ID2/ml4olML5ueVHxzVzCMdmjzYVzA9ZdLI+dp6/fXrazVaNTOTsMie2zi7TO3/FNOc2KQgezgrKc77WJDE5I6ygLXW/Y7neZg3OTCou1at0am/fBRlBmpHAAEEEMiDwOyrZunAC7v9rHyjMeaYnwTEIoAAAggggAACCCCAAAIIIJBPAYag8qnP2ggggAACCCCAAAIIIIAAApcVsNbulXSPF6I9+15Vy+Y2L6HEIIAAAggg8A+B5u/cpx/G1/kV+YYxxu0SwIFAUQtYaxsluRvG5wQFcXbEKtE1pNbDg0EtEbq85WdOquZoh6b2doeutnwU1F+3VGca7tdYWUU+ls/5mvGGCrUuqtT0skC/7nNPlnDDULyX5fwKs2BYBay1bpj3cT/13b36u+p+930/KYhFAAEEEChigR883KTvP7zaq0CXMWa+12DiEEAAAQQQQAABBBBAAAEEEMi3QKDfiuS7OdZHAAEEEEAAAQQQQAABBBCIpoC1drmkF7xU756m3HjvAzqXHPASTgwCCCCAAAKfEWjb2KIVy+7wo+J20mjkKct+CImNsoC1dq6khNfh9nR77+j5WPFDSfUP23RDIn1eyciQZnQ9p+qe/ZHuI4jix0orxgeh+uuXBpE+dDmry40St8TUVDcl6No6JLUaY04EvRD5EQizgLW2WdLTfmps2bxFe/a94icFsQgggAACCOjlZ3aq7rp5XiU2GWPcUC8HAggggAACCCCAAAIIIIAAApETYAgqcpeMghFAAAEEEEAAAQQQQACBwhaw1lZLcjfWTffS6bqWx/Tbzje8hBKDAAIIIIDAJQV83ljkcrpdNNwgVD/ECBSLQOp3urjfnTIm8ur8cHR856cDp0YmOrVgfl7dvX98AKpkdKhgegqikeEvzVHfwtU6X3tDEOlDl3N+zWQlbo1pydWlQdbmBnsT3DAbJDG5wyxgrXW7Zrhd0Tx9XuF66/j1Hv34yZ+HuU1qQwABBBCIiED99dfqpV2/8FPtVxhw98NHLAIIIIAAAggggAACCCCAQL4EGILKlzzrIoAAAggggAACCCCAAAIIXFLAWut2Cljvhee119/Q2kcf8xJKDAIIIIAAApcVmBar0kvP7NTsWbV+lDqNMY1+EhCLQFQEUrtkuN/pPN8kPlGvZ0es4geTau/5eKJTC+bnU3vfUe0bOzR5sK9gespFI4PXLFDfgtUarZqZi+XyvkZz3ZTxYajpZYF+BXhSUtwYszfvDVMAAjkS8PvAFlcmn1nk6GKxDAIIIFBEAj94uEnff3i11475nMKrHHEIIIAAAggggAACCCCAAAJ5FQj0G5C8dsbiCCCAAAIIIIAAAggggAACkROw1rqbw3/vpfDkwKAa731A55IDXsKJQQABBBBA4IoC7gnLu7dvVayq0o/UNmOM2xmHA4GCFEj9LtcqaUmQDW46MqhE15D6h22Qy4Qmd+nAaX35Dzs0tbc7NDVFsZAzX7tP/fXf0lhZRRTLz6jm6nKjeEOFHl/o6z0rnTU7JTWzg0A6VJwTZYHUAJTbAarBax897x3XynUb+MzCKyBxCCCAAAKXFMjCQ1seMca4B1hwIIAAAggggAACCCCAAAIIIBAZAYagInOpKBQBBBBAAAEEEEAAAQQQKGyB1E1FxyTN8dLpTxLb1f7s815CiUEAAQQQQCAtgW8uWaztbU+kde4VTnrIGNPuNwnxCIRJIPV7nLtxrinIul7887DiBwd0InkxyGVCk7tkZEjV3b/RjD/yO262LspYaYX6Fq7WuXmBzullq1zfeebGJqn99mlacnWp71wTJNgkKWGM6Q96IfIjkA8Ba6373c3ze5x7aMtdq9bo1F8+ykf5rIkAAgggUOACN9/UoF9u3+q1y7OS5jPU7pWPOAQQQAABBBBAAAEEEEAAgXwIMASVD3XWRAABBBBAAAEEEEAAAQQQ+IKAtdbdOLveC83ht7u0cu0GL6HEIIAAAgggkJFA83fu0w/j6zKKucTJNxpj3OAvBwKRF7DWup2f3A5n04Nq5mTyopp/l9SBUyNBLRG6vNOOd6rmyC6VjA6FrrZCKOh8bb3ONNyv87U3FEI7E/bQOLtM7f8U05zYpAnP9XGCu4E2zqCvD0FCQymQep973E9xd6/+rrrffd9PCmIRQAABBBC4osCPHvmemr69wqtSpzGm0WswcQgggAACCCCAAAIIIIAAAgjkWoAhqFyLsx4CCCCAAAIIIIAAAggggMAXBKy18yW97YWGJyp7USMGAQQQQMCPQNvGFq1YdoefFDxp2Y8esaEQsNYudzu/eN3FM50mzo5YtR4eVKKreAaBpva+Mz78VP63k+kQcY5PgeS823Tma/drtGqmz0zRCG9dVKl4Q4WmlwX69WCnpFZjzIFoqFAlApcXSL3XveDHqGXzFu3Z94qfFMQigAACCCAwocC0WJVeemanZs+qnfDcy5xwrzFmr9dg4hBAAAEEEEAAAQQQQAABBBDIpUCg33LkshHWQgABBBBAAAEEEEAAAQQQiK6AtdbthtHgpYOfJLar/dnnvYQSgwACCCCAgCcBd3PR7u1bVXfdPE/xqaAuSY3GmH4/SYhFINcC1tq5ktolLQly7Y6ejxU/lFT/sA1ymdDkLh04rZqju1T5wdHQ1FQshYyVVqi/fun4zlDFcFSXGyVuiampbkrQ7XakdobifS5oafIHIpB6WIsb5vO802HHr/fox0/+PJD6SIoAAggggMDnBb65ZLG2tz3hFcY9rGUun1F45SMOAQQQQAABBBBAAAEEEEAglwIMQeVSm7UQQAABBBBAAAEEEEAAAQS+IGCtbZX0uBeanveO665Va7yEEoMAAggggIAvATcIdeCFXylWVeknz4vGGLebDgcCoRew1la73V0krQ+y2M4PRxU/mNSxvgtBLhOa3CUjQ6ru/o2qu/erZLR4drwKzQX4VCEXKmt0emGTBq9ZEMbysl5T4+wyuZ2hllxdmvXcn0robqZNGGPc/zs4EIiMQOo9zz2sZY7Xog+/3aWVazd4DScOAQQQQAABTwI7tjyh229b7ClWEp9ReJUjDgEEEEAAAQQQQAABBBBAIKcCDEHllJvFEEAAAQQQQAABBBBAAAEEPi2QerLy215V7l79XXW/+77XcOIQQAABBBDwJVB//bXjO0L5HITaZoyJ+yqEYAQCFrDWNrtBBj+7YUxU4snkRbUeHlR7z8cTnVowP592vFMzup7T5MG+gumpEBo5X1uvvgVNGp7hefYhUgzNdVOUuDWm6WWBfmV4UlKzMcbtqsOBQOgF/OxW7ZpzD2xZuW6DziUHQt8rBSKAAAIIFJZAFh7Ycq8xZm9hqdANAggggAACCCCAAAIIIIBAoQkE+o1GoWHRDwIIIIAAAggggAACCCCAQHYFrLXuJrglXrL+7Kld+ulTHV5CiUEAAQQQQCBrAiuW3am2jY/6zfeQMabdbxLiEci2gLW2MTX81JDt3J/kOztilegaGv/XP2yDWiZUeaf2vjM+/DS1tztUdVHMZwWS827T6QVNGiurKHia6nKj1oWVWt8QeK+dqWGoEwWPSoORFbDWut/Jmrw2kBwYHB+A4oEtXgWJQwABBBDwK/DNJYu1ve0Jr2nc8Pp8Y0y/1wTEIYAAAggggAACCCCAAAIIIBC0AENQQQuTHwEEEEAAAQQQQAABBBBA4JIC1lq368WTXnjcU5XvWrXGSygxCCCAAAIIZF3gBw836fsPr/aT96ykRmPMMT9JiEUgWwLW2rmSWv3cBJ5OLS/+eVjxgwM6kbyYzumRP6dkZEgzj3Yodvz1yPdSLA2MlVboTMP96q9fWhQtz41NUvvt07Tk6tKg+93kBiy5uTZoZvJnKuDnc4pP1npw3Qa9+VZXpktzPgIIIIAAAlkV2L1jqxbd6PlZFuxYndWrQTIEEEAAAQQQQAABBBBAAIFsCzAElW1R8iGAAAIIIIAAAggggAACCEwokLqx1t3oPX3Cky9xAjcVeVEjBgEEEEAgSIG2jS1asewOP0u4Qai53BDuh5BYvwLW2mpJblDd/fP0e1o6NXT1XVD80IAOnBpJ5/SCOMft/FTdvV8lo0MF0U+xNXGhska9i9fqfO0NRdH68q+WK3FLlebEJgXZr9tloJWdEIMkJncmAtba5ZJeyCTm8+e2bN6iPfte8ZOCWAQQQAABBLIiMPuqWXr5mZ2KVVV6zfcNY8wBr8HEIYAAAggggAACCCCAAAIIIBCkAENQQeqSGwEEEEAAAQQQQAABBBBA4JIC1lr3BeoSLzwdv96jHz/5cy+hxCCAAAIIIBCYwLRYlXZv36q66+b5WcNtG+B2hOr3k4RYBLwIpG7+Tkia4yU+nZizI1athweV6CqeQaDKD45q5pEOTR7sS4eIc0IucL62Xn/9+lqNVs0MeaXZKa91UaXiDRWaXhbo14mdbvCS3RCzc83I4k3AWjtfkvucwvMA8J59r6plc5u3AohCAAEEEEAgAIHm79ynH8bXec3sBtbn8/mEVz7iEEAAAQQQQAABBBBAAAEEghQI9FuLIAsnNwIIIIAAAggggAACCCCAQDQFrLXNkp72Uv2pj3p196o1Opcc8BJODAIIIIAAAoEKZOFJy66+DmOMe6/kQCAnAqkbv93wk6cB9XSL3NY1pNYjg+oftumGRPq80oHT+vIfdmhqb3ek+6D4Swv01y3VmYb7NVZWUfBEc2OT5IahmuqmBN1rR2oYikHgoKXJ/xmB1C6Ibqdqz0PAh9/u0sq1G5BFAAEEEEAgdAK7d2zVohsbvNa1yRjT6jWYOAQQQAABBBBAAAEEEEAAAQSCEmAIKihZ8iKAAAIIIIAAAggggAACCHxBIHVz0QmvT1d+cN0GvfmW2ySDAwEEEEAAgXAK1F9/rV7a9Qu/xXGjkV9B4icUSP1e5m5oWz/hyT5O6PxwVM2vndOJ5EUfWaITWjIypBldz6m6Z390iqZSTwJjpRXqW7ha5+YFOj/oqbYgghpnlylxS5UaaiYHkf6TnGcltRpj3GAmBwI5EbDWugEoz3eH97x3XCvXbeBhLTm5WiyCAAIIIJCpgHtYy4EXdmca9unzb2THTj98xCKAAAIIIIAAAggggAACCAQhwBBUEKrkRAABBBBAAAEEEEAAAQQQuKSAtXavpHu88OzZ96paNrd5CSUGAQQQQACBnAqsWHan2jY+6nfNh4wx7X6TEI/ApQSstXE3aOB1MD0d1ZPJi4ofGtDePw2nc3pBnFPdvX98AKpkdKgg+qGJ9ASGvzRnfBjqfO0N6QVE/KzmuilK3BrT9LJAv2I8KanZGHMg4lyUH3IBa637XavJa5nJgcHxAajud9/3moI4BBBAAAEEAhf4wcNN+v7Dq72u02WMme81mDgEEEAAAQQQQAABBBBAAAEEghAI9BuKIAomJwIIIIAAAggggAACCCCAQDQFrLXLJb3gpXp3Y1HjvQ/wZGUveMQggAACCORF4EePfE9N317hZ223G0YjT1z2Q0js5wWstY2S3A3fc4LSOTtilegaUuvhwaCWCF3eqb3vqPaNHZo82Be62igodwKD1yxQ34LVGq2ambtF87RSdblR68JKrW+oCLqCFyXFjTFuN2EOBLIqYK1tlvS0n6TsVu1Hj1gEEEAAgVwKvPzMTtVdN8/rkuxW7VWOOAQQQAABBBBAAAEEEEAAgUAEGIIKhJWkCCCAAAIIIIAAAggggAACnxaw1lZLcjeuTfcis67lMf228w0vocQggAACCCCQN4EdW57Q7bct9rO+2wljvjGm308SYhGw1s6VlPC6I2e6gh09H48PP51IXkw3JNLnlQ6cVs3RXar84Gik+6D47AmMlVaov36p+uu/pbGywAeEsle4x0zzayaP7wq15OpSjxnSDtvk/h/G+2HaXpw4gUBqKPj3fqB+ktiu9mef95OCWAQQQAABBHImUH/9tXpp1y/8rPcVBtP98BGLAAIIIIAAAggggAACCCCQTQGGoLKpSS4EEEAAAQQQQAABBBBAAIFLClhr3U23673wvPb6G1r76GNeQolBAAEEEEAgrwLTYlXavX2rn6ctu/q7jDHz89oIi0dWIDWIHpf0eJBNdPVdUPzQgA6cGglymdDkLhkZUnX3bzTjj9z8HpqLErJCLlTW6EzD/To3b0nIKgumnOVfLVfilirNiU0KZoG/Z3WDwW5XqL1BLkLuwhew1rrfqw54fUiLE9qz71W1bG4rfCw6RAABBBAoKIEfPNyk7z+82mtPncYYt7MwBwIIIIAAAggggAACCCCAAAJ5F2AIKu+XgAIQQAABBBBAAAEEEEAAgcIW8POE5eTAoBrvfUDnkgOFjUR3CCCAAAIFKzD7qll6+ZmdilVV+umxwxjT7CcBscUnYK11r5lWSXOC6v7siFX8YFLtPR8HtUTo8k473qmaI7tUMjoUutooKHwC52vrx4ehztfeEL7islxRdblRvKFi/N/0skC/fuxMDUMdy3ILpCsCgdRwsBuAavDabs97x3XXqjVew4lDAAEEEEAgrwIH9v5Ks2fVeq3hEWOMe9gZBwIIIIAAAggggAACCCCAAAJ5FQj0W4i8dsbiCCCAAAIIIIAAAggggAACeRdI3WDkbk7zdPPtTxLb1f4sT9jP+4WkAAQQQAABXwL111+rl3b9wlcOSdxs5FewSOJTO1y4G9MC3YJm05FBJbqG1D9si0J2au8748NP5X9zm9FwIJCZQHLebTq9oEljZRWZBUbw7LmxSUrcWqV7vlIedPXb3KCnMaY/6IXIXzgC1lo3AOX5/fHUR726e9UaHtRSOC8JOkEAAQSKTuDmmxr0y+1bvfZ9VtJ8Y8wJrwmIQwABBBBAAAEEEEAAAQQQQCAbAgxBZUORHAgggAACCCCAAAIIIIAAApcUsNa6G3DXe+E5/HaXVq7d4CWUGAQQQAABBEInsGLZnWrb+Kjfuu41xuz1m4T4whRIDZ+7372aguyw88NRNb92TieSF4NcJjS5SwdOa8Yfn1Ps+OuhqYlCoikwVlqh/vql4ztDFcPROLtMiVuq1FAzOch23Y24bhCKHQmCVC6Q3Nbadj/vkW6n6pXrNqj73fcLRIQ2EEAAAQSKVeBHj3xPTd9e4bX9TmNMo9dg4hBAAAEEEEAAAQQQQAABBBDIhgBDUNlQJAcCCCCAAAIIIIAAAggggMAXBFK7ELzthcbdXHTXqjU69ZePvIQTgwACCCCAQCgF2ja2aMWyO/zU5m72bjTGuF0WORD4h4C1tlVSXNL0oFhOJi+q+XdJHTg1EtQSocpbMjKk6u7fqLp7v0pGh0JVG8VEW+BCZY1OL2zS4DULot1ImtXHGyrUuqhS08sC/Uqyy/0/0BjjdvnhQOBSn080S3raD826lsf02843/KQgFgEEEEAAgVAITItV6aVndmr2rFqv9fCAFq9yxCGAAAIIIIAAAggggAACCGRFINBvHLJSIUkQQAABBBBAAAEEEEAAAQQiKWCtdTdoN3gp/mdP7dJPn+rwEkoMAggggAACoRbYvWOrFt3o6e3xk75OSppvjOkPdaMUlxMBa617Arfb2WJOUAueHbFKdA2p9fBgUEuELu+0452a0fWcJg/2ha42CiocgfO19epb0KThGYH95xsarOpyo9aFlVrfUBF0TS+mhqFOBL0Q+aMjkHqv/L2fin+S2K72Z5/3k4JYBBBAAAEEQiVw800N+uX2rV5rcg9omcvnEl75iEMAAQQQQAABBBBAAAEEEPArwBCUX0HiEUAAAQQQQAABBBBAAAEEviCQ2o3gcS80Pe8dH98FigMBBBBAAIFCFHBPXN69favqrpvnp71OY4wbfuEoUgFr7dzU8NOSIAk6ej5W/FBS/cM2yGVCk7v8zEnVHO3Q1N7u0NREIYUv0F+3VGca7tdYWeADQnnHnF8zWYlbY1pydWmQtbibchPuHzfmBskcjdypHardDmGed0rcs+9VtWxui0bDVIkAAggggEAGAju2PKHbb1ucQcRnTn3RGLPcazBxCCCAAAIIIIAAAggggAACCPgRYAjKjx6xCCCAAAIIIIAAAggggAACXxBI3WT0tleau1d/V93vvu81nDgEEEAAAQRCL1B//bXjg1Cxqko/tXYYY5r9JCA2egLW2mq3y4kkT8Pm6Xbc+eGo4geTOtZ3Id2QSJ9XMjKkmUc7FDv+eqT7oPjoCoyVVowPQvXXL41uExlU3lw3Ra2LKjUnNimDqIxPdTsnxo0xezOOJKAgBFLvmW4AyvMWnDykpSBeCjSBAAIIIHAZAfeQlgMv/MrPZxP38rsWLy8EEEAAAQQQQAABBBBAAIF8CDAElQ911kQAAQQQQAABBBBAAAEECljAWutuMvK0K8HPntqlnz7VUcA6tIYAAggggMDfBW6+qUG/3L7VL8dDxph2v0mIj4aAtdYNvbndTTzvZjFRpyeTF9V6eFDtPR9PdGrB/HxG13Oq7t6vktGhgumJRqIrcKGyRr2L1+p87Q3RbSLNyqvLjeINFXp8oa+B4HRW65TUbIw5kc7JnFM4AtZaNwB3j9eOTn3Uq7tXrdG55IDXFMQhgAACCCAQeoFvLlms7W1PeK3TDZ3PZ/dNr3zEIYAAAggggAACCCCAAAIIeBVgCMqrHHEIIIAAAggggAACCCCAAAJfELDWup0JnvRC424walz+gJdQYhBAAAEEEIikwIpld6pt46N+a/+GMcYNIHMUqIC1tjE1/OR5J4t0aDYdGVSia0j9wzad0yN/ztTed1T7xg5NHuyLfC80UHgC52vr9devr9Vo1czCa+5zHc2NTVLi1ird85XyoHvdJqmVm3SDZg5HfmutGxpe77Wa5MCgVq7bwC7VXgGJQwABBBCIlMCOLU/o9tsWe615mzHGfSfAgQACCCCAAAIIIIAAAggggEDOBBiCyhk1CyGAAAIIIIAAAggggAACJVcpuwAAIABJREFUhS1grZ0r6ZjX3QkeXLdBb77VVdhIdIcAAggggMDnBNo2tmjFsjv8uJyV1GiMce/BHAUkkPrdqlVSU5BtvfjnYcUPDuhE8mKQy4Qmd+nAaX35Dzs0tbc7NDVRCAKXEzjztfvUX/8tjZVVFDxS4+wytf9TTHNik4Ls1b1nxtlFMUji/OdO7Zz4tJ9KWjZv0Z59r/hJQSwCCCCAAAKREZh91Sy9/MxOxao879DJw1kic7UpFAEEEEAAAQQQQAABBBAoDAGGoArjOtIFAggggAACCCCAAAIIIJB3AWut24ViiZdCOn69Rz9+8udeQolBAAEEEEAg8gLuZqO66+b56cNNEbtBqH4/SYgNj4C11g0/uadpTw+qqpPJi2r+XVIHTo0EtUSo8paMDGlG13Oq7tkfqrooBoGJBMZKK9S3cLXOzfP0p9ZE6UP383hDhVoXVWp6WaBfYbr3TTcMxU6KoXsF+CvIWjtf0tt+svzsqV366VMdflIQiwACCCCAQOQEmr9zn34YX+e17pOS5vOZhFc+4hBAAAEEEEAAAQQQQAABBDIVCPQbhEyL4XwEEEAAAQQQQAABBBBAAIFoClhrl0t6wUv1pz7q1d2r1uhccsBLODEIIIAAAghEXmBarEovPbNTs2fV+uml0xjT6CcBsfkXSP1OlZA0J6hqzo5YtR4eVKJrKKglQpe3unv/+ABUyWjx9By6i0BBvgWGvzRnfBjqfO0NvnOFPUF1uVHilpia6qYEXaqbdGk1xpwIeiHyBy/gd3dqV+Gefa+qZXNb8MWyAgIIIIAAAiEU2L1jqxbd2OC1sk3GGPcwDw4EEEAAAQQQQAABBBBAAAEEAhdgCCpwYhZAAAEEEEAAAQQQQAABBApbwFpbLcndNOZpp4IH123Qm2+5B3FzIIAAAgggULwC9ddfq93btypWVekHYZsxxu0exBExgdSN2+1ed9VMt91tXUNqPTKo/mGbbkikz5va+45qjuxS+d/cg8k5ECgMgeS823Tma/drtGpmYTR0hS7m10xW4taYllxdGmSvZyUluGk3SOLgc6c+l3A7e3m+c7vnveNauW4DD2gJ/nKxAgIIIIBASAVmXzVLbqdqH59L3GiMORbS9igLAQQQQAABBBBAAAEEEECggAQYgiqgi0krCCCAAAIIIIAAAggggEA+BKy1eyXd42Xt115/Q2sffcxLKDEIIIAAAggUnMA3lyzW9rYn/Pb1kDHGDdNwREAgddO2e1r2+iDL7fxwVPGDSR3ruxDkMqHJXTpwWjVHd6nyg6OhqYlCEMimwFhphfrrl6q//lsaK6vIZupQ5mqumzI+DDW9LNCvNd20ZNwY4/6+5YiYgJ/PJVyryYFBNd77AANQEbvulIsAAgggkH2BHzzcpO8/vNpr4i5jzHyvwcQhgAACCCCAAAIIIIAAAgggkK5AoN8WpFsE5yGAAAIIIIAAAggggAACCERTwFq7XNILXqrnJiMvasQggAACCBS6QPN37tMP4+v8tsnTl/0K5iDeWut27XIDUJ5200ynxJPJi4ofGtDePw2nc3rkzykZGVJ1928044/PR74XGkAgHYELlTU603C/zs1bks7pkT6nutwo3lChxxf62jExHYNOSc3GGLfbMUcEBKy1CT/DxO6zCbcDVPe770egW0pEAAEEEEAgeAG3G1TddfO8LrSJHTa90hGHAAIIIIAAAggggAACCCCQrgBDUOlKcR4CCCCAAAIIIIAAAggggMBnBFI7FxyTNMcLzbqWx/Tbzje8hBKDAAIIIIBAQQu0bWzRimV3+OnxrKT53MDthzC4WGttoyR3w3ZDUKucHbFKdA2N/+sftkEtE6q80453qubILpWMDoWqLopBIBcC52vr1begScMzPP1plosSs7bG3Ngktd8+TUuuLs1azssk2uT+X22M6Q96IfJ7F7DWNkt62nsGqWXzFu3Z94qfFMQigAACCCBQUAL111+rl3b9wk9PX+HzCD98xCKAAAIIIIAAAggggAACCEwkwBDUREL8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hKAqQLclAQIECBAgQIAAAQIECJQmEMNB28fuCHFCUvza1TyBGPSKU5/muqdMfWre8amYAAECBAgQIECAAAECQxUQghoqb4sWz/66e/D7H2tRw1olQIAAAQIECAwsIAQ1MJ0HCRAgQIAAgZQE1m+Z+loWwmdT6qkpvQhBNeWk1EmAAAECBAgQIECAAAECyxWIQag4HWps/chyl/L8kAXeuHCxN+Eq/okhKBcBAgQIECBAgAABAgQIEHg3ASEo70UhAtmKbd3ZZ2cKWcsiBAgQIECAAIHEBYSgEj9g7REgQIAAAQL9CWycmBy9lK842d/d7ipSQAiqSE1rESBAgAABAgQIECBAgEATBOJEqBiIihOiTIeq14kdPXX6rfBTvSpTDQECBAgQIECAAAECBAjUUUAIqo6n0rCa8vBc99D0ZMOqVi4BAgQIECBAoDIBIajK6G1MgAABAgQI1E1gw8S23XmePVS3ulKvRwgq9RPWHwECBAgQIECAAAECBAi8n8Bdt9361nSoG1ZeD6sCgTPnzof9hxd64af4tYsAAQIECBAgQIAAAQIECPQrIATVr5T73ksgz7MHThz6/ncIESBAgAABAgQI9CcgBNWfk7sIECBAgACBFgiYBlXNIQtBVeNuVwIECBAgQIAAAQIECBCol0AMQI131vSmQ61dvapexSVazfyJxV7waa67mGiH2iJAgAABAgQIECBAgACBYQsIQQ1bOPn1X+4enB5NvksNEiBAgAABAgQKFBCCKhDTUgQIECBAgEDzBTpbfuE7IeQfbX4nzelACKo5Z6VSAgQIECBAgAABAgQIEChHIIag7t20rvfHdKhizeOkp73zx3rhpzcuXCx2casRIECAAAECBAgQIECAQOsEhKBad+SFNpxl4VPHZ6d3F7qoxQgQIECAAAECiQsIQSV+wNojQIAAAQIElibQmbh/MuSX9y3tKXcvR0AIajl6niVAgAABAgQIECBAgACB1AWuhqE2rlmdeqtD6y+GneLUpz1zL4VXTp8d2j4WJkCAAAECBAgQIECAAIH2CQhBte/MC+zYFKgCMS1FgAABAgQItEdACKo9Z61TAgQIECBAoE+BzuapmZCF+/q83W3LFBCCWiagxwkQIECAAAECBAgQIECgFQK33HTjm9OhRkP82nVtgRh4ilOf5rqnTH26Npc7CBAgQIAAAQIECBAg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QIAAAQIECCxBYMPE1M48D08u4RG3XkNACMorQoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJNFBCCauKplVazKVClUduIAAECBAgQaJOAEFSbTluvBAgQIECAQCECpkEVwvjWIkJQxXpajQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTKERCCKse5ibtkWf7U8dl9O5tYu5oJECBAgAABAnUWEIKq8+mojQABAgQIEKilQGfL1CMhhD+uZXENLEoIqoGHpmQCBAgQIECAAAECBAgQIECAAAECBAgQIEDg/2fv/mLzus87wT+HpkxbtizaY8OZNIiohsrKyYWYLGLxIoUoxrsuMBd2ZwFjgUxheoF2F92LagrsFvC0sIwpAnQvtsrNAm2BNb1B9yJYtHKBAeqBQ1FIsKCUTUJdNNZETEQZk04CGw0V/xMt+j2LQ8uS3le0xJfv+f9+CPjC9jnP7/l9ntPCVfXVQ4AAAQIECIQQlI/gkwRGk87+80uLq4QIECBAgAABAgTyFRCCytdTNQIECBAgQGAIBCamZsZHx0ayX6jaOwTXLfyKQlCFEzuAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAoQEIIqALUFJW2BasEQXYEAAQIECBCorYAQVG1HozECBAgQIECgzgKT07PHI40X6txjU3oTgmrKpPRJgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAjcLCEH5HrYSSDqdL134/uIyHQIECBAgQIAAgfwFhKDyN1WRAAECBAgQGAIB26DyG7IQVH6WKhEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAeQJCUOVZN+akNE6vnF2YaUy/GiVAgAABAgQINExACKphA9MuAQIECBAgUB+BA9NH59M0ebY+HTWzEyGoZs5N1wQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBh2ASGoYf8Ctrh/MnJ0Zem1RTIECBAgQIAAAQLFCAhBFeOqKgECBAgQIDAEAgenZyY20pGLQ3DVQq8oBFUor+IECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUJCAEFRBsM0te27lzMJUc9vXOQECBAgQIECg/gJCUPWfkQ4JECBAgACBGgvYBjX4cISgBjdUgQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTKFxCCKt+8zicmSTx3YWlhvs496o0AAQIECBAg0HQBIaimT1D/BAgQIECAQKUCB74yM5WOjPyo0iYafrgQVMMHqH0CBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgMqYAQ1JAOfutrX1o5szBBhAABAgQIECBAoFgBIahifVUnQIAAAQIEhkBg8vHZxUjiyBBctZArCkEVwqooAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBQsIARVMHCDytsC1aBhaZUAAQIECBBotIAQVKPHp3kCBAgQIECgDgKT00/MRNo5VYdemtiDEFQTp6ZnAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBCC8g1cE7i8sd6ZWF1eXCNCgAABAgQIECBQrIAQVLG+qhMgQIAAAQJDIjB5eHY5Ig4NyXVzvaYQVK6cihEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBASQJCUCVB1/2YJF5cWVo4Xvc29UeAAAECBAgQaIOAEFQbpugOBAgQIECAQOUCB6Zn59I0Xqq8kQY2IATVwKFpmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgRCCMpHEBG2QPkMCBAgQIAAAQIlCghBlYjtKAIECBAgQKDdApOHZ1cjYl+7b5n/7YSg8jdVkQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSKFxCCKt647iekEd/86ZmFY3XvU38ECBAgQIAAgbYICEG1ZZLuQYAAAQIECFQuYBvUzkYgBLUzN28RIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQLUCQlDV+tfh9NGks//80mL2h+b6IUCAAAECBAgQKEFACKoEZEcQIECAAAECwyMweXh2LSL2Ds+NB7+pENTghioQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQPkCQlDlm9fpxCRJX76wdGquTj3phQABAgQIECDQdgEhqLZP2P0IECBAgACBUgUmp2ePRxovlHpoww8Tgmr4ALVPgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBIRUQghrSwV+7ti1Qwz1/tydAgAABAgSqERCCqsbdqQQIECBAgEBLBSamZsZHx0ayNee2QW1zxkJQ24TyGAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAjUSkAIqlbjKLeZNE6vnF2YKfdQpxEgQIAAAQIECAhB+QYIECBAgAABAjkLfO7w7Ikk4g9zLtvackJQrR2tixEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDpL1CqAAAgAElEQVQgQKDVAkJQrR7v7S+XjBxdWXptcYgFXJ0AAQIECBAgUImAEFQl7A4lQIAAAQIE2ixwcHpmYiMdudjmO+Z5NyGoPDXVIkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGyBISgypKu2Tm2QNVsINohQIAAAQIEhklACGqYpu2uBAgQIECAQGkCB6aPzqdp8mxpBzb4ICGoBg9P6wQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBhiASGo4Rx+ksRzF5YW5ofz9m5NgAABAgQIEKhWQAiqWn+nEyBAgAABAi0VsA1q+4MVgtq+lScJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoD4CQlD1mUWJnVxaObMwUeJ5jiJAgAABAgQIELhJQAjK50CAAAECBAgQKEhg8vHZxUjiSEHlW1NWCKo1o3QRAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIDJWAENRQjXvzsrZADd/M3ZgAAQIECBCol4AQVL3moRsCBAgQIECgRQKT00/MRNo51aIrFXIVIahCWBUlQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgYIFhKAKBq5f+csrZxbG69eWjggQIECAAAECwyMgBDU8s3ZTAgQIECBAoAIB26DujC4EdWcjTxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBA/QSEoOo3k0I7SuLFlaWF44WeoTgBAgQIECBAgMBtBYSgfCAECBAgQIAAgQIFDkzPzqVpvFTgEY0vLQTV+BG6AAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBIZSQAhqqMZ+eWO9M7G6vLg2VLd2WQIECBAgQIBAzQSEoGo2EO0QIECAAAEC7ROYPDy7GhH72nezfG4kBJWPoyoECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUK6AEFS53pWeZgtUpfwOJ0CAAAECBAh8LCAE5VsgQIAAAQIECBQsYBvU7YGFoAr+AJUnQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgUIEhKAKYa1l0dGks//80mL2h+D6IUCAAAECBAgQqFBACKpCfEcTIECAAAECwyNgG9Qnz1oIanj+58BNCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0CYBIag2TfOT75Ik6csXlk7NDcdt3ZIAAQIECBAgUG8BIah6z0d3BAgQIECAQEsEJqdnj0caL7TkOrleQwgqV07FCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKAkASGokqArPsYWqIoH4HgCBAgQIECAwE0CQlA+BwIECBAgQIBACQITUzPjo2Mj2Vr0vSUc16gjhKAaNS7NEiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMA1ASGoYfgUkldWznzn6WG4qTsSIECAAAECBJogIATVhCnpkQABAgQIEGiFgG1QW49RCKoVn7dLECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYOgEhKCGYOTJyNGVpdcWh+CmrkiAAAECBAgQaISAEFQjxqRJAgQIECBAoA0CB6dnJjbSkYttuEuedxCCylNTLQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAoS0AIqizpis5J4/TK2YWZik53LAECBAgQIECAwBYCQlA+CwIECBAgQIBAiQIHpo/Op2nybIlH1v4oIajaj0iDBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQILCFgBBUuz+LNE1+56dnv3Oy3bd0OwIECBAgQIBAswSEoJo1L90SIECAAAECDRewDerWAQpBNfyj1j4BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSGVEAIqtWDv7RyZmGi1Td0OQIECBAgQIBAAwWEoBo4NC0TIECAAAECzRaYPPy1kxHpU82+RX7dC0HlZ6kSAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECJQnIARVnnXZJyVJPHdhaWG+7HOdR4AAAQIECBAgcHsBIShfCAECBAgQIECgZIHJ6SdmIu2cKvnY2h4nBFXb0WiMAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBG4jIATV2s/DFqjWjtbFCBAgQIAAgaYLCEE1fYL6J0CAAAECBBopMPn47GIkcaSRzefctBBUzqDKESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEApAkJQpTBXcci/XTmzcKKKg51JgAABAgQIECBwewEhKF8IAQIECBAgQKACAdugbqALQVXwATqSAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAYWEIIamLCOBS5vrHcmVpcX1+rYnJ4IECBAgAABAsMuIAQ17F+A+xMgQIAAAQKVCUwenl2NiH2VNVCTg4WgajIIbRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAXwJCUH1xNePhJF5cWVo43oxmdUmAAAECBAgQGD4BIajhm7kbEyBAgAABAjURODA9O5em8VJN2qmsDSGoyugdTIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIDCAhBDYBX01c31jsP2gJV0+FoiwABAgQIECAQEUJQPgMCBAgQIECAQIUCtkFFCEFV+AE6mgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgR2LCAEtWO6Wr6YJOnLF5ZOzdWyOU0RIECAAAECBAhsCghB+RAIECBAgAABAhUKTB6ePRYRf1FhC5UfLQRV+Qg0QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQI7EBCC2gFajV8ZTTr7zy8trta4Ra0RIECAAAECBIZeQAhq6D8BAAQIECBAgECVAhNTM+OjYyPZL6DtrbKPKs8WgqpS39kECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgsFMBIaidytXvPVug6jcTHREgQIAAAQIEthIQgvJdECBAgAABAgQqFpicnj0eabxQcRuVHS8EVRm9gwkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgAAEhqAHw6vZqMnJ0Zem1xbq1pR8CBAgQIECAAIFuASEoXwQBAgQIECBAoGKBa9ugflVxG5UdLwRVGb2DCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAAASGoAfDq9Goap1fOLszUqSW9ECBAgAABAgQIbC0gBOXLIECAAAECBAjUQODA9NH5NE2erUErpbcgBFU6uQMJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAIAcBIagcEOtQwhaoOkxBDwQIECBAgACBbQkIQW2LyUMECBAgQIAAgWIFDk7PTGykIxeLPaWe1YWg6jkXXREgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDA7QWEoFrxhVxaObMw0YqbuAQBAgQIECBAYAgEhKCGYMiuSIAAAQIECDRDYFi3QQlBNeP71CUBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIdAsIQTX/i0iSeO7C0sJ882/iBgQIECBAgACB4RAQghqOObslAQIECBAg0ACByeknZiLtnGpAq7m2KASVK6diBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFCSgBBUSdDFHWMLVHG2KhMgQIAAAQIEChEQgiqEVVECBAgQIECAwM4EJh+fXYwkjuzs7Wa+JQTVzLnpmgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAsMuIATV7C/AFqhmz0/3BAgQIECAwHAKCEEN59zdmgABAgQIEKipwDBugxKCqunHqC0CBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQuK2AEFSjP5DLG+udidXlxbVG30LzBAgQIECAAIEhExCCGrKBuy4BAgQIECBQf4HJw7PLEXGo/p3m06EQVD6OqhAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAuQJCUOV653paEi+uLC0cz7WmYgQIECBAgAABAoULCEEVTuwAAgQIECBAgEB/AgemZ+fSNF7q763mPi0E1dzZ6ZwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLDLCAE1djp2wLV2NFpnAABAgQIEBh2ASGoYf8C3J8AAQIECBCopcDk4dnViNhXy+ZybkoIKmdQ5QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgFAEhqFKYcz8kSdKXLyydmsu9sIIECBAgQIAAAQKFCwhBFU7sAAIECBAgQIBA/wLDtA1KCKr/78MbBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFC9gBBU9TPYSQejSWf/+aXF7A+n9UOAAAECBAgQINAwASGohg1MuwQIECBAgMBwCExMzYyPjo1kv+C2t+03FoJq+4TdjwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAu0UEIJq3lxtgWrezHRMgAABAgQIELhZQAjK90CAAAECBAgQqKnA5PTs8UjjhZq2l1tbQlC5USpEgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAiUKCEGViJ3TUUmn86UL319czqmcMgQIECBAgAABAiULCEGVDO44AgQIECBAgMB2BYZlG5QQ1Ha/CM8RIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQJ0EhKDqNI1t9JLG6ZWzCzPbeNIjBAgQIECAAAECNRUQgqrpYLRFgAABAgQIEMgEDkwfnU/T5Nk2awhBtXm67kaAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIH2CghBNWy2ycjRlaXXFhvWtXYJECBAgAABAgRuEhCC8jkQIECAAAECBGoscHB6ZmIjHblY4xYHbk0IamBCBQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgAgEhqArQd3qkLVA7lfMeAQIECBAgQKBWAkJQtRqHZggQIECAAAECtwq0fRuUEJSvngABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSaKCAE1ZypJUk8d2FpYb45HeuUAAECBAgQIEBgKwEhKN8FAQIECBAgQKDmAge+MjOVjoz8qOZt7rg9Iagd03mRAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBCoUEIKqEL+/oy+tnFmY6O8VTxMgQIAAAQIECNRRQAiqjlPREwECBAgQIECgR2Dy8dnFSOJIG2GEoNo4VXciQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBA+wWEoJoxY1ugmjEnXRIgQIAAAQIEtiMgBLUdJc8QIECAAAECBCoWmJx+YibSzqmK2yjkeCGoQlgVJUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGCBYSgCgbOp/zllTML4/mUUoUAAQIECBAgQKBqASGoqifgfAIECBAgQIDANgXaug1KCGqbH4DHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBWAkJQtRrH1s0k8eLK0sLxBnSqRQIECBAgQIAAgW0ICEFtA8kjBAgQIECAAIE6CByYnp1L03ipDr3k2YMQVJ6aahEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWQJCUGVJ7/icyxvrnYnV5cW1HVfwIgECBAgQIECAQK0EhKBqNQ7NECBAgAABAgRuLzB5eHY1Iva1yUkIqk3TdBcCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgMj4AQVL1nnUZ886dnFo7Vu0vdESBAgAABAgQI9CMgBNWPlmcJECBAgAABAhULtHEblBBUxR+V4wkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgRwJCUDtiK+2l0aSz//zSYvaHzfohQIAAAQIECBBoiYAQVEsG6RoECBAgQIDA8AhMHp7N1rTvbcuNhaDaMkn3IECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwHAJCEHVd95Jkr58YenUXH071BkBAgQIECBAgMBOBISgdqLmHQIECBAgQIBAhQKT07PHI40XKmwh16OFoHLlVIwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEShIQgioJegfH2AK1AzSvECBAgAABAgQaICAE1YAhaZEAAQIECBAgcLPAxNTM+OjYSLauvRXboISgfN8ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0EQBIaiaTi2N0ytnF2Zq2p22CBAgQIAAAQIEBhAQghoAz6sECBAgQIAAgaoEPnd49kQS8YdVnZ/nuUJQeWqqRYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJlCQhBlSXd5znJyNGVpdcW+3zL4wQIECBAgAABAg0QEIJqwJC0SIAAAQIECBDoFTg4PTOxkY5cbIOMEFQbpugOBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQGD4BIagaztwWqBoORUsECBAgQIAAgfwEhKDys1SJAAECBAgQIFCqwIHpo/Npmjxb6qEFHCYEVQCqkgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQuIAQVOHEfR+Qpsnv/PTsd072/aIXCBAgQIAAAQIEGiEgBNWIMWmSAAECBAgQIHCrQFu2QQlB+boJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoIkCQlC1m9qllTMLE7XrSkMECBAgQIAAAQK5CQhB5UapEAECBAgQIECgfIHJw187GZE+Vf7J+Z0oBJWfpUoECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUJ6AEFR51ts5KUniuQtLC/PbedYzBAgQIECAAAECzRQQgmrm3HRNgAABAgQIENgUmJx+YibSzqkmcwhBNXl6eidAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMDwCghB1Wr2tkDVahyaIUCAAAECBAgUIyAEVYyrqgQIECBAgACB0gQmH59djCSOlHZgzgcJQeUMqhwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIlCIgBFUK8/YOSeLFlaWF49t72FMECBAgQIAAAQJNFRCCaurk9E2AAAECBAgQuCbwuce/9nSSpH/XVBAhqKZOTt8ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAYbgEhqNrM//LGemdidXlxrTYdaYQAAQIECBAgQKAQASGoQlgVJUCAAAECBAiUKzB5eHY1IvaVe2o+pwlB5eOoCgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAiUKyAEVa73J55mC1RNBqENAgQIECBAgEDxAkJQxRs7gQABAgQIECBQuMCB6dm5NI2XCj+ogAOEoApAVZIAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEChcQgiqceFsHjCad/eeXFrM/PNYPAQIECBAgQIBAywWEoFo+YNcjQIAAAQIEhkegqdughKCG5xt1UwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECLRJQAiq+mkmSfryhaVTc9V3ogMCBAgQIECAAIEyBISgylB2BgECBAgQIECgBIHJ6dnjkcYLJRyV6xFCULlyKkaAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECJQkIQZUEfZtjbIGqfgY6IECAAAECBAiUKSAEVaa2swgQIECAAAECBQpMTM2Mj46NZOvd9xZ4TO6lhaByJ1WQAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBEoQEIIqAfk2R9gCVa2/0wkQIECAAAECVQgIQVWh7kwCBAgQIECAQEECTdwGJQRV0MegLAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgUKiAEVSjvnYsnI0dXll5bvPODniBAgAABAgQIEGiLgBBUWybpHgQIECBAgACBiDg4PTOxkY5cbBKGEFSTpqVXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEPhYQAiqwm8hjdMrZxdmKuzA0QQIECBAgAABAhUICEFVgO5IAgQIECBAgECRAgemj86nafJskWfkWVsIKk9NtQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgLAEhqLKktzjHFqgK8R1NgAABAgQIEKhOQAiqOnsnEyBAgAABAgQKEWjaNighqEI+A0UJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoGABIaiCgT+5/KWVMwsTlZ3uYAIECBAgQIAAgcoEhKAqo3cwAQIECBAgQKA4gSZtgxKCKu47UJkAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEihMQgirO9naVkySeu7C0MF/N6U4lQIAAAQIECBCoUkAIqkp9ZxMgQIAAAQIEChKYnH5iJtLOqYLK51pWCCpXTsUIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoCQBIaiSoLuPsQWqEnaHEiBAgAABAgTqISAEVY856IIAAQIECBAgkLvA5OOzi5HEkdwL51xQCCpnUOUIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoBQBIahSmHsP+bcrZxZOVHKyQwkQIECAAAECBCoXEIKqfAQaIECAAAECBAgUI9CUbVBCUMXMX1UCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQKFZACKpY3y2qX95Y70ysLi+ulX6yAwkQIECAAAECBGohIARVizFoggABAgQIECBQjMDk4dnViNhXTPV8qgpB5eOoCgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAiUKyAEVa53JPHiytLC8ZJPdRwBAgQIECBAgECNBISgajQMrRAgQIAAAQIE8hY4MD07l6bxUt5186wnBJWnploECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUJaAEFRZ0h+ds7HeedAWqHLNnUaAAAECBAgQqJuAEFTdJqIfAgQIECBAgEDOAnXfBiUElfPAlSNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBUgSEoEph3jwkSdKXLyydmivvRCcRIECAAAECBAjUUUAIqo5T0RMBAgQIECBAIEeBycOzxyLiL3IsmWspIahcORUjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgZIEhKBKgo6I0aSz//zS4mp5JzqJAAECBAgQIECgjgJCUHWcip4IECBAgAABAjkKTEzNjI+OjWS/ELg3x7K5lRKCyo1SIQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAoUUAIqhxsW6DKcXYKAQIECBAgQKAJAkJQTZiSHgkQIECAAAECAwpMTs8ejzReGLBMIa8LQRXCqigBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIFCwgBFUw8LXySafzpQvfX1wu5zSnECBAgAABAgQI1FlACKrO09EbAQIECBAgQCAngTpvgxKCymnIyhAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAqQJCUCVwp3F65ezCTAknOYIAAQIECBAgQKABAkJQDRiSFgkQIECAAAECeQgcmD46n6bJs3nUyrOGEFSemmoRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQFkCQlAlSCcjR1eWXlss4SRHECBAgAABAgQINEBACKoBQ9IiAQIECBAgQCAPgYPTMxMb6cjFPGrlWUMIKk9NtQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgLAEhqMKlz62cWZgq/BQHECBAgAABAgQINEZACKoxo9IoAQIECBAgQGBwgTpugxKCGnyuKhAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBA+QJCUMWaJ0k8d2FpYb7YU1QnQIAAAQIECBBokoAQVJOmpVcCBAgQIECAwIACB74yM5WOjPxowDK5vi4ElSunYgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQkoAQVKHQl1bOLEwUeoLiBAgQIECAAAECjRMQgmrcyDRMgAABAgQIEBhMYPLx2cVI4shgVfJ7WwgqP0uVCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKA8ASGo4qxtgSrOVmUCBAgQIECAQJMFhKCaPD29EyBAgAABAgR2IDA5/cRMpJ1TO3i1kFeEoAphVZQAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEChYQgioM+PLGemdidXlxrbATFCZAgAABAgQIEGikgBBUI8emaQIECBAgQIDAYAKTh2eXI+LQYFXyeVsIKh9HVQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgXAEhqIK8k3hxZWnheEHVlSVAgAABAgQIEGiwgBBUg4endQIECBAgQIDATgUOTM/OpWm8tNP383xPCCpPTbUIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoCwBIahCpG2BKoRVUQIECBAgQIBAOwSEoNoxR7cgQIAAAQIECPQtMHl4duYoTfAAACAASURBVDUi9vX9Ys4vCEHlDKocAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECJQiIASVP3Ma8c2fnlk4ln9lFQkQIECAAAECBNogIATVhim6AwECBAgQIEBgBwJ12QYlBLWD4XmFAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBCoXEILKfwSjSWf/+aXF7A919UOAAAECBAgQIEDgFgEhKB8FAQIECBAgQGBIBSamZsZHx0ayXzjcWyWBEFSV+s4mQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgZ0KCEHtVG7r95IkffnC0qm5fKuqRoAAAQIECBAg0CYBIag2TdNdCBAgQIAAAQJ9CkxOzx6PNF7o87VcHxeCypVTMQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAoSUAIKl9oW6Dy9VSNAAECBAgQINBGASGoNk7VnQgQIECAAAEC2xSowzYoIahtDstjBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFArASGoHMeRxumVswszOVZUigABAgQIECBAoIUCQlAtHKorESBAgAABAgT6Efjc4dkTScQf9vNOns8KQeWpqRYBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIlCUgBJWjdDJydGXptcUcKypFgAABAgQIECDQQgEhqBYO1ZUIECBAgAABAv0IHJyemdhIRy72806ezwpB5ampFgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAiUJSAElZO0LVA5QSpDgAABAgQIEGi/gBBU+2fshgQIECBAgACBOwocmD46n6bJs3d8sIAHhKAKQFWSAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAoXEILKhzhJ4rkLSwvz+VRThQABAgQIECBAoM0CQlBtnq67ESBAgAABAgS2KVDlNighqG0OyWMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUCsBIahcxnFp5czCRC6VFCFAgAABAgQIEGi9gBBU60fsggQIECBAgACB7QlMPj67GEkc2d7T+T0lBJWfpUoECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUJ6AENTg1rZADW6oAgECBAgQIEBgmASEoIZp2u5KgAABAgQIELiNwOT0EzORdk6VjSQEVba48wgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEAgDwEhqIEVL6+cWRgfuIoCBAgQIECAAAECQyMgBDU0o3ZRAgQIECBAgMCdBarYBtWmENSdhT1BgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTqJ/Bv/uCP4swPz5XbWBIvriwtHC/3UKcRIECAAAECBAg0WUAIqsnT0zsBAgQIECBAIGeBA9Ozc2kaL+Vc9rblhKDK1HYWAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBC4VaCCENTljfXOxOry4pp5ECBAgAABAgQIENiugBDUdqU8R4AAAQIECBAYEoHJw7OrEbGvrOsKQZUl7RwCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQILC1QOkhKFugfIoECBAgQIAAAQI7EBCC2gGaVwgQIECAAAECbRYoexuUEFSbvyZ3I0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIEmCJQdghpNOvvPLy1mf0irHwIECBAgQIAAAQLbFhCC2jaVBwkQIECAAAECwyNQ5jYoIajh+a7clAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTqKVBmCCpJ0pcvLJ2aq6eErggQIECAAAECBOosIARV5+nojQABAgQIECBQkcDk9OzxSOOFMo4XgipD2RkECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQOCTBcoMQdkC5UskQIAAAQIECBDYqYAQ1E7lvEeAAAECBAgQaLHAxNTM+OjYSLZ2fm/R1xSCKlpYfQIE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cbYqDyYgALVzPwGondt5s94C6w/ui87du6832bt9KfsX73/qC12XaPr2paomkoWe5h67N458eldVLdx87uVs41NEnEiSZLkODemBAAECBAgQIECAAAECBAgQIECAQNkCQlBlizuPAAECBAgQIECAAAECBAgQIECgcoE0TSciIgtEZX91//HnFXR3+YM05l/PtkNdieW3NirooP1HbrVxqncr1a5334zRd97swrCVqv3fRhNvKAhV3NQEoYqzVXlnAgJQO3PL3hKA2rmdN4sT2Gr7Um84qXf7UtZN74am4jpUOROYeng0jh3aHU//5ljsvbsWv6Xi9LWNT9nmJz8ECBAgQIAAAQIECBAgQIAAAQIEhlqgFr9iN9QTcHkCBAgQIECAAAECBAgQIECAAIFKBdI0nbkWhso2RO2ttJmIOPfWRpw4916cvLgea+tp1e04v0egdyvV5sapW4JTP+5666N33mNJIFcBQahcObuKffPvvxc/WPl5cQeoTGCbAp99ZDyef2Y2do/VYvvINruux2MCUPWYQ9u62Ljv4bh6/yPXr9W5+77INjLd/NO7fWnjvke63mmbSZvuMz6WxNzBeyPb/HTo4dE6XO1SFny6Fn5arUNDeiBAgAABAgQIECBAgAABAgQIECBQBwEhqDpMQQ8ECBAgQIAAAQIECBAgQIAAAQKVC6RpOh4RWRAq2w51pPKGIuLl81c2w1Anf7Zeh3b0kJPAVlup7v1Fd3CqdyvVR+9kvw/SD4EbAoJQxXwN761fjW98eyHeeHOtmANUJbANAQGobSB9wiMCUDu3a/Ob7z/6WNf1ercvbQaaHuoJND36hTaTuNs1gWzb09P7x+LZg/fUxeTla8Gnxbo0pA8CBAgQIECAAAECBAgQIECAAAECdRIQgqrTNPRCgAABAgQIECBAgAABAgQIECBQC4E0TSci4ti1UFT374asoMNLb38Y8+evxPzrV2L17Q8r6MCRdRS495c9wamerVRbha1sparjJAfrSRBqML9PelsQqhhXVbcnIAC1Pafep95+5934+h/8Ubz+k5WdFfBWLQW2s31p/aGJ6Ny9+3r/ti/VcpS1ampiz11x7NC9kQWg9u25qw69nYuIExFxMkkSKew6TEQPBAgQIECAAAECBAgQIECAAAECtRUQgqrtaDRGgAABAgQIECBAgAABAgQIECBQB4E0TbPtUNlfz9ahn9P/dDXmX39/c0PU2npah5b00GCBXVlw6t03u27Qu5Uq20A18sG715/56J23Gnzr9rUuCFXMTAWhinFV9fYCDz9wX/zZ7z4Zu8d2oepDQACqD6wSH+3dvrRx/yNx9b5Hrnew1fal3g1NJbbrqJYLjI8lmxuf5h67N458uhb/O/ZytvHp2tan5Zbzux4BAgQIECBAgAABAgQIECBAgACB3ASEoHKjVIgAAQIECBAgQIAAAQIECBAgQKDNAmmajkfE3LW/DlV918sfpHHyZ+ubG6IWf/5B1e04f8gFerdSbW6cuik4tdVWqnt/+fqQq+V7fUGofD0/riYIVYyrqlsLZMGn55+ZjWwTlJ/tCwhAbd9qu092du2O9Ye6l6G+/+gXul7v3b7U2XXfLe9s9zzPEShSYOrh0Th2aPfm1qe9d9fit0e8cm3jUxaA8kOAAAECBAgQIECAAAECBAgQIECAQJ8CtfhVvj579jgBAgQIECBAgAABAgQIECBAgACBSgXSNJ26KRC1t9JmIuLS2x/GiXPvb4aiVt/+sOp2nE9gRwK9W6k2g1P/vNpVy1aq29MKQu3o07vjS2+8uRbf+PZCZIEoPwSKEhCA2pmsANStbusP7ovO3buv/4ve7UvZv3j/Uz2Bpgcnut7Z2TS8RaA+AtnWp7mD98axQ/fGvj131aGxSxFx4lr4qfs/cOvQnR4IECBAgAABAgQIECBAgAABAgQINEhACKpBw9IqAQIECBAgQIAAAQIECBAgQIBA/QTSNH36WiDqqTp098rF9esbourQjx4IlCmw1cap3q1Uu959M0bfebOrrTZtpRKEKuaLE4QqxlXVjwQEoHb2JbQtALWd7Uubgab7H7kOZvvSzr4db7VXINv2NHfwnnhq/1gdLnk5Cz1FxHySJIt1aEgPBAgQIECAAAECBAgQIECAAAECBNogIATVhim6AwECBAgQIECAAAECBAgQIECAQOUCaZpOREQWiDoWEfuqbujyB2nMv/5+zJ+/EstvbVTdjvMJNEpgMzh19d3rPW+1lereX/64604fvfNeLe4599//d/Hvjv1BLXppUxOCUG2aZr3u8vwzs3HwMzeCLfXqrp7d1C0A1bt9qXP3fZH9s5t/ercvbdzXHWiqp7SuCNRfYGLPXZsbn+Yeuzf23l2L3/5w7qatT2v1F9QhAQIECBAgQIAAAQIECBAgQIAAgWYJ1OJXAZtFplsCBAgQIECAAAECBAgQIECAAAECtxdI03TqWhgqC0Xtrdrr3Fsbm2Go+fPvx9p6WnU7zicwFAJbbaW69xfdwanerVQfvXMpF59//a+ejD//0/81l1qK3BAQhPI15C3w+799OL76hSxH7We7AnkHoN5/9LGuo9cfnIjO3buv/7Pe7UvZv3j/0S9st13PESBQgMD4WBJP7x+LY4d2x6GHRws4oe+S2dan+Sz8lCTJat9ve4EAAQIECBAgQIAAAQIECBAgQIAAgW0LCEFtm8qDBAgQIECAAAECBAgQIECAAAECBPoTSNN0/Np2qLmIONLf28U8/crF9c1A1MmfrRdzgKoECOQq0LuVatc7b8boO292nfFJW6kEoXIdxfVi3/vxavzVP5wppriqQyUgANX/uG8OQG3c93Bcvf/GBq2tti+tP9QTaLJ9qX90bxCokcDMb9wdcwfviad/c6wuW59eycJPSZKcrBGTVggQIECAAAECBAgQIECAAAECBAi0WkAIqtXjdTkCBAgQIECAAAECBAgQIECAAIG6CKRpmq15yMJQ2V/7qu7r0tsfbgahTpx7P1bf/rDqdpxPgEBBAtlvFH7paw8UVH14ywpCDe/s87q5AFT/kpc/SGPm734Vy29t9P+yNwgQaKzAxJ67NkNPxw7dG/v23FWHe2RrO09ExElbn+owDj0QIECAAAECBAgQIECAAAECBAgMm4AQ1LBN3H0JECBAgAABAgQIECBAgAABAgQqF0jTdOZaGOrZypuJiHNvbcSJc+/FyYvrsbae1qElPRAgkKOAIFSOmDeVEoQqxnUYqj755c/H12e+NAxXze2OAlC5USpEoDECH298emr/WB16vpyFnrLwU5Iky3VoSA8ECBAgQIAAAQIECBAgQIAAAQIEhlVACGpYJ+/eBAgQIECAAAECBAgQIECAAAEClQukaToeEU9HxLGIOFR1Q9lvMM62Q82fvxKLP/+g6nacT4BAjgKCUDli3lRKEKoY1zZX/a0v7o/fe/LxNl8x97sJQOVOqiCB2gpMPTwa2X+zzD12b+y9uxa/leF0RMxf2/q0Vls4jREgQIAAAQIECBAgQIAAAQIECBAYIoFa/MrhEHm7KgECBAgQIECAAAECBAgQIECAAIEtBdI0nbgWhpqLiL1VM116+8PNMNT861di9e0Pq27H+QQI5CAgCJUD4hYl/vrVs/Hdf7xYTHFVWyUgANX/OAWg+jfzBoGmCYyPJfH0/rE4dmh3HHp4tA7tX7pp69NqHRrSAwECBAgQIECAAAECBAgQIECAAAECNwSEoHwNBAgQIECAAAECBAgQIECAAAECBGomkKZpth0qC0M9VYfWTv/T1Zh//f3NUJQfAgSaLSAIVcz8BKGKcW1TVQGo/qcpANW/mTcINElg5jfu3tz69OzBe+rS9ivZ1qckSU7WpSF9ECBAgAABAgQIECBAgAABAgQIECBwq4AQlK+CAAECBAgQIECAAAECBAgQIECAQE0F0jQdvxaGygJRh6puM/vNyCd/th4nzr0Xy29tVN2O8wkQ2KGAINQO4e7wmiBUMa5tqPrZR8bj+WdmY/fYrjZcp5Q7CECVwuwQAqULTOy5K+Yeu2cz/LRvz12ln7/Fgeey4NO18NNaHRrSAwECBAgQIECAAAECBAgQIECAAAECtxcQgvKFECBAgAABAgQIECBAgAABAgQIEGiAQJqmUxFxLCKyLVF7q2750tsfxolz2Xao92NtPa26HecTINCngCBUn2DbfFwQaptQQ/SYAFT/wxaA6t/MGwTqLpD9d8fTvzkWT+0fq0OrlyMi2/Z0IkmS5To0pAcCBAgQIECAAAECBAgQIECAAAECBLYvIAS1fStPEiBAgAABAgQIECBAgAABAgQIEKiFQJqm2WaoLAz1VB0aeuXiesyfv7K5JcoPAQLNERCEyn9W761fjW98eyHeeNMyifx1m1dRAKr/mQlA9W/mDQJ1FZh6eDSOHdq9GX7ae3ctflvC6Wsbn7LNT34IECBAgAABAgQIECBAgAABAgQIEGioQC1+tbGhdtomQIAAAQIECBAgQIAAAQIECBAgUKlAmqYTEZEForK/9lXaTERkv3F5/vVsO9SVWH5ro+p2nE+AwDYEBKG2gdTnI4JQfYK19PGHH7gv/ux3n4zdY7taesP8ryUAlb+pigTKFhgfS2Lu4L2R/ffFoYdHyz5+q/MuZcGna+Gn1To0pAcCBAgQIECAAAECBAgQIECAAAECBAYTEIIazM/bBAgQIECAAAECBAgQIECAAAECBGohkKbpzLUwVLYham/VTZ17ayNOnHsvTl5cj7X1tOp2nE+AwG0EBKHy/zwEofI3bVLFLPj0/DOzkW2C8rM9AQGo7Tl5ikBdBbJtT0/vH4tnD95TlxZfjoiTSZKcrEtD+iBAgAABAgQIECBAgAABAgQIECBAIB8BIah8HFUhQIAAAQIECBAgQIAAAQIECBAgUAuBNE2z33GdBaGy7VBH6tDUy+evbIahTv5svQ7t6IEAgS0EBKHy/ywEofI3bUJFAaj+pyQA1b+ZNwjUQWBiz10x99g9m1uf9u25qw4tnYuIE9fCT2t1aEgPBAgQIECAAAECBAgQIECAAAECBAjkLyAElb+pigQIECBAgAABAgQIECBAgAABAgRqIZCm6UREHLsWitpXdVOX3v4w5s9fifnXr8Tq2x9W3Y7zCRDoERCEyv+TeOPNtfjGtxciC0T5ab+AAFT/MxaA6t/MGwSqFBgfSzY3Ps09dm8c+fSuKlv5+OzLETGf/ZUkyXIdGtIDAQIECBAgQIAAAQIECBAgQIAAAQLFCghBFeurOgECBAgQIECAAAECBAgQIECAAIFaCKRpmm2Hyv56tg4N/f/s3TFsnNl5L/znBbUaUd9lyABys3thkltcUHGAUW6RwIADCU6xQRrSjZvA0NwiqYmvNFwabi/r5APuCEEaN98QX5MtYkiIm6RIyCKREOBKpIHdxgJCmrgihyvifDjj2Y2c7C6H5Dvznpn5DUC42PM+5zm/8+7K4OiP59mnn0X3+elgQtRRP5XQkh4IEMgj5DbuxP/6o99iUaOAIFSNmIWX+uH3vxsb//UbhXdZTnsCUOXchU4IXCbw4N6t2G7fja0PW7F8u4i/YrA7nPiUA1A+BAgQIECAAAECBAgQIECAAAECBAjMkUARv6GcI29HJUCAAAECBAgQIECAAAECBAgQINCoQEppJecchj/tRpuJiPwXoHsv+4MJUU8/OW+6HfsTICAINZZ3QBBqLKxFFf3zP/6D+M7v5AGMPqMI7L9+G496/yYIPQqWNQQaEshTnzobi7HdXozVpYWGuviNbQ/fmfp0UEJDeiBAgAABAgQIECBAgAABAgQIECBAYPICQlCTN7cjAQIECBAgQIAAAQIECBAgQIAAgSIEUkoP3glELTfd1OHJRezsnw5CUQcnF023Y38Ccy1gIlT91y8IVb9pKRUFoK52EwJQV/OymsCkBfK0p/z/AzbXW5Pe+qv2e5LDT1VVPS2lIX0QIECAAAECBAgQIECAAAECBAgQINCcgBBUc/Z2JkCAAAECBAgQIECAAAECBAgQIFCMQEppaxiI2iyhqd1X/S8mRJXQjx4IzKOAIFT9t/7zfzmIv/ibv6+/sIqNCQhAXY1eAOpqXlYTmJTA2tLCYOJTDkAVMvVpPyJ2IqJXVdXRpBzsQ4AAAQIECBAgQIAAAQIECBAgQIBA+QJCUOXfkQ4JECBAgAABAgQIECBAgAABAgQITEwgpbQWETkQtR0RqxPb+Cs2Oj5P0X1+Gt0XZ7H3+m3T7difwNwJCELVf+WCUPWbNlXxo//+3+JPH/1eU9tP3b4CUFN3ZRqecYGVVhVb663Ybt+N9r1bJZz2OE98yuGnqqoOSmhIDwQIECBAgAABAgQIECBAgAABAgQIlCcgBFXeneiIAAECBAgQIECAAAECBAgQIECAQBECKaUHwzBUDkUtN91U/svTOQzVfXEaR/3UdDv2JzA3AoJQ9V+1IFT9ppOu+IffWo8/++j3J73t1O4nADW1V6fxGRR49MHtyH+256lPy7eL+OsCuzn8VFVVbwa5HYkAAQIECBAgQIAAAQIECBAgQIAAgZoFivitZs1nUo4AAQIECBAgQIAAAQIECBAgQIAAgRoFUkorw+lQnYh4WGPpa5fafdUfBKJ6L/vXruFBAgRGF8h/Ybr3J8ul/GXp0RsveKUgVMGXc0lrAlBXuzsBqKt5WU1gHAJrSwuD0NN2ezFWlxbGscVVax7miU8R0TP16ap01hMgQIAAAQIECBAgQIAAAQIECBCYbwEhqPm+f6cnQIAAAQIECBAgQIAAAQIECBAgcCWBlNJaROQwVP5ZvdLDY1h8eHIxCELt7J/GwcnFGHZQkgCBzwUe3LsVT7/324JQNb4Sf/nxP8Tf/fOrGisqNW4BAairCQtAXc3LagJ1C+TgU576tLneqrv0deod59DTcOrT0+sU8AwBAgQIECBAgAABAgQIECBAgAABAgSEoLwDBAgQIECAAAECBAgQIECAAAECBAhcSyCl9GgYhnp8rQI1P5T/ovXO/pvoverHUT/VXF05AgSygCBU/e+BIFT9puOq+M1vrMQPv//duNt6b1xbzFRdAaiZuk6HmSKBPPUpT3zq3F8sJbj8LAefhlOfjqaIUqsECBAgQIAAAQIECBAgQIAAAQIECBQoIARV4KVoiQABAgQIECBAgAABAgQIECBAgMA0CaSUViJiKyK2I6LddO/H52kwHar74iyefnLedDv2JzBzAoJQ9V+pIFT9pnVXFIC6mqgA1NW8rCZwU4GVVhVb663Ybt+N9r1bNy1Xx/OHw6lPO1VVHdRRUA0CBAgQIECAAAECBAgQIECAAAECBAhkASEo7wEBAgQIECBAgAABAgQIECBAgAABArUJpJTWhmGoTkQs11b4moUOTy4GYaju87M4OLm4ZhWPESDwHwUEoep/JwSh6jetq6IA1NUkBaCu5mU1gZsIPPrgdnQ27sTjjTs3KVPns7t56lNVVb06i6pFgAABAgQIECBAgAABAgQIECBAgACBzwWEoLwLBAgQIECAAAECBAgQIECAAAECBAiMRSCllKdD5TDU5lg2uGLRZ59+Ft3np4NQlA8BAjcXEIS6ueG7Fd70P4uf/PRn8YtfHtVbWLUbCdz7rf8rfvyDj+Ju670b1ZmXhwWg5uWmnbNJgbWlhejcvzMIP60uLTTZyud756lPO8Pwkz/ESrgRPRAgQIAAAQIECBAgQIAAAQIECBCYYQEhqBm+XEcjQIAAAQIECBAgQIAAAQIECBAgUIJASmllGIbKgah20z0dn6fovezHzv6b2Hv9tul27E9gqgUEoeq9PkGoej1vWi0Hn374/e9GngTlc7mAANTlRlYQuIlADj1tfdiKzfXWTcrU9exxRORpTztVVe3VVVQdAgQIECBAgAABAgQIECBAgAABAgQIXCYgBHWZkH9OgAABAgQIECBAgAABAgQIECBAgEBtAimlBxGxHRF5StRybYWvWejw5CJ29vN0qNM46qdrVvEYgfkWEISq9/4Foer1vG41AairyQlAXc3LagKjCuQ/Y3P4qXN/MZZvF/HV/rPhxKfuqGewjgABAgQIECBAgAABAgQIECBAgAABAnUKFPGb0joPpBYBAgQIECBAgAABAgQIECBAgAABAtMhkFLKk6FyGGqzhI53X/Wj++JsMCXKhwCBqwkIQl3N67LVglCXCY33nwtAXc1XAOpqXlYTuExgpVVFZ2NxEH5q37t12fJJ/PPDHHwahp8OJrGhPQgQIECAAAECBAgQIECAAAECBAgQIPBVAkJQ3g0CBAgQIECAAAECBAgQIECAAAECBBoVSCmtRUQOROWf1UabiYjj8xTd53k61FnsvX7bdDv2JzA1AoJQ9V7VL355FD/56c8iB6J8Jivww+9/Nzb+6zcmu+mU7iYANaUXp+0iBbY+bMXWeiseb9wppb8nEdGrqqpXSkP6IECAAAECBAgQIECAAAECBAgQIECAgBCUd4AAAQIECBAgQIAAAQIECBAgQIAAgWIEUkqPhmGoPCFquenG8l/u3tl/E71X/Tjqp6bbsT+B4gUEoeq9IkGoej1Hqfbnf/wH8Z3fydlcn8sEBKAuE/LPCVwusLa0EJ37dwZTn1aXFi5/YPwr9t+Z+nQ0/u3sQIAAAQIECBAgQIAAAQIECBAgQIAAgasJCEFdzctqAgQIECBAgAABAgQIECBAgAABAgQmIJBSWomIHITK06EeTmDLS7d48uJsEIbqvexfutYCAvMsIAhV7+0LQtXr+XXVBKBGtxaAGt3KSgJfJpBDT537i/Hw/fdKADrOE58iYqeqqr0SGtIDAQIECBAgQIAAAQIECBAgQIAAAQIEvkpACMq7QYAAAQIECBAgQIAAAQIECBAgQIBA0QIppTySY3sYilptutnDk4vovjiL7vOzODi5aLod+xMoUkAQqt5rEYSq1/PLqglAjW4sADW6lZUE3hXIfzZut+/G1oetWL5dxNf0uzn8VFVV100RIECAAAECBAgQIECAAAECBAgQIEBgWgSK+O3qtGDpkwABAgQIECBAgAABAgQIECBAgACBZgVSSnk6VP553Gwnv9792aefRff56WBC1FE/ldCSHggUIyAIVe9V/PxfDuIv/ubv6y2q2kDgo//+3+JPH/0ejREEBKBGQLKEwDsCK60qOhuLsd1ejNWlhRJsDiMih566VVUdlNCQHggQIECAAAECBAgQIECAAAECBAgQIHAVASGoq2hZS4AAAQIECBAgQIAAAQIECBAgQIBAEQIppZWI6Ax/2k03dXyeoveyP5gQ9fST86bbsT+BYgQEoeq9CkGoej1ztT/81nr82Ue/X3/hGawoADWDl+pIYxPI0546G3dic701tj2uWPjJMPj09IrPWU6AAAECBAgQIECAAAECBAgQIECAAIGiBISgiroOzRAgQIAAAQIECBAgQIAAAQIECBAgcFWBlNKDdwJRy1d9vu71hycXsbN/OghFHZxc1F1ePQJTJyAIVe+VCULV5ykANbqlANToVlbOr8Da0sJg4lMOQBUy9Wk/InYioldV1dH83oyTEyBAgAABAgQIECBAgAABAgQIECAwSwJCULN0m85CgAABAgQIECBAgAABAgQIECBAYM4FUkpbw0DUZgkUu6/6X0yIKqEfPRBoSkAQql55QaibewpAjW745MVZdP72V6M/YCWBORJYaVWxtd6Kzv3FePj+eyWc/DhPfBpOfdoroSE9ECBAgAABAgQIECBAgAABAgQIECBAoE4BIag6NdUiQIAAAQIECBAgQIAAAQIECBAgQKAIgZTSWkTkQNR2RKw23dTxeYru89PovjiLvddvm27H/gQaERCEqpf9r5/+U3z8j/9ab9E5qfbNb6zED7//3bjbKiKwULS6AFTR16O5BgXyn2nb7buDqU/Lt4v4yn13GHzqNchiawIECBAgQIAAAQIECBAgQIAAAQIECIxdoIjfyI79lDYgQIAAAQIECBAgQIAAAQIECBAgQGBuBVJKD4ZhqByKWm4aYv/120EYqvviNI76qel27E9gogKCUPVy/+XH/xB/98+v6i0649UEoEa/YAGo0a2snA+BtaWFQehpu70Yq0sLJRz6MCJ2IqJXVdVBCQ3pgQABAgQIECBAgAABAgQIECBAgAABAuMWEIIat7D6BAgQIECAAAECBAgQIECAAAECBAgUIZBSWhlOh+oyRcpwAAAgAElEQVRExMMSmtp91R8Eonov+yW0owcCExEQhKqXWRBqdE8BqNGtBKBGt7Jy9gVy8KmzcSc211slHPY4h56GU5+eltCQHggQIECAAAECBAgQIECAAAECBAgQIDBJASGoSWrbiwABAgQIECBAgAABAgQIECBAgACBIgRSSmsRkcNQ+We16aYOTy4GQaid/dM4OLlouh37Exi7gCBUvcSCUJd7CkBdbvT5CgGo0a2snF2BPPUpT3zq3F+M5dtFfKW+/87Up6PZlXcyAgQIECBAgAABAgQIECBAgAABAgQIfL1AEb+xdUkECBAgQIAAAQIECBAgQIAAAQIECBBoSiCl9GgYhnrcVA/v7rv/+m3s7L+J3qt+HPVTCS3pgcBYBPJfMO/9yXK0790aS/15K/qjv/o4fvFLfy/+y+79buu9+OH3vxs5COXz9QICUN6QeRZYaVWxtd6K7fbdUv5sOhxOfdqpqupgnu/G2QkQIECAAAECBAgQIECAAAECBAgQIPC5gBCUd4EAAQIECBAgQIAAAQIECBAgQIAAAQIRkVLKfzt+KyK2I6LdNMrxeRpMh+q+OIunn5w33Y79CYxFIP+F86dbv13KXzYfyxknVfRN/7P4yU9/Jgj1H8AFoEZ/AwWgRreycrYEHn1wOzobd2Lrw1YpU592I6JbVVVvtqSdhgABAgQIECBAgAABAgQIECBAgAABAjcXEIK6uaEKBAgQIECAAAECBAgQIECAAAECBAjMmEBKaW0YhsqhqNWmj3d4cjEIQ3Wfn8XByUXT7difQK0CglD1cQpC/aalANTo75YA1OhWVs6GQJ5G2Ll/ZxB+Wl1aKOFQeerTzjD8ZKxfCTeiBwIECBAgQIAAAQIECBAgQIAAAQIEihQQgiryWjRFgAABAgQIECBAgAABAgQIECBAgEApAimlHITqRMRmCT09+/Sz6D4/HYSifAjMioAgVH03KQj175Y//sFH8c1v5CF/Pl8nIADl/Zgngc8nPm2ut0o49nFE5GlPO1VV7ZXQkB4IECBAgAABAgQIECBAgAABAgQIECBQuoAQVOk3pD8CBAgQIECAAAECBAgQIECAAAECBIoQSCnlv0mfw1D5p910U8fnKXov+7Gz/yb2Xr9tuh37E7ixgCDUjQm/KPD6V/8nfvRXH0cORM3r58//+A/iO7+Th/r5fJ2AAJT3Yx4EHty7NZj41Lm/GMu3i/h6/Fme+JQDUFVVmfo0Dy+hMxIgQIAAAQIECBAgQIAAAQIECBAgUJtAEb/lre00ChEgQIAAAQIECBAgQIAAAQIECBAgQGACAimlBxGxHRF5StTyBLb82i0OTy5iZz9PhzqNo35quh37E7i2gCDUten+04O/+OVR/OSnP5vLIJQA1GjvkQDUaE5WTadA/vNka70V2+270b53q4RDHA6DT92qqg5KaEgPBAgQIECAAAECBAgQIECAAAECBAgQmEYBIahpvDU9EyBAgAABAgQIECBAgAABAgQIECBQjEBKKU+GymGozRKa2n3Vj+6Ls8GUKB8C0yggCFXfrc1jEEoAarT3RwBqNCerpk9g68PWIPz0eONOKc0/GU586pXSkD4IECBAgAABAgQIECBAgAABAgQIECAwzQJCUNN8e3onQIAAAQIECBAgQIAAAQIECBAgQKAYgZTS2jAMlSdErTbd2PF5iu7zPB3qLPZev226HfsTuJKAINSVuL528TwFob737d+N7337W/XhzWglAagZvdg5Ptba0kJ07t+JzsadWF1aKEFi/52pT0clNKQHAgQIECBAgAABAgQIECBAgAABAgQIzIqAENSs3KRzECBAgAABAgQIECBAgAABAgQIECBQjEBK6VFEfD4harnpxvZfv42d/TfRe9WPo35quh37ExhJQBBqJKaRFv3j//4kdnZ/PtLaaV30h99ajz/76Pentf2J9S0ANTFqG01AIIeeOvcX4+H7701gt0u3OM4TnyJip6qqvUtXW0CAAAECBAgQIECAAAECBAgQIECAAAEC1xIQgroWm4cIECBAgAABAgQIECBAgAABAgQIECBwuUBKaWU4HSoHoh5e/sT4V+S/AJ/DUL2X/fFvZgcCNxQQhLoh4DuP//xfDuIv/ubv6ytYUCUBqNEuQwBqNCeryhZ4cO9WbLfvxtaHrVi+XcRX3c/y1Keqqrply+mOAAECBAgQIECAAAECBAgQIECAAAECsyFQxG+GZ4PSKQgQIECAAAECBAgQIECAAAECBAgQIPDVAimltYjYHoaiVpu2Ojy5iO6Ls+g+P4uDk4um27E/ga8UEISq7+WYxSCUANRo74cA1GhOVpUpkP8c6GwsRp781L53q4QmD3PwaRh+OiihIT0QIECAAAECBAgQIECAAAECBAgQIEBgXgSEoOblpp2TAAECBAgQIECAAAECBAgQIECAAIFiBFJKW8Mw1OMSmnr26WfRfX46mBB11E8ltKQHAr8hIAhV3wsxS0Gob35jJX78g4/qw5nRSgJQM3qxc3CsPO0pB58211ulnPbJMPj0tJSG9EGAAAECBAgQIECAAAECBAgQIECAAIF5ExCCmrcbd14CBAgQIECAAAECBAgQIECAAAECBIoRSCmtDMNQeUJUu+nGjs9T9F72BxOinn5y3nQ79ifwGwKCUPW9EH/99J/i43/81/oKNlApB6B++P3vxt3Wew3sPj1bCkBNz13p9NcCa0sLsd1ejByAWl1aKIFlPyJ2IqJXVdVRCQ3pgQABAgQIECBAgAABAgQIECBAgAABAvMsIAQ1z7fv7AQIECBAgAABAgQIECBAgAABAgQIFCOQUnoQEZ3hz3LTjR2eXMTO/ukgFHVwctF0O/YnMBAQhKrvRfjLj/8h/u6fX9VXcIKVBKBGwxaAGs3JquYF8n/bt9Zb0bm/GA/fLyLYeJwnPg2nPu01L6QDAgQIECBAgAABAgQIECBAgAABAgQIEPhcQAjKu0CAAAECBAgQIECAAAECBAgQIECAAIHCBFJKW8Mw1GYJre2+6n8xIaqEfvQw3wKCUPXd/zQGoQSgRrt/AajRnKxqVuDBvVux3b47mPq0fLuIr613hxOfcgDKhwABAgQIECBAgAABAgQIECBAgAABAgQKFCjit8kFumiJAAECBAgQIECAAAECBAgQIECAAAECjQuklNYiIgeitiNitemGjs9TdJ+fRvfFWey9ftt0O/afYwFBqPouf5qCUHdb78UPv//dyEEon68WEIDydpQskP/73dlYjO32YqwuLZTQ6mFE7AzDTwclNKQHAgQIECBAgAABAgQIECBAgAABAgQIEPhqASEobwcBAgQIECBAgAABAgQIECBAgAABAgSmQCCl9GAYhsqhqOWmW95//XYQhuq+OI2jfmq6HfvPoYAgVH2X/qO/+jh+8cuj+gqOoZIA1Gio/+NvfzX4b7MPgdIE8rSnzsad2FxvldDacQ49RUS3qqqnJTSkBwIECBAgQIAAAQIECBAgQIAAAQIECBAYTUAIajQnqwgQIECAAAECBAgQIECAAAECBAgQIFCMQEqpExH552EJTe2+6g/+0n3vZb+EdvQwRwKCUPVc9pv+Z/GTn/6s2CCUANRo9ywANZqTVZMTWFtaGEx86txfjOXbRXwtvf/O1Keyk5+TuyY7ESBAgAABAgQIECBAgAABAgQIECBAYKoEivht81SJaZYAAQIECBAgQIAAAQIECBAgQIAAAQKFCKSU1oZhqByIWm26rcOTi0EQamf/NA5OLppux/5zIiAIVc9FlxyE+vEPPopvfmOlnoPOaBUBqBm92Ck8Vv5v8tZ6K7bbd6N971YJJ8hTn7o5/FRV1UEJDemBAAECBAgQIECAAAECBAgQIECAAAECBK4vIAR1fTtPEiBAgAABAgQIECBAgAABAgQIECBAoBiBlNKjYSDqcQlN7b9+Gzv7b6L3qh9H/VRCS3qYYQFBqHout8Qg1J//8R/Ed34n5z19vkpAAMq7UYLAow9uR2fjTmx92Cpl6tNuDj9VVdUrwUcPBAgQIECAAAECBAgQIECAAAECBAgQIFCPgBBUPY6qECBAgAABAgQIECBAgAABAgQIECBAoAiBlFIel7IVEdsR0W66qePzNJgO1X1xFk8/OW+6HfvPsIAgVD2X+/pX/yd+9FcfRw5ENf0RgLr8BgSgLjeyYnwCa0sLg9DTdnsxVpcWxrfR6JUP88SnYfjpaPTHrCRAgAABAgQIECBAgAABAgQIECBAgACBaREQgpqWm9InAQIECBAgQIAAAQIECBAgQIAAAQIEriiQUsrjU3IYKoeiVq/4eO3LD08uBmGo7vOzODi5qL2+ggRyEGrnO0vxeOMOjBsI/OKXR/GTn/6s0SCUANTlFygAdbmRFeMR+Hzi0+Z6azwbXK3qcUTkaU87VVXtXe1RqwkQIECAAAECBAgQIECAAAECBAgQIEBg2gSEoKbtxvRLgAABAgQIECBAgAABAgQIECBAgACBawiklHIQqhMRm9d4vPZHnn36WXSfnw5CUT4E6hbo/tFvCULdELXJINT3vv278b1vf+uGJ5jtxwWgZvt+Szzdg3u3IoefOvcXY/l2EV8xP8sTn3IAqqoqU59KfGn0RIAAAQIECBAgQIAAAQIECBAgQIAAgTEIFPEb6jGcS0kCBAgQIECAAAECBAgQIECAAAECBAgQ+BKBlNLKMAyVA1HtppGOz1P0XvZjZ/9N7L1+23Q79p8hAUGom19mE0GoP/zWevzZR79/8+ZnuIIA1AxfbmFHy9P1ttZbsd2+G+17t0ro7vCdqU8HJTSkBwIECBAgQIAAAQIECBAgQIAAAQIECBCYrIAQ1GS97UaAAAECBAgQIECAAAECBAgQIECAAIFiBFJKDyJiOyLylKjlphs7PLmInf08Heo0jvqp6XbsPwMCglA3v8R//N+fxM7uz29eaIQKAlCXIwlAXW5kxc0FHn1wezD16fHGnZsXq6fCbp76VFVVr55yqhAgQIAAAQIECBAgQIAAAQIECBAgQIDAtAoIQU3rzembAAECBAgQIECAAAECBAgQIECAAAECNQqklPJkqByG2qyx7LVL7b7qR/fF2WBKlA+BmwgIQt1E79fP/vxfDuIv/ubvb17oayoIQF3OKwB1uZEV1xdYW1qIzv07g/DT6tLC9QvV9+R+Dj4Nw09H9ZVViQABAgQIECBAgAABAgQIECBAgAABAgSmWUAIappvT+8ECBAgQIAAAQIECBAgQIAAAQIECBCoWSCltDYMQ+UJUas1l79yuePzFN3neTrUWey9fnvl5z1AIAsIQt38PRhnEOqb31iJH//go5s3OcMVBKBm+HIbPloOPXXuL8bD999ruJPB9scRkac97VRVtVdCQ3ogQIAAAQIECBAgQIAAAQIECBAgQIAAgbIEhKDKug/dECBAgAABAgQIECBAgAABAgQIECBAoBiBlNKjiPh8QtRy043tv34bO/tvoveqH0f91HQ79p8yAUGom1/YOIJQOQD1w+9/N+62ighg3BxpDBUEoMaAOuclH9y7Fdvtu7H1YSuWbxfxdfGz4cSnPPnJhwABAgQIECBAgAABAgQIECBAgAABAgQIfKVAEb/Vdj8ECBAgQIAAAQIECBAgQIAAAQIECBAgUK5ASmllOB0qB6IeltDpkxdngzBU72W/hHb0MCUCglA3v6i/fvpP8fE//uvNC0WEANTljAJQlxtZMZrASquKzsZi5MlP7Xu3RntovKsOc/BpGH46GO9WqhMgQIAAAQIECBAgQIAAAQIECBAgQIDArAgIQc3KTToHAQIECBAgQIAAAQIECBAgQIAAAQIEJiCQUlqLiO1hKGp1Alt+7RaHJxfRfXEW3edncXBy0XQ79p8CAUGom1/SX378D/F3//zqRoUEoC7nE4C63MiKywXytKet9VY83rhz+eLJrHgSEb2qqnqT2c4uBAgQIECAAAECBAgQIECAAAECBAgQIDBLAkJQs3SbzkKAAAECBAgQIECAAAECBAgQIECAAIEJCqSUtoZhqMcT3PYrt3r26WfRfX46mBB11E8ltKSHQgUEoW5+MTcJQt1tvRc//P53B5OgfL5cQADKm3ETgbWlhejcvzOY+rS6tHCTUnU9ux8RO8Pw01FdRdUhQIAAAQIECBAgQIAAAQIECBAgQIAAgfkTEIKavzt3YgIECBAgQIAAAQIECBAgQIAAAQIECNQqkFLKSYYciMoTotq1Fr9GsePzFL2X/cGEqKefnF+jgkfmQUAQ6ua3fJ0glADU5e4CUJcbWfGfBVZa1WDiU+f+Yjx8/70SiI4jopt/qqraK6EhPRAgQIAAAQIECBAgQIAAAQIECBAgQIDA9AsIQU3/HToBAQIECBAgQIAAAQIECBAgQIAAAQIEihFIKT2IiM7wZ7npxg5PLmJn/3QQijo4uWi6HfsXJiAIdfML+dFffRy/+OVog10EoC73FoC63MiK3xR4cO9WbLfvxtaHrVi+XcRXv7vDiU85AOVDgAABAgQIECBAgAABAgQIECBAgAABAgRqFSjiN+G1nkgxAgQIECBAgAABAgQIECBAgAABAgQIEChCIKWUp0PlQNRmCQ3tvup/MSGqhH70UIaAINTN7uFN/7P4yU9/NlIQ6sc/+Ci++Y08OM7nywQEoLwXowrkqU+djcXYbi/G6tLCqI+Nc93hO1OfDsa5kdoECBAgQIAAAQIECBAgQIAAAQIECBAgMN8CQlDzff9OT4AAAQIECBAgQIAAAQIECBAgQIAAgbELpJTWIiIHorYjYnXsG16ywfF5iu7z0+i+OIu912+bbsf+BQgIQt3sEkYJQv35H/9BfOd38n8KfL5MQADKezGKQJ721Nm4E5vrrVGWj3vNcZ74lMNPVVU9Hfdm6hMgQIAAAQIECBAgQIAAAQIECBAgQIAAgSwgBOU9IECAAAECBAgQIECAAAECBAgQIECAAIGJCaSUHgzDUDkUtTyxjb9io/3XbwdhqO6L0zjqp6bbsX+DAoJQN8P/uiCUANTX2wpA3ezdm/Wn15YWBhOfcgCqkKlP+xGxkwNQVVUdzbq/8xEgQIAAAQIECBAgQIAAAQIECBAgQIBAWQJCUGXdh24IECBAgAABAgQIECBAgAABAgQIECAwNwIppU5E5J+HJRx691V/EIjqveyX0I4eGhAQhLoZeg5C/d//z/8X+X8//whAfb2pANTN3rlZfXqlVcXWeiu223ejfe9WCcfMU5+6OfxUVdVBCQ3pgQABAgQIECBAgAABAgQIECBAgAABAgTmU0AIaj7v3akJECBAgAABAgQIECBAgAABAgQIECBQjEBKaW0YhsqBqNWmGzs8uRgEoXb2T+Pg5KLpduw/YQFBqJuB/+KXR/GTn/5sEIT63rd/N7737W/drOCMPn18nuLR//tvsff67Yye0LGuI/Dog9vR2bgzmPq0fLuIr3F3c/ipqqredc7jGQIECBAgQIAAAQIECBAgQIAAAQIECBAgULdAEb89r/tQ6hEgQIAAAQIECBAgQIAAAQIECBAgQIDAdAqklB4NA1GPSzjB/uu3sbP/Jnqv+nHUTyW0pIcJCAhC3Qw5B6H+7p9fxZ8++r2bFZrRpwWgZvRir3mstaWFQehpu70Yq0sL16xS62OHeeJTRPRMfarVVTECBAgQIECAAAECBAgQIECAAAECBAgQqEFACKoGRCUIECBAgAABAgQIECBAgAABAgQIECBAoF6BlNJKRGxFxHZEtOutfvVqObSQp0N1X5zF00/Or17AE1MnIAg1dVc2FQ0LQE3FNU2kyRx8ylOfNtdbE9nvkk2Oc+hpOPXpaQkN6YEAAQIECBAgQIAAAQIECBAgQIAAAQIECHyZgBCU94IAAQIECBAgQIAAAQIECBAgQIAAAQIEihZIKa0Nw1A5FLXadLOHJxeDMFT3+VkcnFw03Y79xyggCDVG3DksLQA1h5f+H4784N6tQfCpc38xlm8X8TXtsxx8Gk59OnJDBAgQIECAAAECBAgQIECAAAECBAgQIECgdIEifrteOpL+CBAgQIAAAQIECBAgQIAAAQIECBAgQKAMgZRSDkJ1ImKzhI6effpZdJ+fDkJRPrMpIAg1m/c66VMJQE1avJz9VlpVbK23Yrt9N9r3bpXQ2OFw6tNOVVUHJTSkBwIECBAgQIAAAQIECBAgQIAAAQIECBAgMKqAENSoUtYRIECAAAECBAgQIECAAAECBAgQIECAQDECKaWVYRgqB6LaTTeWAw69l/3Y2X8Te6/fNt2O/WsWyOGF//md/1JzVeXmRUAAal5u+jfP+eiD24OpT4837pQCsJunPlVV1SulIX0QIECAAAECBAgQIECAAAECBAgQIECAAIGrCghBXVXMegIECBAgQIAAAQIECBAgQIAAAQIECBAoSiCl9CAitiMiT4labrq5w5OL2NnP06FO46ifmm7H/jUJ5DDD//qj36qpmjLzIiAANS83/etzri0tROf+nUH4aXVpoYTD56lPO8Pw01EJDemBAAECBAgQIECAAAECBAgQIECAAAECBAjcREAI6iZ6niVAgAABAgQIECBAgAABAgQIECBAgACBogRSSnkyVA5DbZbQ2O6rfnRfnA2mRPlMv4Ag1PTf4SRPIAA1Se1m98r/bdj6sBWb661mG/n17scRkac97VRVtVdCQ3ogQIAAAQIECBAgQIAAAQIECBAgQIAAAQJ1CQhB1SWpDgECBAgQIECAAAECBAgQIECAAAECBAgUI5BSWhuGofKEqNWmG8thiO7zPB3qLPZev226HfvfQEAQ6gZ4c/SoANTsX/aDe7cGE5869xdj+XYRX7k+G0586s6+vhMSIECAAAECBAgQIECAAAECBAgQIECAwLwKFPEb+XnFd24CBAgQIECAAAECBAgQIECAAAECBAgQGL9ASulRRHw+IWp5/Dt+/Q77r9/Gzv6b6L3qx1E/Nd2O/a8hIAh1DbQ5ekQAanYve6VVRWdjcRB+at+7VcJBD3PwaRh+OiihIT0QIECAAAECBAgQIECAAAECBAgQIECAAIFxCghBjVNXbQIECBAgQIAAAQIECBAgQIAAAQIECBAoRiCltDKcDpUDUQ9LaOzJi7NBGKr3sl9CO3q4goAg1BWw5mipANRsXvbWh63YWm/F4407pRzwSUT0qqrqldKQPggQIECAAAECBAgQIECAAAECBAgQIECAwCQEhKAmoWwPAgQIECBAgAABAgQIECBAgAABAgQIEChKIKW0FhHbw1DUatPNHZ5cRPfFWXSfn8XByUXT7dh/RAFBqBGh5mSZANRsXfTa0kJ07t8ZTH1aXVoo4XD770x9OiqhIT0QIECAAAECBAgQIECAAAECBAgQIECAAIFJCwhBTVrcfgQIECBAgAABAgQIECBAgAABAgQIECBQlEBKaWsYhnpcQmPPPv0sus9PBxOijvqphJb08DUCglBejywgADU770H+d7pzfzEevv9eCYc6fif4tFdCQ3ogQIAAAQIECBAgQIAAAQIECBAgQIAAAQJNCghBNalvbwIECBAgQIAAAQIECBAgQIAAAQIECBAoRiCltDIMQ+UJUe2mG8uhit7L/mBC1NNPzptux/5fIyAINd+vhwDU9N//g3u3Yrt9N7Y+bMXy7SK+Pt2NiF5VVd3p13UCAgQIECBAgAABAgQIECBAgAABAgQIECBQn0ARv8Wv7zgqESBAgAABAgQIECBAgAABAgQIECBAgACBmwuklB5ERGf4s3zzijercHhyETv7p4NQ1MHJxc2KeXosAoJQY2EtvqgAVPFX9JUNrrSq6GwsxnZ7MVaXFko4yOE7U58OSmhIDwQIECBAgAABAgQIECBAgAABAgQIECBAoDQBIajSbkQ/BAgQIECAAAECBAgQIECAAAECBAgQIFCUQEppaxiG2iyhsd1X/S8mRJXQjx7+XUAQar7eBgGo6bzvPO0p/7u6ud4q5QBPcvipqqqnpTSkDwIECBAgQIAAAQIECBAgQIAAAQIECBAgUKqAEFSpN6MvAgQIECBAgAABAgQIECBAgAABAgQIEChKIKW0FhE5ELUdEatNN5cDGN3np9F9cRZ7r9823Y79hwKCUPPxKghATdc9ry0tDCY+5QBUIVOf9iNiJyJ6VVUdTZembgkQIECAAAECBAgQIECAAAECBAgQIECAQHMCQlDN2duZAAECBAgQIECAAAECBAgQIECAAAECBKZUIKX0YBiGyqGo5aaPsf/67SAM1X1xGkf91HQ7c7+/INRsvwICUNNxvyutKrbWW9G5vxgP33+vhKaP88Sn4dSnvRIa0gMBAgQIECBAgAABAgQIECBAgAABAgQIEJg2ASGoabsx/RIgQIAAAQIECBAgQIAAAQIECBAgQIBAUQIppU5E5J+HJTS2+6o/CET1XvZLaGduexCEms2rF4Aq/14ffXA78r9/eerT8u0ivgrdHQafeuXr6ZAAAQIECBAgQIAAAQIECBAgQIAAAQIECJQtUMRv/ssm0h0BAgQIECBAgAABAgQIECBAgAABAgQIELhcIKW0NgxD5UDU6uVPjHfF4cnFIAi1s38aBycX491M9S8VEISarRdDAKrc+1xbWhiEnrbbi7G6tFBCo4cRsRMRvaqqDkpoSA8ECBAgQIAAAQIECBAgQIAAAQIECBAgQGAWBISgZuEWnYEAAQIECBAgQIAAAQIECBAgQIAAAQIEihJIKT0aBqIel9DY/uu3sbP/Jnqv+nHUTyW0NDc9CELNxlULQJV5jzn4lP8d21xvldDgcQ49Dac+PS2hIT0QIECAAAECBAgQIECAAAECBAgQIECAAIFZExCCmrUbdR4CBAgQIECAAAECBAgQIECAAAECBAgQKEYgpbQSEVsRsR0R7aYby0GOPB2q++Isnn5y3nQ7c7O/INR0X3UOET7q/ZsAYSHXmKc+5YlPnfuLsasNMBMAACAASURBVHy7iK8699+Z+nRUCJM2CBAgQIAAAQIECBAgQIAAAQIECBAgQIDATAoU8c3ATMo6FAECBAgQIECAAAECBAgQIECAAAECBAgQeEcgpbQ2DEPlUNRq0ziHJxeDMFT3+VkcnFw03c7M7y8INZ1XLABVxr2ttKrYWm/FdvtutO/dKqGpw+HUp52qqg5KaEgPBAgQIECAAAECBAgQIECAAAECBAgQIEBgHgSEoObhlp2RAAECBAgQIECAAAECBAgQIECAAAECBIoSSCnlIFQnIjZLaOzZp59F9/npIBTlMz4BQajx2Y6jsgDUOFSvVvPRB7cj/3uz9WGrlKlPuxHRraqqd7WTWE2AAAECBAgQIECAAAECBAgQIECAAAECBAjUISAEVYeiGgQIECBAgAABAgQIECBAgAABAgQIECBA4BoCKaWVYRgqB6La1yhR6yPH5yl6L/uxs/8m9l6/rbW2Yr8WEISajjdBAKq5e1pbWojO/TuDf1dWlxaaa+Tfd85Tn3aG4aejEhrSAwECBAgQIECAAAECBAgQIECAAAECBAgQmFcBIah5vXnnJkCAAAECBAgQIECAAAECBAgQIECAAIGiBFJKDyJiOyLylKjlpps7PLmInf08Heo0jvqp6XZman9BqLKvUwCqmfv5fOLT5nqrmQZ+c9fjiMjTnnaqqtoroSE9ECBAgAABAgQIECBAgAABAgQIECBAgAABAhFCUN4CAgQIECBAgAABAgQIECBAgAABAgQIECBQmEBKKU+GymGozRJa233Vj+6Ls8GUKJ96BB59cDt6f7Icy7d9VVOPaD1VBKDqcRy1yoN7twYTnzr3F0v5d+FZnviUA1BVVZn6NOpFWkeAAAECBAgQIECAAAECBAgQIECAAAECBCYk4Ju1CUHbhgABAgQIECBAgAABAgQIECBAgAABAgQIXFUgpbQ2DEPlCVGrV32+7vXH5ym6z/N0qLPYe/227vJzVy8HQJ5+77dLCX/Mnf9/PLAA1GRegZVWFVvrrdhu3432vVuT2fTrdzkcBp+6VVUdlNCQHggQIECAAAECBAgQIECAAAECBAgQIECAAIEvFxCC8mYQIECAAAECBAgQIECAAAECBAgQIECAAIEpEEgpPYqIzydELTfdcg6M7Oy/id6rfhz1U9PtTO3+glBlXJ0A1PjvYevD1iD89Hjjzvg3G22HJ8OJT73RlltFgAABAgQIECBAgAABAgQIECBAgAABAgQINC0gBNX0DdifAAECBAgQIECAAAECBAgQIECAAAECBAhcQSCltDKcDpUDUQ+v8OjYlj55cTYIQ/Ve9se2xywXFoRq9nYFoMbnv7a0EJ37d6KzcSdWlxbGt9Holfffmfp0NPpjVhIgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIlCAhBlXALeiBAgAABAgQIECBAgAABAgQIECBAgAABAtcQSCmtRcT2MBS1eo0StT5yeHIR3Rdn0X1+FgcnF7XWnvViglDN3LAA1Hjcc+ipc38xHr7/3ng2uFrV4zzxKSJ2qqrau9qjVhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIlCQhBlXQbeiFAgAABAgQIECBAgAABAgQIECBAgAABAtcUSCltDcNQj69ZotbHnn36WXSfnw4mRB31U621Z7WYINRkb1YAql7v/P5ut+/G1oetWL5dxFeQz/LUp6qquvWeVDUCBAgQIECAAAECBAgQIECAAAECBAgQIECgKYEivoFo6vD2JUCAAAECBAgQIECAAAECBAgQIECAAAECsyaQUloZhqHyhKh20+c7Pk/Re9kfTIh6+sl50+0Uv78g1GSuSACqHueVVhWdjcXIk5/a927VU/RmVQ5z8GkYfjq4WSlPEyBAgAABAgQIECBAgAABAgQIECBAgAABAqUJCEGVdiP6IUCAAAECBAgQIECAAAECBAgQIECAAAECNQmklB5ERGf4s1xT2WuXOTy5iJ3900Eo6uDk4tp1Zv1BQajx3rAA1M1987SnHHzaXG/dvFg9FZ4Mg09P6ymnCgECBAgQIECAAAECBAgQIECAAAECBAgQIFCigBBUibeiJwIECBAgQIAAAQIECBAgQIAAAQIECBAgULNASmlrGIbarLn0tcrtvup/MSHqWgVm/CFBqPFcsADU9V3XlhZiu70YOQC1urRw/UL1PbkfETsR0auq6qi+sioRIECAAAECBAgQIECAAAECBAgQIECAAAECpQoIQZV6M/oiQIAAAQIECBAgQIAAAQIECBAgQIAAAQJjEEgprUVEDkRtR8TqGLa4Usnj8xTd56fRfXEWe6/fXunZWV8sCFXvDQtAXd1zpVXF1norOvcX4+H77129QP1PHOeJT8OpT3v1l1eRAAECBAgQIECAAAECBAgQIECAAAECBAgQKFlACKrk29EbAQIECBAgQIAAAQIECBAgQIAAAQIECBAYo0BK6cEwDJVDUctj3Gqk0jmkksNQ3RencdRPIz0z64sEoeq5YQGoqznm9267fXcw9Wn5dhFfJ+4OJz7lAJQPAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMKcCRXxrMaf2jk2AAAECBAgQIECAAAECBAgQIECAAAECBIoRSCl1IiL/PCyhqd1X/UEgqveyX0I7jfYgCHUzfgGo0fzWlhYGoaft9mKsLi2M9tB4Vx1GxM4w/HQw3q1UJ0CAAAECBAgQIECAAAECBAgQIECAAAECBKZBQAhqGm5JjwQIECBAgAABAgQIECBAgAABAgQIECBAYEICKaW1YRgqB6JWJ7TtV25zeHIxCELt7J/GwclF0+00tr8g1PXoBaAud8vBp87Gndhcb12+ePwrjnPoKSK6VVU9Hf92diBAgAABAgQIECBAgAABAgQIECBAgAABAgSmSUAIappuS68ECBAgQIAAAQIECBAgQIAAAQIECBAgQGCCAimlR8NA1OMJbvuVW+VAy87+m+i96sdRP5XQ0kR7EIS6GrcA1Fd75alPeeJT5/5iLN8u4uvC/XemPh1d7aatJkCAAAECBAgQIECAAAECBAgQIECAAAECBOZFoIhvNeYF2zkJECBAgAABAgQIECBAgAABAgQIECBAgMA0CqSUViJiKyK2I6Ld9BmOz9NgOlT3xVk8/eS86XYmur8g1GjcAlD/2WmlVcXWeiu223ejfe/WaJDjXZWnPnVz+KmqqoPxbqU6AQIECBAgQIAAAQIECBAgQIAAAQIECBAgMAsCQlCzcIvOQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEJiSQUlobhqFyKGp1Qtt+5TaHJxeDMFT3+VkcnFw03c5E9heE+npmAajf9Hn0we3obNyJrQ9bpUx92s3hp6qqehP5F8YmBAgQIECAAAECBAgQIECAAAECBAgQIECAwMwICEHNzFU6CAECBAgQIECAAAECBAgQIECAAAECBAgQmKxASikHoToRsTnZnb98t2effhbd56eDUNSsfwShvvyGn7w4i87f/mrWr//S860tLQxCT9vtxVhdWrh0/QQWHOaJT8Pw09EE9rMFAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMIMCQlAzeKmORIAAAQIECBAgQIAAAQIECBAgQIAAAQIEJimQUloZhqFyIKo9yb2/bK/j8xS9l/3Y2X8Te6/fNt3O2PYXhPpNWgGo+GLi0+Z6a2zv3RUKH0dEnva0U1XV3hWes5QAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg8KUCQlBeDAIECBAgQIAAAQIECBAgQIAAAQIECBAgQKA2gZTSg4jYjog8JWq5tsLXLHR4chE7+3k61Gkc9dM1q5T7mCDUr+9mngNQ+R3obNyJzv3FWL5dxFd/z/LEpxyAqqrK1Kdy//OhMwIECBAgQIAAAQIECBAgQIAAAQIECBAgMHUCRXwTMnVqGiZAgAABAgQIECBAgAABAgQIECBAgAABAgQuFUgp5clQOQy1eeniCSzYfdWP7ouzwZSoWfrMexBqHgNQK60qttZbsd2+G+17t0p4nQ/fmfp0UEJDeiBAgAABAgQIECBAgAABAgQIECBAgAABAgRmT0AIavbu1IkIECBAgAABAgQIECBAgAABAgQIECBAgEBRAimltWEYKk+IWm26uePzFN3neTrUWey9ftt0O7XsP69BqHkLQD364PZg6tPjjTu1vDc1FHkynPjUq6GWEgQIECBAgAABAgQIECBAgAABAgQIECBAgACBrxUQgvKCECBAgAABAgQIECBAgAABAgQIECBAgAABAhMTSCk9iojPJ0QtT2zjr9ho//Xb2Nl/E71X/Tjqp6bbudH+a0sL0fuT5VImA93oLKM8PC8BqHyvnft3BuGn1aWFUWjGvWY/Irr5p6qqo3Fvpj4BAgQIECBAgAABAgQIECBAgAABAgQIECBA4HMBISjvAgECBAgQIECAAAECBAgQIECAAAECBAgQIDBxgZTSynA6VA5EPZx4A1+yYQ7V5DBU72W/hHau1cNKq4qnW78980GoeQhA5dBT5/5iPHz/vWu9CzU/dJwnPkXETlVVezXXVo4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMJKAENRITBYRIECAAAECBAgQIECAAAECBAgQIECAAAEC4xJIKa1FxPYwFLU6rn1GrXt4chHdF2fRfX4WBycXoz5WzLpZD0LNcgDqwb1bsd2+G1sftmL5dhFf4z0bTnzKk598CBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKNChTx7UmjAjYnQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEihFIKW0Nw1CPS2jq2aefRff56WBC1FE/ldDSSD3MahBqFgNQ+a46G4uRJz+1790a6X7HvOgwB5+G4aeDMe+lPAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgZAEhqJGpLCRAgAABAgQIECBAgAABAgQIECBAgAABAgQmJZBSWhmGofKEqPak9v2qfY7PU/Re9gcTop5+ct50OyPtP2tBqFkLQOVpT1vrrXi8cWek+5zAoicR0auqqjeBvWxBgAABAgQIECBAgAABAgQIECBAgAABAgQIELiygBDUlck8QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECExSIKX0ICI6w5/lSe79ZXsdnlzEzv7pIBR1cHLRdDtfu/+sBKFmJQC1trQQ2+3FyAGo1aWFEt6d/YjYGYafjkpoSA8ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAga8SEILybhAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJTI5BS2hqGoTZLaHr3Vf+LCVEl9PNlPUx7EGraA1DZP0986txfjIfvv1fCa3IcEd38U1XVXgkN6YEAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMIqAENQoStYQIECAAAECBAgQIECAAAECBAgQIECAAAECRQmklNYiIgeitiNitenmjs9TdJ+fRvfFWey9ftt0O/9p/2kNQk1zAOrBvVux3b47mPq0fLuIr+R2hxOfcgDKhwABAgQIECBAgAABAgQIECBAgAABAgQIECAwdQJFfOMydWoaJkCAAAECBAgQIECAAAECBAgQIECAAAECBIoRSCk9GIahcihquenG9l+/HYShui9O46ifmm7ni/2nLQg1jQGobNzZWIzt9mKsLi2UcPeH70x9OiihIT0QIECAAAECBAgQIECAAAECBAgQIECAAAECBK4rIAR1XTnPESBAgAABAgQIECBAgAABAgQIECBAgAABAsUJpJQ6EZF/HpbQ3O6r/iAQ1XvZL6GdmJYg1LQFoPK0p87Gndhcb5Vwz8d54lMOP1VV9bSEhvRAgAABAgQIECBAgAABAgQIECBAgAABAgQIEKhDQAiqDkU1CBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgaIEUkprwzBUDkStNt3c4cnFIAi1s38aBycXjbZTehBqWgJQa0sLg4lPOQBVyNSn/YjYyQGoqqqOGn3JbE6AAAECBAgQIECAAAECBAgQIECAAAECBAgQGIOAENQYUJUkQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEyhFIKT0aBqIel9DV/uu3sbP/Jnqv+nHUT420VGoQqvQAVHbbWm/FdvtutO/dauTu/sOmeepTN4efqqo6KKEhPRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIExiUgBDUuWXUJECBAgAABAgQIECBAgAABAgQIECBAgACBogRSSisRsRUR2xHRbrq54/M0mA7VfXEWTz85n3g7pQWhSg5APfrgdnQ27gymPi3fLuLrtd0cfqqqqjfxF8eGBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGGBIr4lqahs9uWAAECBAgQIECAAAECBAgQIECAAAECBAgQmFOBlNLaMAyVQ1GrTTMcnlwMwlDd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BAgQIECAwDwLCEHN8+07OwECBAgQIECAAAECBAgQIECAAAECBAgQIFCkQEqpExH552EJDe6+6g8CUb2X/d9o590g1HUCUGtLC4OJTzkAVcjUp/2I2ImIXlVVRyXY64EAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQODXAkJQ3gQCBAgQIECAAAECBAgQIECAAAECBAgQIECAQKECKaW1YRgqB6JWm27z8ORiEITa2T+Ng5OLQTs73/kvsTecGjVKfyutKrbWW9G5vxgP339vlEfGveY4T3zKR6mq6mDcm6lPgAABAgQIECBAgAABAgQIECBAgAABAgQIECBwPQEhqOu5eYoAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMFGBlNKjYSDq8UQ3/orN9l+/jZ39N9F71Y+jfrq0pUcf3I7Oxp3B1Kfl20V8RbWbw09VVfUubd4CAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBxgWK+IapcQUNECBAgAABAgQIECBAgAABAgQIECBAgAABAgSmRCCltBIRWxGxHRHtpts+Pk+D6VDdF2fx9JPz32hnbWlhEHrabi/G6tJC063m/Q/zxKeI6Jn6VMJ16IEAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMLqAENToVlYSIECAAAECBAgQIECAAAECBAgQIECAAAECBIoSSCmtDcNQORS12nRzhycXgzDU3uu3g6lPm+utplvK+x/n0NNw6tPTEhrSAwECBAgQIECAAAECBAgQIECAAAECBAgQIECAwNUFhKCubuYJAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBxAimlHITqRMRmcc0109D+O1Ofjpppwa4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJ1CQhB1SWpDgECBAgQIECAAAECBAgQIECAAAECBAgQIECgAIGU0sowDJUDUe0CWppkC4fDqU87VVUdTHJjexEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECIxXQAhqvL6qEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQaE0gpPYiI7YjIU6KWG2tk/BvvRkS3qqre+LeyAwECBAgQIECAAAECBAgQIECAAAECBAgQIECAQBMCQlBNqNuTAAECBAgQIECAAAECBAgQIECAAAECBAgQIDBhgZRSngyVw1CbE956XNvlqU87w/DT0bg2UZcAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKAMASGoMu5BFwQIECBAgAABAgQIECBAgAABAgQIECBAgACBiQiklNaGYag8IWp1IpvWt8lxRORpTztVVe3VV1YlAgQIECBAgAABAgQIECBAgAABAgQIECBAgACB0gWEoEq/If0RIECAAAECBAgQIECAAAECBAgQIECAAAECBMYkkFJ6FBGfT4haHtM2dZR9lic+5QBUVVWmPtUhqgYBAgQIECBAgAABAgQIECBAgAABAgQIECBAYMoEhKCm7MK0S4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBCoWyCltDKcDpUDUQ/rrn/NeofD4FO3qqqDa9bwGAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwIwICEHNyEU6BgECBAgQIECAAAECBAgQIECAAAECBAgQIECgDoGU0lpEbA9DUat11LxijSfDiU+9Kz5nOQECBAgQIECAAAECBAgQIECAAAECBAgQIECAwAwLCEHN8OU6GgECBAgQIECAAAECBAgQIECAAAECBAgQIEDgJgIppa1hGOrxTeqM8Oz+O1OfjkZYbwkBAgQIECBAgAABAgQIECBAgAABAgQIECBAgMCcCQhBzdmFOy4BAgQIECBAgAABAgQIECBAgAABAgQIECBA4KoCKaWVYRgqT4hqX/X5r1h/nCc+RcROVVV7NdVUhgABAgQIECBAgAABAgQIECBAgAABAgQIECBAYEYFhKBm9GIdiwABAgQIECBAgAABAgQIECBAgAABAgQIECAwDoGU0oOI6Ax/lq+xx24OP1VV1b3Gsx4hQIAAAQIECBAgQIAAAQIErHJV9AAAIABJREFUCBAgQIAAAQIECBCYUwEhqDm9eMcmQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECNxUIKW0NQxDbV5S6zAicuipW1XVwU339TwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgMD8CQhBzd+dOzEBAgQIECBAgAABAgQIECBAgAABAgQIECBAoFaBlNJaRORA1HZErL5T/Mkw+PS01g0VI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQmDsBIai5u3IHJkCAAAECBAgQIECAAAECBAgQIECAAAECBAiMTyCl9CAi8k+vqqqj8e2kMgECBAgQIECAAAECBAgQIECAAAECBAgQIECAwDwJCEHN0207KwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIEpFBCCmsJL0zIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBeRIQgpqn23ZWAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAlMoIAQ1hZemZQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLzJCAENU+37awECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEplBACGoKL03LBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBOZJQAhqnm7bWQkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAhMoYAQ1BRempYJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIzJOAENQ83bazEiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEJhCASGoKbw0LRMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBCYJwEhqHm6bWclQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMIUCQlBTeGlaJkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDBPAkJQ83TbzkqAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgCgWEoKbw0rRMgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYJ4EhKDm6badlQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMAUCghBTeGlaZkAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAPAkIQc3TbTsrAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgSkUEIKawkvTMgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIF5EhCCmqfbdlYCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECUyggBDWFl6ZlAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAvMkIAQ1T7ftrAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSmUEAIagovTcsECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE5klACGqebttZCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECPz/7NtBEQAAAAHB/q3luLENWG8ECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHio+qYqAAAgAElEQVQScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4OE4tGMAACAASURBVGgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNa+HRQBAAAQEOzfWg5z24D1RoAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAAByqmxcAAAIABJREFUAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACW/ZIdAAAIlUlEQVQBAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBASWC9/Dedn3vKBAAAAABJRU5ErkJggg==" style=""/></g></g></svg> diff --git a/dms/test/video.mp4 b/dms/test/video.mp4 new file mode 100644 index 00000000..20733f83 Binary files /dev/null and b/dms/test/video.mp4 differ diff --git a/dms/tests/__init__.py b/dms/tests/__init__.py new file mode 100644 index 00000000..2502c8f4 --- /dev/null +++ b/dms/tests/__init__.py @@ -0,0 +1,7 @@ +from . import test_storage_attachment +from . import test_storage_database +from . import test_directory +from . import test_file_database +from . import test_file +from . import test_benchmark +from . import test_portal diff --git a/dms/tests/common.py b/dms/tests/common.py new file mode 100644 index 00000000..d09a5a8e --- /dev/null +++ b/dms/tests/common.py @@ -0,0 +1,227 @@ +# Copyright 2017-2019 MuK IT GmbH. +# Copyright 2020 Creu Blanca +# Copyright 2021-2024 Tecnativa - Víctor Martínez +# Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +import base64 +import functools +import logging +import threading +import time +import uuid + +from odoo.tests import Form, new_test_user + +from odoo.addons.base.tests.common import BaseCommon + +_logger = logging.getLogger(__name__) + +# ---------------------------------------------------------- +# Decorators +# ---------------------------------------------------------- + + +def track_function( + max_query_count=None, max_query_time=None, max_time=None, return_tracking=False +): + def decorator(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + tracking_parameters = [func.__name__] + threading.current_thread().query_time = 0 + threading.current_thread().query_count = 0 + threading.current_thread().perf_t0 = time.time() + result = func(*args, **kwargs) + message = f"{func.__name__}" + if args and hasattr(args[0], "uid"): + message = f" ({args[0].uid})" + if hasattr(threading.current_thread(), "query_count"): + query_count = threading.current_thread().query_count + query_time = threading.current_thread().query_time + perf_t0 = threading.current_thread().perf_t0 + remaining_time = time.time() - perf_t0 - query_time + time_taken = query_time + remaining_time + message += ( + f" - {query_count} Q {query_time:.3f}s" + f"QT {remaining_time:.3f}s OT {time_taken:.3f}s TT" + ) + + tracking_parameters += [ + query_count, + query_time, + remaining_time, + time_taken, + ] + if max_query_count and query_count > max_query_count: + raise AssertionError(f"More than {max_query_count} queries") + if max_query_time and query_time > max_query_time: + raise AssertionError( + f"Queries took longer than {max_query_time:.3f}s" + ) + if max_time and time_taken > max_time: + raise AssertionError("Function took longer than {max_time:.3f}s") + if not return_tracking: + _logger.info(message) + if return_tracking: + return result, tracking_parameters + return result + + return wrapper + + return decorator + + +# ---------------------------------------------------------- +# Test Cases +# ---------------------------------------------------------- + + +class DocumentsBaseCase(BaseCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + # models + cls.access_group_model = cls.env["dms.access.group"] + cls.storage_model = cls.env["dms.storage"] + cls.directory_model = cls.env["dms.directory"] + cls.file_model = cls.env["dms.file"] + cls.category_model = cls.env["dms.category"] + cls.tag_model = cls.env["dms.tag"] + cls.attachment_model = cls.env["ir.attachment"] + cls.partner_model = cls.env["res.partner"] + # users + cls.user = new_test_user(cls.env, login="basic-user") + cls.public_user = cls.env.ref("base.public_user") + cls.dms_user = new_test_user( + cls.env, login="dms-user", groups="dms.group_dms_user" + ) + cls.dms_manager_user = new_test_user( + cls.env, login="dms-manager", groups="dms.group_dms_manager" + ) + cls.access_group = cls.access_group_model.create( + { + "name": "Test", + "perm_create": True, + "perm_write": True, + "perm_unlink": True, + "explicit_user_ids": [ + (6, 0, [cls.dms_user.id, cls.dms_manager_user.id]) + ], + } + ) + + @classmethod + def content_base64(cls): + return base64.b64encode(b"\xff data") + + @classmethod + def create_storage(cls, save_type="database"): + return cls.storage_model.create( + {"name": "Test Storage", "save_type": save_type} + ) + + @classmethod + def create_directory(cls, storage=False, directory=False, model_id=False): + record = Form(cls.directory_model) + record.name = uuid.uuid4().hex + record.is_root_directory = True + if model_id and storage.save_type == "attachment": + # set storage_id_save_type to attachment, making model visible + record.storage_id = storage + record.model_id = model_id + if directory: + record.is_root_directory = False + record.parent_id = directory + else: + record.storage_id = storage + if not storage.inherit_access_from_parent_record: + record.group_ids.add(cls.access_group) + return record.save() + + @classmethod + def create_file(cls, directory=False, content=False): + record = Form(cls.file_model) + record.name = uuid.uuid4().hex + record.directory_id = directory + record.content = content or cls.content_base64() + return record.save() + + @classmethod + def create_attachment(cls, name, res_model=False, res_id=False, content=False): + return cls.attachment_model.create( + { + "name": name, + "res_model": res_model, + "res_id": res_id, + "datas": content or cls.content_base64(), + } + ) + + +class StorageAttachmentBaseCase(DocumentsBaseCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.storage = cls.create_storage(save_type="attachment") + cls.storage.write( + { + "inherit_access_from_parent_record": True, + "include_message_attachments": True, + "model_ids": [(6, 0, [cls.env.ref("base.model_res_partner").id])], + } + ) + cls.partner_model_id = cls.env.ref("base.model_res_partner") + cls.create_directory(storage=cls.storage, model_id=cls.partner_model_id) + cls.partner = cls.partner_model.create({"name": "test partner"}) + cls.other_partner = cls.partner_model.create({"name": "other partner"}) + cls.model_partner = cls.env.ref("base.model_res_partner") + + @classmethod + def _create_attachment(cls, name, partner=None): + """ + Create an attachment for the partner model. + If no partner is provided, the default partner is used. + + :param str name: The name of the attachment. + :param odoo.model.res_partner partner: The partner to attach the document to. + + :return: The created attachment. + :rtype: odoo.model.ir.attachment + """ + if not partner: + partner = cls.partner + return cls.create_attachment( + name=name, + res_model=cls.partner_model._name, + res_id=partner.id, + ) + + @classmethod + def _get_partner_directory(cls, partner=False): + if not partner: + partner = cls.partner + return cls.directory_model.search( + [ + ("storage_id", "=", cls.storage.id), + ("res_model", "=", cls.partner_model._name), + ("res_id", "=", partner.id), + ] + ) + + +class StorageDatabaseBaseCase(DocumentsBaseCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.storage = cls.create_storage(save_type="database") + cls.directory = cls.create_directory(storage=cls.storage) + cls.file = cls.create_file(directory=cls.directory) + + +class StorageFileBaseCase(DocumentsBaseCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.storage = cls.create_storage(save_type="file") + cls.directory = cls.create_directory(storage=cls.storage) + cls.file = cls.create_file(directory=cls.directory) diff --git a/dms/tests/data/dms.category.csv b/dms/tests/data/dms.category.csv new file mode 100644 index 00000000..eeba3423 --- /dev/null +++ b/dms/tests/data/dms.category.csv @@ -0,0 +1,51 @@ +id,name,parent_id/id +dms.category_001_benchmark,C_001, +dms.category_002_benchmark,C_002,dms.category_001_benchmark +dms.category_003_benchmark,C_003,dms.category_002_benchmark +dms.category_004_benchmark,C_004,dms.category_001_benchmark +dms.category_005_benchmark,C_005,dms.category_002_benchmark +dms.category_006_benchmark,C_006,dms.category_003_benchmark +dms.category_007_benchmark,C_007,dms.category_005_benchmark +dms.category_008_benchmark,C_008,dms.category_002_benchmark +dms.category_009_benchmark,C_009,dms.category_006_benchmark +dms.category_010_benchmark,C_010, +dms.category_011_benchmark,C_011,dms.category_001_benchmark +dms.category_012_benchmark,C_012,dms.category_007_benchmark +dms.category_013_benchmark,C_013,dms.category_009_benchmark +dms.category_014_benchmark,C_014,dms.category_013_benchmark +dms.category_015_benchmark,C_015,dms.category_005_benchmark +dms.category_016_benchmark,C_016, +dms.category_017_benchmark,C_017, +dms.category_018_benchmark,C_018, +dms.category_019_benchmark,C_019,dms.category_002_benchmark +dms.category_020_benchmark,C_020,dms.category_013_benchmark +dms.category_021_benchmark,C_021,dms.category_008_benchmark +dms.category_022_benchmark,C_022, +dms.category_023_benchmark,C_023,dms.category_021_benchmark +dms.category_024_benchmark,C_024, +dms.category_025_benchmark,C_025, +dms.category_026_benchmark,C_026,dms.category_016_benchmark +dms.category_027_benchmark,C_027,dms.category_015_benchmark +dms.category_028_benchmark,C_028, +dms.category_029_benchmark,C_029,dms.category_010_benchmark +dms.category_030_benchmark,C_030,dms.category_021_benchmark +dms.category_031_benchmark,C_031,dms.category_003_benchmark +dms.category_032_benchmark,C_032,dms.category_017_benchmark +dms.category_033_benchmark,C_033,dms.category_030_benchmark +dms.category_034_benchmark,C_034, +dms.category_035_benchmark,C_035, +dms.category_036_benchmark,C_036, +dms.category_037_benchmark,C_037,dms.category_011_benchmark +dms.category_038_benchmark,C_038,dms.category_010_benchmark +dms.category_039_benchmark,C_039,dms.category_013_benchmark +dms.category_040_benchmark,C_040, +dms.category_041_benchmark,C_041,dms.category_034_benchmark +dms.category_042_benchmark,C_042,dms.category_023_benchmark +dms.category_043_benchmark,C_043,dms.category_015_benchmark +dms.category_044_benchmark,C_044,dms.category_041_benchmark +dms.category_045_benchmark,C_045,dms.category_039_benchmark +dms.category_046_benchmark,C_046,dms.category_021_benchmark +dms.category_047_benchmark,C_047, +dms.category_048_benchmark,C_048, +dms.category_049_benchmark,C_049,dms.category_042_benchmark +dms.category_050_benchmark,C_050,dms.category_034_benchmark diff --git a/dms/tests/data/dms.directory.csv b/dms/tests/data/dms.directory.csv new file mode 100644 index 00000000..abf95411 --- /dev/null +++ b/dms/tests/data/dms.directory.csv @@ -0,0 +1,501 @@ +id,name,parent_id/id,storage_id/id,is_root_directory,category_id/id,tag_ids/id +dms.directory_001_benchmark,D_0001,,dms.storage_001_benchmark,TRUE,dms.category_041_benchmark,dms.tag_042_benchmark +dms.directory_002_benchmark,D_0002,,dms.storage_002_benchmark,TRUE,dms.category_021_benchmark,dms.tag_140_benchmark +dms.directory_003_benchmark,D_0003,,dms.storage_001_benchmark,TRUE,dms.category_017_benchmark,dms.tag_017_benchmark +dms.directory_004_benchmark,D_0004,,dms.storage_002_benchmark,TRUE,dms.category_005_benchmark,dms.tag_058_benchmark +dms.directory_005_benchmark,D_0005,,dms.storage_001_benchmark,TRUE,dms.category_019_benchmark,dms.tag_081_benchmark +dms.directory_006_benchmark,D_0006,,dms.storage_002_benchmark,TRUE,,dms.tag_127_benchmark +dms.directory_007_benchmark,D_0007,,dms.storage_001_benchmark,TRUE,dms.category_005_benchmark,dms.tag_121_benchmark +dms.directory_008_benchmark,D_0008,,dms.storage_002_benchmark,TRUE,dms.category_039_benchmark,dms.tag_146_benchmark +dms.directory_009_benchmark,D_0009,dms.directory_008_benchmark,,,dms.category_014_benchmark,dms.tag_149_benchmark +dms.directory_010_benchmark,D_0010,dms.directory_003_benchmark,,,dms.category_033_benchmark,dms.tag_039_benchmark +dms.directory_011_benchmark,D_0011,dms.directory_007_benchmark,,,,dms.tag_130_benchmark +dms.directory_012_benchmark,D_0012,dms.directory_009_benchmark,,,dms.category_034_benchmark,dms.tag_142_benchmark +dms.directory_013_benchmark,D_0013,dms.directory_010_benchmark,,,dms.category_021_benchmark,dms.tag_136_benchmark +dms.directory_014_benchmark,D_0014,dms.directory_013_benchmark,,,dms.category_022_benchmark,dms.tag_073_benchmark +dms.directory_015_benchmark,D_0015,dms.directory_008_benchmark,,,dms.category_024_benchmark,dms.tag_084_benchmark +dms.directory_016_benchmark,D_0016,dms.directory_010_benchmark,,,dms.category_014_benchmark,dms.tag_149_benchmark +dms.directory_017_benchmark,D_0017,dms.directory_010_benchmark,,,dms.category_023_benchmark,dms.tag_085_benchmark +dms.directory_018_benchmark,D_0018,dms.directory_010_benchmark,,,dms.category_035_benchmark,dms.tag_101_benchmark +dms.directory_019_benchmark,D_0019,dms.directory_011_benchmark,,,dms.category_001_benchmark,dms.tag_051_benchmark +dms.directory_020_benchmark,D_0020,dms.directory_010_benchmark,,,dms.category_033_benchmark,dms.tag_113_benchmark +dms.directory_021_benchmark,D_0021,dms.directory_003_benchmark,,,dms.category_049_benchmark,dms.tag_007_benchmark +dms.directory_022_benchmark,D_0022,dms.directory_009_benchmark,,,dms.category_050_benchmark,dms.tag_117_benchmark +dms.directory_023_benchmark,D_0023,dms.directory_016_benchmark,,,dms.category_032_benchmark,dms.tag_064_benchmark +dms.directory_024_benchmark,D_0024,dms.directory_016_benchmark,,,dms.category_027_benchmark,dms.tag_001_benchmark +dms.directory_025_benchmark,D_0025,dms.directory_014_benchmark,,,dms.category_032_benchmark,dms.tag_064_benchmark +dms.directory_026_benchmark,D_0026,dms.directory_014_benchmark,,,dms.category_024_benchmark,dms.tag_049_benchmark +dms.directory_027_benchmark,D_0027,dms.directory_008_benchmark,,,,dms.tag_127_benchmark +dms.directory_028_benchmark,D_0028,dms.directory_018_benchmark,,,dms.category_034_benchmark,dms.tag_142_benchmark +dms.directory_029_benchmark,D_0029,dms.directory_019_benchmark,,,dms.category_014_benchmark,dms.tag_078_benchmark +dms.directory_030_benchmark,D_0030,dms.directory_001_benchmark,,,dms.category_021_benchmark,dms.tag_140_benchmark +dms.directory_031_benchmark,D_0031,dms.directory_008_benchmark,,,dms.category_040_benchmark,dms.tag_072_benchmark +dms.directory_032_benchmark,D_0032,dms.directory_023_benchmark,,,dms.category_032_benchmark,dms.tag_064_benchmark +dms.directory_033_benchmark,D_0033,dms.directory_004_benchmark,,,dms.category_015_benchmark,dms.tag_089_benchmark +dms.directory_034_benchmark,D_0034,dms.directory_031_benchmark,,,dms.category_018_benchmark,dms.tag_018_benchmark +dms.directory_035_benchmark,D_0035,dms.directory_014_benchmark,,,dms.category_049_benchmark,dms.tag_093_benchmark +dms.directory_036_benchmark,D_0036,dms.directory_016_benchmark,,,,dms.tag_070_benchmark +dms.directory_037_benchmark,D_0037,dms.directory_029_benchmark,,,dms.category_018_benchmark,dms.tag_133_benchmark +dms.directory_038_benchmark,D_0038,dms.directory_036_benchmark,,,dms.category_043_benchmark,dms.tag_138_benchmark +dms.directory_039_benchmark,D_0039,dms.directory_030_benchmark,,,dms.category_049_benchmark,dms.tag_035_benchmark +dms.directory_040_benchmark,D_0040,dms.directory_008_benchmark,,,,dms.tag_123_benchmark +dms.directory_041_benchmark,D_0041,dms.directory_004_benchmark,,,dms.category_032_benchmark,dms.tag_064_benchmark +dms.directory_042_benchmark,D_0042,dms.directory_012_benchmark,,,, +dms.directory_043_benchmark,D_0043,dms.directory_001_benchmark,,,,dms.tag_108_benchmark +dms.directory_044_benchmark,D_0044,dms.directory_012_benchmark,,,dms.category_027_benchmark,dms.tag_001_benchmark +dms.directory_045_benchmark,D_0045,dms.directory_013_benchmark,,,dms.category_016_benchmark,dms.tag_100_benchmark +dms.directory_046_benchmark,D_0046,dms.directory_043_benchmark,,,,dms.tag_013_benchmark +dms.directory_047_benchmark,D_0047,dms.directory_003_benchmark,,,dms.category_034_benchmark,dms.tag_033_benchmark +dms.directory_048_benchmark,D_0048,dms.directory_018_benchmark,,,dms.category_040_benchmark,dms.tag_043_benchmark +dms.directory_049_benchmark,D_0049,dms.directory_023_benchmark,,,, +dms.directory_050_benchmark,D_0050,dms.directory_033_benchmark,,,dms.category_001_benchmark,dms.tag_122_benchmark +dms.directory_051_benchmark,D_0051,dms.directory_004_benchmark,,,dms.category_005_benchmark,dms.tag_121_benchmark +dms.directory_052_benchmark,D_0052,dms.directory_034_benchmark,,,,dms.tag_046_benchmark +dms.directory_053_benchmark,D_0053,dms.directory_037_benchmark,,,dms.category_001_benchmark,dms.tag_143_benchmark +dms.directory_054_benchmark,D_0054,dms.directory_049_benchmark,,,dms.category_050_benchmark,dms.tag_117_benchmark +dms.directory_055_benchmark,D_0055,dms.directory_028_benchmark,,,dms.category_019_benchmark,dms.tag_055_benchmark +dms.directory_056_benchmark,D_0056,dms.directory_032_benchmark,,,dms.category_001_benchmark,dms.tag_051_benchmark +dms.directory_057_benchmark,D_0057,dms.directory_025_benchmark,,,,dms.tag_127_benchmark +dms.directory_058_benchmark,D_0058,dms.directory_054_benchmark,,,dms.category_049_benchmark,dms.tag_007_benchmark +dms.directory_059_benchmark,D_0059,dms.directory_019_benchmark,,,dms.category_040_benchmark,dms.tag_043_benchmark +dms.directory_060_benchmark,D_0060,dms.directory_059_benchmark,,,,dms.tag_037_benchmark +dms.directory_061_benchmark,D_0061,dms.directory_025_benchmark,,,,dms.tag_046_benchmark +dms.directory_062_benchmark,D_0062,dms.directory_052_benchmark,,,dms.category_046_benchmark,dms.tag_022_benchmark +dms.directory_063_benchmark,D_0063,dms.directory_017_benchmark,,,dms.category_019_benchmark,dms.tag_081_benchmark +dms.directory_064_benchmark,D_0064,dms.directory_057_benchmark,,,,dms.tag_123_benchmark +dms.directory_065_benchmark,D_0065,dms.directory_002_benchmark,,,dms.category_031_benchmark,dms.tag_111_benchmark +dms.directory_066_benchmark,D_0066,dms.directory_008_benchmark,,,dms.category_026_benchmark,dms.tag_027_benchmark +dms.directory_067_benchmark,D_0067,dms.directory_026_benchmark,,,dms.category_003_benchmark,dms.tag_106_benchmark +dms.directory_068_benchmark,D_0068,dms.directory_016_benchmark,,,dms.category_050_benchmark,dms.tag_110_benchmark +dms.directory_069_benchmark,D_0069,dms.directory_061_benchmark,,,dms.category_011_benchmark,dms.tag_144_benchmark +dms.directory_070_benchmark,D_0070,dms.directory_018_benchmark,,,dms.category_049_benchmark,dms.tag_093_benchmark +dms.directory_071_benchmark,D_0071,dms.directory_036_benchmark,,,,dms.tag_091_benchmark +dms.directory_072_benchmark,D_0072,dms.directory_046_benchmark,,,dms.category_043_benchmark,dms.tag_139_benchmark +dms.directory_073_benchmark,D_0073,dms.directory_013_benchmark,,,dms.category_001_benchmark,dms.tag_051_benchmark +dms.directory_074_benchmark,D_0074,dms.directory_038_benchmark,,,,dms.tag_044_benchmark +dms.directory_075_benchmark,D_0075,dms.directory_023_benchmark,,,dms.category_028_benchmark,dms.tag_052_benchmark +dms.directory_076_benchmark,D_0076,dms.directory_037_benchmark,,,dms.category_033_benchmark,dms.tag_113_benchmark +dms.directory_077_benchmark,D_0077,dms.directory_058_benchmark,,,dms.category_049_benchmark,dms.tag_093_benchmark +dms.directory_078_benchmark,D_0078,dms.directory_034_benchmark,,,dms.category_011_benchmark,dms.tag_080_benchmark +dms.directory_079_benchmark,D_0079,dms.directory_034_benchmark,,,dms.category_018_benchmark,dms.tag_083_benchmark +dms.directory_080_benchmark,D_0080,dms.directory_037_benchmark,,,dms.category_006_benchmark,dms.tag_041_benchmark +dms.directory_081_benchmark,D_0081,dms.directory_050_benchmark,,,,dms.tag_091_benchmark +dms.directory_082_benchmark,D_0082,dms.directory_042_benchmark,,,dms.category_041_benchmark,dms.tag_087_benchmark +dms.directory_083_benchmark,D_0083,dms.directory_038_benchmark,,,,dms.tag_134_benchmark +dms.directory_084_benchmark,D_0084,dms.directory_067_benchmark,,,,dms.tag_119_benchmark +dms.directory_085_benchmark,D_0085,dms.directory_041_benchmark,,,dms.category_050_benchmark,dms.tag_050_benchmark +dms.directory_086_benchmark,D_0086,dms.directory_001_benchmark,,,dms.category_031_benchmark,dms.tag_111_benchmark +dms.directory_087_benchmark,D_0087,dms.directory_083_benchmark,,,dms.category_040_benchmark,dms.tag_043_benchmark +dms.directory_088_benchmark,D_0088,dms.directory_036_benchmark,,,dms.category_005_benchmark,dms.tag_058_benchmark +dms.directory_089_benchmark,D_0089,dms.directory_044_benchmark,,,,dms.tag_010_benchmark +dms.directory_090_benchmark,D_0090,dms.directory_040_benchmark,,,,dms.tag_119_benchmark +dms.directory_091_benchmark,D_0091,dms.directory_011_benchmark,,,dms.category_003_benchmark,dms.tag_145_benchmark +dms.directory_092_benchmark,D_0092,dms.directory_045_benchmark,,,dms.category_003_benchmark,dms.tag_106_benchmark +dms.directory_093_benchmark,D_0093,dms.directory_007_benchmark,,,dms.category_033_benchmark,dms.tag_113_benchmark +dms.directory_094_benchmark,D_0094,dms.directory_003_benchmark,,,dms.category_041_benchmark,dms.tag_042_benchmark +dms.directory_095_benchmark,D_0095,dms.directory_085_benchmark,,,,dms.tag_004_benchmark +dms.directory_096_benchmark,D_0096,dms.directory_023_benchmark,,,dms.category_014_benchmark,dms.tag_059_benchmark +dms.directory_097_benchmark,D_0097,dms.directory_007_benchmark,,,, +dms.directory_098_benchmark,D_0098,dms.directory_070_benchmark,,,dms.category_005_benchmark,dms.tag_121_benchmark +dms.directory_099_benchmark,D_0099,dms.directory_053_benchmark,,,,dms.tag_127_benchmark +dms.directory_100_benchmark,D_0100,dms.directory_092_benchmark,,,dms.category_017_benchmark,dms.tag_017_benchmark +dms.directory_101_benchmark,D_0101,dms.directory_037_benchmark,,,dms.category_011_benchmark,dms.tag_021_benchmark +dms.directory_102_benchmark,D_0102,dms.directory_063_benchmark,,,dms.category_026_benchmark,dms.tag_027_benchmark +dms.directory_103_benchmark,D_0103,dms.directory_067_benchmark,,,dms.category_044_benchmark,dms.tag_095_benchmark +dms.directory_104_benchmark,D_0104,dms.directory_018_benchmark,,,dms.category_041_benchmark,dms.tag_036_benchmark +dms.directory_105_benchmark,D_0105,dms.directory_056_benchmark,,,,dms.tag_034_benchmark +dms.directory_106_benchmark,D_0106,dms.directory_085_benchmark,,,dms.category_003_benchmark,dms.tag_106_benchmark +dms.directory_107_benchmark,D_0107,dms.directory_053_benchmark,,,dms.category_022_benchmark,dms.tag_073_benchmark +dms.directory_108_benchmark,D_0108,dms.directory_027_benchmark,,,,dms.tag_013_benchmark +dms.directory_109_benchmark,D_0109,dms.directory_045_benchmark,,,dms.category_009_benchmark,dms.tag_025_benchmark +dms.directory_110_benchmark,D_0110,dms.directory_076_benchmark,,,,dms.tag_124_benchmark +dms.directory_111_benchmark,D_0111,dms.directory_091_benchmark,,,dms.category_025_benchmark,dms.tag_074_benchmark +dms.directory_112_benchmark,D_0112,dms.directory_066_benchmark,,,dms.category_021_benchmark,dms.tag_140_benchmark +dms.directory_113_benchmark,D_0113,dms.directory_056_benchmark,,,,dms.tag_104_benchmark +dms.directory_114_benchmark,D_0114,dms.directory_031_benchmark,,,, +dms.directory_115_benchmark,D_0115,dms.directory_078_benchmark,,,,dms.tag_075_benchmark +dms.directory_116_benchmark,D_0116,dms.directory_099_benchmark,,,dms.category_049_benchmark,dms.tag_093_benchmark +dms.directory_117_benchmark,D_0117,dms.directory_043_benchmark,,,dms.category_040_benchmark,dms.tag_054_benchmark +dms.directory_118_benchmark,D_0118,dms.directory_042_benchmark,,,,dms.tag_108_benchmark +dms.directory_119_benchmark,D_0119,dms.directory_055_benchmark,,,dms.category_049_benchmark,dms.tag_007_benchmark +dms.directory_120_benchmark,D_0120,dms.directory_006_benchmark,,,,dms.tag_137_benchmark +dms.directory_121_benchmark,D_0121,dms.directory_020_benchmark,,,dms.category_005_benchmark,dms.tag_058_benchmark +dms.directory_122_benchmark,D_0122,dms.directory_096_benchmark,,,dms.category_039_benchmark,dms.tag_128_benchmark +dms.directory_123_benchmark,D_0123,dms.directory_079_benchmark,,,dms.category_037_benchmark,dms.tag_030_benchmark +dms.directory_124_benchmark,D_0124,dms.directory_050_benchmark,,,,dms.tag_010_benchmark +dms.directory_125_benchmark,D_0125,dms.directory_073_benchmark,,,dms.category_031_benchmark,dms.tag_114_benchmark +dms.directory_126_benchmark,D_0126,dms.directory_112_benchmark,,,dms.category_043_benchmark,dms.tag_079_benchmark +dms.directory_127_benchmark,D_0127,dms.directory_069_benchmark,,,dms.category_015_benchmark,dms.tag_056_benchmark +dms.directory_128_benchmark,D_0128,dms.directory_091_benchmark,,,dms.category_025_benchmark,dms.tag_112_benchmark +dms.directory_129_benchmark,D_0129,dms.directory_037_benchmark,,,dms.category_019_benchmark,dms.tag_055_benchmark +dms.directory_130_benchmark,D_0130,dms.directory_028_benchmark,,,dms.category_012_benchmark,dms.tag_057_benchmark +dms.directory_131_benchmark,D_0131,dms.directory_018_benchmark,,,dms.category_001_benchmark,dms.tag_102_benchmark +dms.directory_132_benchmark,D_0132,dms.directory_128_benchmark,,,dms.category_041_benchmark,dms.tag_115_benchmark +dms.directory_133_benchmark,D_0133,dms.directory_054_benchmark,,,dms.category_034_benchmark,dms.tag_142_benchmark +dms.directory_134_benchmark,D_0134,dms.directory_114_benchmark,,,dms.category_032_benchmark,dms.tag_064_benchmark +dms.directory_135_benchmark,D_0135,dms.directory_062_benchmark,,,dms.category_013_benchmark,dms.tag_068_benchmark +dms.directory_136_benchmark,D_0136,dms.directory_069_benchmark,,,dms.category_032_benchmark,dms.tag_064_benchmark +dms.directory_137_benchmark,D_0137,dms.directory_090_benchmark,,,dms.category_021_benchmark,dms.tag_140_benchmark +dms.directory_138_benchmark,D_0138,dms.directory_065_benchmark,,,dms.category_040_benchmark,dms.tag_043_benchmark +dms.directory_139_benchmark,D_0139,dms.directory_125_benchmark,,,dms.category_034_benchmark,dms.tag_033_benchmark +dms.directory_140_benchmark,D_0140,dms.directory_067_benchmark,,,,dms.tag_108_benchmark +dms.directory_141_benchmark,D_0141,dms.directory_040_benchmark,,,dms.category_025_benchmark,dms.tag_074_benchmark +dms.directory_142_benchmark,D_0142,dms.directory_080_benchmark,,,dms.category_016_benchmark,dms.tag_100_benchmark +dms.directory_143_benchmark,D_0143,dms.directory_083_benchmark,,,dms.category_034_benchmark,dms.tag_047_benchmark +dms.directory_144_benchmark,D_0144,dms.directory_095_benchmark,,,,dms.tag_086_benchmark +dms.directory_145_benchmark,D_0145,dms.directory_003_benchmark,,,dms.category_032_benchmark,dms.tag_064_benchmark +dms.directory_146_benchmark,D_0146,dms.directory_126_benchmark,,,dms.category_037_benchmark,dms.tag_030_benchmark +dms.directory_147_benchmark,D_0147,dms.directory_099_benchmark,,,dms.category_005_benchmark,dms.tag_058_benchmark +dms.directory_148_benchmark,D_0148,dms.directory_086_benchmark,,,, +dms.directory_149_benchmark,D_0149,dms.directory_053_benchmark,,,dms.category_025_benchmark,dms.tag_082_benchmark +dms.directory_150_benchmark,D_0150,dms.directory_031_benchmark,,,dms.category_014_benchmark,dms.tag_078_benchmark +dms.directory_151_benchmark,D_0151,dms.directory_134_benchmark,,,dms.category_008_benchmark,dms.tag_077_benchmark +dms.directory_152_benchmark,D_0152,dms.directory_053_benchmark,,,dms.category_034_benchmark,dms.tag_109_benchmark +dms.directory_153_benchmark,D_0153,dms.directory_026_benchmark,,,dms.category_023_benchmark,dms.tag_038_benchmark +dms.directory_154_benchmark,D_0154,dms.directory_118_benchmark,,,,dms.tag_034_benchmark +dms.directory_155_benchmark,D_0155,dms.directory_058_benchmark,,,dms.category_027_benchmark,dms.tag_048_benchmark +dms.directory_156_benchmark,D_0156,dms.directory_077_benchmark,,,dms.category_009_benchmark,dms.tag_025_benchmark +dms.directory_157_benchmark,D_0157,dms.directory_089_benchmark,,,dms.category_003_benchmark,dms.tag_106_benchmark +dms.directory_158_benchmark,D_0158,dms.directory_033_benchmark,,,dms.category_023_benchmark,dms.tag_085_benchmark +dms.directory_159_benchmark,D_0159,dms.directory_010_benchmark,,,dms.category_001_benchmark,dms.tag_099_benchmark +dms.directory_160_benchmark,D_0160,dms.directory_006_benchmark,,,dms.category_007_benchmark,dms.tag_118_benchmark +dms.directory_161_benchmark,D_0161,dms.directory_018_benchmark,,,dms.category_041_benchmark,dms.tag_087_benchmark +dms.directory_162_benchmark,D_0162,dms.directory_026_benchmark,,,dms.category_012_benchmark,dms.tag_057_benchmark +dms.directory_163_benchmark,D_0163,dms.directory_118_benchmark,,,dms.category_004_benchmark,dms.tag_135_benchmark +dms.directory_164_benchmark,D_0164,dms.directory_130_benchmark,,,dms.category_041_benchmark,dms.tag_115_benchmark +dms.directory_165_benchmark,D_0165,dms.directory_104_benchmark,,,dms.category_043_benchmark,dms.tag_138_benchmark +dms.directory_166_benchmark,D_0166,dms.directory_083_benchmark,,,dms.category_014_benchmark,dms.tag_059_benchmark +dms.directory_167_benchmark,D_0167,dms.directory_095_benchmark,,,dms.category_040_benchmark,dms.tag_126_benchmark +dms.directory_168_benchmark,D_0168,dms.directory_021_benchmark,,,dms.category_040_benchmark,dms.tag_024_benchmark +dms.directory_169_benchmark,D_0169,dms.directory_087_benchmark,,,dms.category_037_benchmark,dms.tag_030_benchmark +dms.directory_170_benchmark,D_0170,dms.directory_147_benchmark,,,,dms.tag_006_benchmark +dms.directory_171_benchmark,D_0171,dms.directory_023_benchmark,,,dms.category_020_benchmark,dms.tag_141_benchmark +dms.directory_172_benchmark,D_0172,dms.directory_002_benchmark,,,dms.category_007_benchmark,dms.tag_118_benchmark +dms.directory_173_benchmark,D_0173,dms.directory_041_benchmark,,,dms.category_033_benchmark,dms.tag_113_benchmark +dms.directory_174_benchmark,D_0174,dms.directory_069_benchmark,,,dms.category_011_benchmark,dms.tag_144_benchmark +dms.directory_175_benchmark,D_0175,dms.directory_091_benchmark,,,dms.category_049_benchmark,dms.tag_093_benchmark +dms.directory_176_benchmark,D_0176,dms.directory_056_benchmark,,,dms.category_049_benchmark,dms.tag_093_benchmark +dms.directory_177_benchmark,D_0177,dms.directory_035_benchmark,,,dms.category_038_benchmark,dms.tag_092_benchmark +dms.directory_178_benchmark,D_0178,dms.directory_108_benchmark,,,dms.category_019_benchmark,dms.tag_055_benchmark +dms.directory_179_benchmark,D_0179,dms.directory_121_benchmark,,,dms.category_017_benchmark,dms.tag_011_benchmark +dms.directory_180_benchmark,D_0180,dms.directory_178_benchmark,,,dms.category_026_benchmark,dms.tag_027_benchmark +dms.directory_181_benchmark,D_0181,dms.directory_085_benchmark,,,,dms.tag_132_benchmark +dms.directory_182_benchmark,D_0182,dms.directory_103_benchmark,,,dms.category_034_benchmark,dms.tag_142_benchmark +dms.directory_183_benchmark,D_0183,dms.directory_086_benchmark,,,dms.category_041_benchmark,dms.tag_053_benchmark +dms.directory_184_benchmark,D_0184,dms.directory_029_benchmark,,,dms.category_011_benchmark,dms.tag_080_benchmark +dms.directory_185_benchmark,D_0185,dms.directory_170_benchmark,,,dms.category_019_benchmark,dms.tag_081_benchmark +dms.directory_186_benchmark,D_0186,dms.directory_100_benchmark,,,dms.category_031_benchmark,dms.tag_111_benchmark +dms.directory_187_benchmark,D_0187,dms.directory_034_benchmark,,,dms.category_034_benchmark,dms.tag_047_benchmark +dms.directory_188_benchmark,D_0188,dms.directory_072_benchmark,,,dms.category_037_benchmark,dms.tag_030_benchmark +dms.directory_189_benchmark,D_0189,dms.directory_022_benchmark,,,dms.category_019_benchmark,dms.tag_081_benchmark +dms.directory_190_benchmark,D_0190,dms.directory_076_benchmark,,,,dms.tag_013_benchmark +dms.directory_191_benchmark,D_0191,dms.directory_146_benchmark,,,,dms.tag_012_benchmark +dms.directory_192_benchmark,D_0192,dms.directory_023_benchmark,,,dms.category_025_benchmark,dms.tag_074_benchmark +dms.directory_193_benchmark,D_0193,dms.directory_183_benchmark,,,,dms.tag_032_benchmark +dms.directory_194_benchmark,D_0194,dms.directory_047_benchmark,,,dms.category_025_benchmark,dms.tag_082_benchmark +dms.directory_195_benchmark,D_0195,dms.directory_094_benchmark,,,dms.category_007_benchmark,dms.tag_118_benchmark +dms.directory_196_benchmark,D_0196,dms.directory_159_benchmark,,,dms.category_005_benchmark,dms.tag_121_benchmark +dms.directory_197_benchmark,D_0197,dms.directory_140_benchmark,,,dms.category_019_benchmark,dms.tag_105_benchmark +dms.directory_198_benchmark,D_0198,dms.directory_169_benchmark,,,dms.category_043_benchmark,dms.tag_079_benchmark +dms.directory_199_benchmark,D_0199,dms.directory_099_benchmark,,,dms.category_050_benchmark,dms.tag_110_benchmark +dms.directory_200_benchmark,D_0200,dms.directory_123_benchmark,,,dms.category_031_benchmark,dms.tag_116_benchmark +dms.directory_201_benchmark,D_0201,dms.directory_090_benchmark,,,dms.category_049_benchmark,dms.tag_093_benchmark +dms.directory_202_benchmark,D_0202,dms.directory_095_benchmark,,,dms.category_013_benchmark,dms.tag_068_benchmark +dms.directory_203_benchmark,D_0203,dms.directory_107_benchmark,,,dms.category_040_benchmark,dms.tag_024_benchmark +dms.directory_204_benchmark,D_0204,dms.directory_105_benchmark,,,,dms.tag_046_benchmark +dms.directory_205_benchmark,D_0205,dms.directory_092_benchmark,,,, +dms.directory_206_benchmark,D_0206,dms.directory_162_benchmark,,,dms.category_018_benchmark,dms.tag_083_benchmark +dms.directory_207_benchmark,D_0207,dms.directory_027_benchmark,,,dms.category_016_benchmark,dms.tag_147_benchmark +dms.directory_208_benchmark,D_0208,dms.directory_011_benchmark,,,,dms.tag_119_benchmark +dms.directory_209_benchmark,D_0209,dms.directory_135_benchmark,,,dms.category_050_benchmark,dms.tag_117_benchmark +dms.directory_210_benchmark,D_0210,dms.directory_160_benchmark,,,dms.category_007_benchmark,dms.tag_118_benchmark +dms.directory_211_benchmark,D_0211,dms.directory_015_benchmark,,,dms.category_041_benchmark,dms.tag_053_benchmark +dms.directory_212_benchmark,D_0212,dms.directory_087_benchmark,,,dms.category_049_benchmark,dms.tag_040_benchmark +dms.directory_213_benchmark,D_0213,dms.directory_015_benchmark,,,dms.category_012_benchmark,dms.tag_057_benchmark +dms.directory_214_benchmark,D_0214,dms.directory_100_benchmark,,,,dms.tag_065_benchmark +dms.directory_215_benchmark,D_0215,dms.directory_075_benchmark,,,,dms.tag_065_benchmark +dms.directory_216_benchmark,D_0216,dms.directory_040_benchmark,,,dms.category_021_benchmark,dms.tag_140_benchmark +dms.directory_217_benchmark,D_0217,dms.directory_056_benchmark,,,dms.category_001_benchmark,dms.tag_099_benchmark +dms.directory_218_benchmark,D_0218,dms.directory_157_benchmark,,,,dms.tag_013_benchmark +dms.directory_219_benchmark,D_0219,dms.directory_154_benchmark,,,dms.category_034_benchmark,dms.tag_047_benchmark +dms.directory_220_benchmark,D_0220,dms.directory_207_benchmark,,,dms.category_012_benchmark,dms.tag_023_benchmark +dms.directory_221_benchmark,D_0221,dms.directory_041_benchmark,,,, +dms.directory_222_benchmark,D_0222,dms.directory_002_benchmark,,,dms.category_014_benchmark,dms.tag_107_benchmark +dms.directory_223_benchmark,D_0223,dms.directory_176_benchmark,,,dms.category_003_benchmark,dms.tag_106_benchmark +dms.directory_224_benchmark,D_0224,dms.directory_223_benchmark,,,dms.category_050_benchmark,dms.tag_117_benchmark +dms.directory_225_benchmark,D_0225,dms.directory_202_benchmark,,,dms.category_038_benchmark,dms.tag_092_benchmark +dms.directory_226_benchmark,D_0226,dms.directory_128_benchmark,,,dms.category_041_benchmark,dms.tag_115_benchmark +dms.directory_227_benchmark,D_0227,dms.directory_044_benchmark,,,dms.category_012_benchmark,dms.tag_023_benchmark +dms.directory_228_benchmark,D_0228,dms.directory_105_benchmark,,,dms.category_012_benchmark,dms.tag_098_benchmark +dms.directory_229_benchmark,D_0229,dms.directory_202_benchmark,,,dms.category_006_benchmark,dms.tag_041_benchmark +dms.directory_230_benchmark,D_0230,dms.directory_104_benchmark,,,dms.category_014_benchmark,dms.tag_107_benchmark +dms.directory_231_benchmark,D_0231,dms.directory_137_benchmark,,,,dms.tag_065_benchmark +dms.directory_232_benchmark,D_0232,dms.directory_179_benchmark,,,,dms.tag_119_benchmark +dms.directory_233_benchmark,D_0233,dms.directory_059_benchmark,,,dms.category_005_benchmark,dms.tag_121_benchmark +dms.directory_234_benchmark,D_0234,dms.directory_147_benchmark,,,,dms.tag_123_benchmark +dms.directory_235_benchmark,D_0235,dms.directory_114_benchmark,,,dms.category_040_benchmark,dms.tag_126_benchmark +dms.directory_236_benchmark,D_0236,dms.directory_033_benchmark,,,dms.category_014_benchmark,dms.tag_149_benchmark +dms.directory_237_benchmark,D_0237,dms.directory_037_benchmark,,,,dms.tag_006_benchmark +dms.directory_238_benchmark,D_0238,dms.directory_083_benchmark,,,dms.category_021_benchmark,dms.tag_140_benchmark +dms.directory_239_benchmark,D_0239,dms.directory_151_benchmark,,,dms.category_021_benchmark,dms.tag_026_benchmark +dms.directory_240_benchmark,D_0240,dms.directory_156_benchmark,,,dms.category_040_benchmark,dms.tag_054_benchmark +dms.directory_241_benchmark,D_0241,dms.directory_034_benchmark,,,, +dms.directory_242_benchmark,D_0242,dms.directory_177_benchmark,,,,dms.tag_032_benchmark +dms.directory_243_benchmark,D_0243,dms.directory_192_benchmark,,,,dms.tag_127_benchmark +dms.directory_244_benchmark,D_0244,dms.directory_022_benchmark,,,dms.category_043_benchmark,dms.tag_139_benchmark +dms.directory_245_benchmark,D_0245,dms.directory_031_benchmark,,,dms.category_017_benchmark,dms.tag_011_benchmark +dms.directory_246_benchmark,D_0246,dms.directory_051_benchmark,,,, +dms.directory_247_benchmark,D_0247,dms.directory_007_benchmark,,,dms.category_022_benchmark,dms.tag_061_benchmark +dms.directory_248_benchmark,D_0248,dms.directory_135_benchmark,,,dms.category_050_benchmark,dms.tag_117_benchmark +dms.directory_249_benchmark,D_0249,dms.directory_111_benchmark,,,,dms.tag_015_benchmark +dms.directory_250_benchmark,D_0250,dms.directory_016_benchmark,,,,dms.tag_123_benchmark +dms.directory_251_benchmark,D_0251,dms.directory_243_benchmark,,,dms.category_024_benchmark,dms.tag_049_benchmark +dms.directory_252_benchmark,D_0252,dms.directory_102_benchmark,,,,dms.tag_009_benchmark +dms.directory_253_benchmark,D_0253,dms.directory_063_benchmark,,,dms.category_003_benchmark,dms.tag_106_benchmark +dms.directory_254_benchmark,D_0254,dms.directory_185_benchmark,,,dms.category_025_benchmark,dms.tag_028_benchmark +dms.directory_255_benchmark,D_0255,dms.directory_024_benchmark,,,dms.category_015_benchmark,dms.tag_002_benchmark +dms.directory_256_benchmark,D_0256,dms.directory_054_benchmark,,,,dms.tag_016_benchmark +dms.directory_257_benchmark,D_0257,dms.directory_122_benchmark,,,,dms.tag_016_benchmark +dms.directory_258_benchmark,D_0258,dms.directory_115_benchmark,,,dms.category_024_benchmark,dms.tag_084_benchmark +dms.directory_259_benchmark,D_0259,dms.directory_136_benchmark,,,,dms.tag_063_benchmark +dms.directory_260_benchmark,D_0260,dms.directory_106_benchmark,,,dms.category_003_benchmark,dms.tag_076_benchmark +dms.directory_261_benchmark,D_0261,dms.directory_247_benchmark,,,, +dms.directory_262_benchmark,D_0262,dms.directory_077_benchmark,,,dms.category_001_benchmark,dms.tag_051_benchmark +dms.directory_263_benchmark,D_0263,dms.directory_017_benchmark,,,dms.category_037_benchmark,dms.tag_030_benchmark +dms.directory_264_benchmark,D_0264,dms.directory_061_benchmark,,,dms.category_043_benchmark,dms.tag_138_benchmark +dms.directory_265_benchmark,D_0265,dms.directory_138_benchmark,,,dms.category_041_benchmark,dms.tag_036_benchmark +dms.directory_266_benchmark,D_0266,dms.directory_252_benchmark,,,dms.category_043_benchmark,dms.tag_138_benchmark +dms.directory_267_benchmark,D_0267,dms.directory_159_benchmark,,,dms.category_012_benchmark,dms.tag_023_benchmark +dms.directory_268_benchmark,D_0268,dms.directory_184_benchmark,,,dms.category_035_benchmark,dms.tag_101_benchmark +dms.directory_269_benchmark,D_0269,dms.directory_253_benchmark,,,dms.category_032_benchmark,dms.tag_064_benchmark +dms.directory_270_benchmark,D_0270,dms.directory_095_benchmark,,,dms.category_039_benchmark,dms.tag_146_benchmark +dms.directory_271_benchmark,D_0271,dms.directory_078_benchmark,,,dms.category_005_benchmark,dms.tag_014_benchmark +dms.directory_272_benchmark,D_0272,dms.directory_022_benchmark,,,dms.category_015_benchmark,dms.tag_002_benchmark +dms.directory_273_benchmark,D_0273,dms.directory_076_benchmark,,,,dms.tag_013_benchmark +dms.directory_274_benchmark,D_0274,dms.directory_194_benchmark,,,dms.category_025_benchmark,dms.tag_112_benchmark +dms.directory_275_benchmark,D_0275,dms.directory_251_benchmark,,,dms.category_014_benchmark,dms.tag_149_benchmark +dms.directory_276_benchmark,D_0276,dms.directory_246_benchmark,,,dms.category_019_benchmark,dms.tag_081_benchmark +dms.directory_277_benchmark,D_0277,dms.directory_073_benchmark,,,dms.category_034_benchmark,dms.tag_033_benchmark +dms.directory_278_benchmark,D_0278,dms.directory_151_benchmark,,,,dms.tag_009_benchmark +dms.directory_279_benchmark,D_0279,dms.directory_143_benchmark,,,,dms.tag_010_benchmark +dms.directory_280_benchmark,D_0280,dms.directory_270_benchmark,,,dms.category_025_benchmark,dms.tag_112_benchmark +dms.directory_281_benchmark,D_0281,dms.directory_146_benchmark,,,dms.category_022_benchmark,dms.tag_020_benchmark +dms.directory_282_benchmark,D_0282,dms.directory_258_benchmark,,,,dms.tag_046_benchmark +dms.directory_283_benchmark,D_0283,dms.directory_098_benchmark,,,,dms.tag_013_benchmark +dms.directory_284_benchmark,D_0284,dms.directory_041_benchmark,,,,dms.tag_006_benchmark +dms.directory_285_benchmark,D_0285,dms.directory_239_benchmark,,,,dms.tag_037_benchmark +dms.directory_286_benchmark,D_0286,dms.directory_229_benchmark,,,dms.category_040_benchmark,dms.tag_024_benchmark +dms.directory_287_benchmark,D_0287,dms.directory_186_benchmark,,,dms.category_037_benchmark,dms.tag_088_benchmark +dms.directory_288_benchmark,D_0288,dms.directory_149_benchmark,,,dms.category_037_benchmark,dms.tag_088_benchmark +dms.directory_289_benchmark,D_0289,dms.directory_187_benchmark,,,dms.category_003_benchmark,dms.tag_076_benchmark +dms.directory_290_benchmark,D_0290,dms.directory_138_benchmark,,,dms.category_024_benchmark,dms.tag_084_benchmark +dms.directory_291_benchmark,D_0291,dms.directory_104_benchmark,,,,dms.tag_013_benchmark +dms.directory_292_benchmark,D_0292,dms.directory_188_benchmark,,,,dms.tag_094_benchmark +dms.directory_293_benchmark,D_0293,dms.directory_030_benchmark,,,dms.category_018_benchmark,dms.tag_083_benchmark +dms.directory_294_benchmark,D_0294,dms.directory_002_benchmark,,,dms.category_040_benchmark,dms.tag_126_benchmark +dms.directory_295_benchmark,D_0295,dms.directory_042_benchmark,,,,dms.tag_037_benchmark +dms.directory_296_benchmark,D_0296,dms.directory_281_benchmark,,,dms.category_037_benchmark,dms.tag_088_benchmark +dms.directory_297_benchmark,D_0297,dms.directory_152_benchmark,,,,dms.tag_012_benchmark +dms.directory_298_benchmark,D_0298,dms.directory_219_benchmark,,,,dms.tag_096_benchmark +dms.directory_299_benchmark,D_0299,dms.directory_133_benchmark,,,dms.category_005_benchmark,dms.tag_121_benchmark +dms.directory_300_benchmark,D_0300,dms.directory_024_benchmark,,,dms.category_026_benchmark,dms.tag_027_benchmark +dms.directory_301_benchmark,D_0301,dms.directory_006_benchmark,,,dms.category_020_benchmark,dms.tag_129_benchmark +dms.directory_302_benchmark,D_0302,dms.directory_211_benchmark,,,dms.category_016_benchmark,dms.tag_147_benchmark +dms.directory_303_benchmark,D_0303,dms.directory_210_benchmark,,,,dms.tag_044_benchmark +dms.directory_304_benchmark,D_0304,dms.directory_047_benchmark,,,dms.category_031_benchmark,dms.tag_111_benchmark +dms.directory_305_benchmark,D_0305,dms.directory_041_benchmark,,,dms.category_040_benchmark,dms.tag_054_benchmark +dms.directory_306_benchmark,D_0306,dms.directory_290_benchmark,,,,dms.tag_108_benchmark +dms.directory_307_benchmark,D_0307,dms.directory_278_benchmark,,,, +dms.directory_308_benchmark,D_0308,dms.directory_303_benchmark,,,dms.category_034_benchmark,dms.tag_142_benchmark +dms.directory_309_benchmark,D_0309,dms.directory_133_benchmark,,,dms.category_035_benchmark,dms.tag_101_benchmark +dms.directory_310_benchmark,D_0310,dms.directory_231_benchmark,,,dms.category_015_benchmark,dms.tag_089_benchmark +dms.directory_311_benchmark,D_0311,dms.directory_223_benchmark,,,dms.category_003_benchmark,dms.tag_106_benchmark +dms.directory_312_benchmark,D_0312,dms.directory_034_benchmark,,,dms.category_018_benchmark,dms.tag_018_benchmark +dms.directory_313_benchmark,D_0313,dms.directory_180_benchmark,,,dms.category_050_benchmark,dms.tag_117_benchmark +dms.directory_314_benchmark,D_0314,dms.directory_284_benchmark,,,,dms.tag_104_benchmark +dms.directory_315_benchmark,D_0315,dms.directory_024_benchmark,,,dms.category_040_benchmark,dms.tag_126_benchmark +dms.directory_316_benchmark,D_0316,dms.directory_297_benchmark,,,,dms.tag_044_benchmark +dms.directory_317_benchmark,D_0317,dms.directory_290_benchmark,,,dms.category_050_benchmark,dms.tag_029_benchmark +dms.directory_318_benchmark,D_0318,dms.directory_081_benchmark,,,dms.category_025_benchmark,dms.tag_097_benchmark +dms.directory_319_benchmark,D_0319,dms.directory_261_benchmark,,,dms.category_041_benchmark,dms.tag_115_benchmark +dms.directory_320_benchmark,D_0320,dms.directory_183_benchmark,,,,dms.tag_086_benchmark +dms.directory_321_benchmark,D_0321,dms.directory_311_benchmark,,,,dms.tag_015_benchmark +dms.directory_322_benchmark,D_0322,dms.directory_009_benchmark,,,,dms.tag_015_benchmark +dms.directory_323_benchmark,D_0323,dms.directory_226_benchmark,,,dms.category_026_benchmark,dms.tag_027_benchmark +dms.directory_324_benchmark,D_0324,dms.directory_013_benchmark,,,,dms.tag_037_benchmark +dms.directory_325_benchmark,D_0325,dms.directory_123_benchmark,,,dms.category_050_benchmark,dms.tag_050_benchmark +dms.directory_326_benchmark,D_0326,dms.directory_201_benchmark,,,,dms.tag_016_benchmark +dms.directory_327_benchmark,D_0327,dms.directory_029_benchmark,,,dms.category_037_benchmark,dms.tag_030_benchmark +dms.directory_328_benchmark,D_0328,dms.directory_231_benchmark,,,dms.category_005_benchmark,dms.tag_121_benchmark +dms.directory_329_benchmark,D_0329,dms.directory_207_benchmark,,,,dms.tag_016_benchmark +dms.directory_330_benchmark,D_0330,dms.directory_078_benchmark,,,dms.category_020_benchmark,dms.tag_141_benchmark +dms.directory_331_benchmark,D_0331,dms.directory_179_benchmark,,,,dms.tag_096_benchmark +dms.directory_332_benchmark,D_0332,dms.directory_019_benchmark,,,dms.category_039_benchmark,dms.tag_003_benchmark +dms.directory_333_benchmark,D_0333,dms.directory_246_benchmark,,,dms.category_034_benchmark,dms.tag_033_benchmark +dms.directory_334_benchmark,D_0334,dms.directory_194_benchmark,,,dms.category_016_benchmark,dms.tag_147_benchmark +dms.directory_335_benchmark,D_0335,dms.directory_190_benchmark,,,dms.category_040_benchmark,dms.tag_024_benchmark +dms.directory_336_benchmark,D_0336,dms.directory_244_benchmark,,,dms.category_039_benchmark,dms.tag_128_benchmark +dms.directory_337_benchmark,D_0337,dms.directory_148_benchmark,,,dms.category_003_benchmark,dms.tag_076_benchmark +dms.directory_338_benchmark,D_0338,dms.directory_197_benchmark,,,,dms.tag_090_benchmark +dms.directory_339_benchmark,D_0339,dms.directory_235_benchmark,,,,dms.tag_006_benchmark +dms.directory_340_benchmark,D_0340,dms.directory_219_benchmark,,,,dms.tag_060_benchmark +dms.directory_341_benchmark,D_0341,dms.directory_071_benchmark,,,dms.category_015_benchmark,dms.tag_089_benchmark +dms.directory_342_benchmark,D_0342,dms.directory_211_benchmark,,,dms.category_017_benchmark,dms.tag_017_benchmark +dms.directory_343_benchmark,D_0343,dms.directory_029_benchmark,,,,dms.tag_037_benchmark +dms.directory_344_benchmark,D_0344,dms.directory_271_benchmark,,,dms.category_004_benchmark,dms.tag_135_benchmark +dms.directory_345_benchmark,D_0345,dms.directory_098_benchmark,,,dms.category_004_benchmark,dms.tag_135_benchmark +dms.directory_346_benchmark,D_0346,dms.directory_065_benchmark,,,dms.category_007_benchmark,dms.tag_067_benchmark +dms.directory_347_benchmark,D_0347,dms.directory_263_benchmark,,,,dms.tag_044_benchmark +dms.directory_348_benchmark,D_0348,dms.directory_294_benchmark,,,dms.category_022_benchmark,dms.tag_020_benchmark +dms.directory_349_benchmark,D_0349,dms.directory_233_benchmark,,,dms.category_031_benchmark,dms.tag_111_benchmark +dms.directory_350_benchmark,D_0350,dms.directory_095_benchmark,,,dms.category_049_benchmark,dms.tag_040_benchmark +dms.directory_351_benchmark,D_0351,dms.directory_342_benchmark,,,dms.category_039_benchmark,dms.tag_003_benchmark +dms.directory_352_benchmark,D_0352,dms.directory_331_benchmark,,,,dms.tag_094_benchmark +dms.directory_353_benchmark,D_0353,dms.directory_067_benchmark,,,dms.category_040_benchmark,dms.tag_126_benchmark +dms.directory_354_benchmark,D_0354,dms.directory_269_benchmark,,,dms.category_022_benchmark,dms.tag_061_benchmark +dms.directory_355_benchmark,D_0355,dms.directory_045_benchmark,,,,dms.tag_104_benchmark +dms.directory_356_benchmark,D_0356,dms.directory_013_benchmark,,,dms.category_024_benchmark,dms.tag_049_benchmark +dms.directory_357_benchmark,D_0357,dms.directory_347_benchmark,,,dms.category_050_benchmark,dms.tag_110_benchmark +dms.directory_358_benchmark,D_0358,dms.directory_099_benchmark,,,dms.category_022_benchmark,dms.tag_020_benchmark +dms.directory_359_benchmark,D_0359,dms.directory_214_benchmark,,,,dms.tag_132_benchmark +dms.directory_360_benchmark,D_0360,dms.directory_043_benchmark,,,, +dms.directory_361_benchmark,D_0361,dms.directory_054_benchmark,,,,dms.tag_044_benchmark +dms.directory_362_benchmark,D_0362,dms.directory_320_benchmark,,,dms.category_011_benchmark,dms.tag_144_benchmark +dms.directory_363_benchmark,D_0363,dms.directory_020_benchmark,,,,dms.tag_134_benchmark +dms.directory_364_benchmark,D_0364,dms.directory_328_benchmark,,,dms.category_014_benchmark,dms.tag_107_benchmark +dms.directory_365_benchmark,D_0365,dms.directory_075_benchmark,,,,dms.tag_015_benchmark +dms.directory_366_benchmark,D_0366,dms.directory_147_benchmark,,,dms.category_041_benchmark,dms.tag_036_benchmark +dms.directory_367_benchmark,D_0367,dms.directory_318_benchmark,,,dms.category_001_benchmark,dms.tag_099_benchmark +dms.directory_368_benchmark,D_0368,dms.directory_143_benchmark,,,,dms.tag_108_benchmark +dms.directory_369_benchmark,D_0369,dms.directory_220_benchmark,,,dms.category_001_benchmark,dms.tag_122_benchmark +dms.directory_370_benchmark,D_0370,dms.directory_194_benchmark,,,dms.category_027_benchmark,dms.tag_001_benchmark +dms.directory_371_benchmark,D_0371,dms.directory_024_benchmark,,,dms.category_022_benchmark,dms.tag_073_benchmark +dms.directory_372_benchmark,D_0372,dms.directory_023_benchmark,,,dms.category_004_benchmark,dms.tag_135_benchmark +dms.directory_373_benchmark,D_0373,dms.directory_149_benchmark,,,dms.category_012_benchmark,dms.tag_023_benchmark +dms.directory_374_benchmark,D_0374,dms.directory_097_benchmark,,,dms.category_007_benchmark,dms.tag_118_benchmark +dms.directory_375_benchmark,D_0375,dms.directory_356_benchmark,,,,dms.tag_016_benchmark +dms.directory_376_benchmark,D_0376,dms.directory_106_benchmark,,,, +dms.directory_377_benchmark,D_0377,dms.directory_145_benchmark,,,dms.category_044_benchmark,dms.tag_095_benchmark +dms.directory_378_benchmark,D_0378,dms.directory_135_benchmark,,,dms.category_038_benchmark,dms.tag_092_benchmark +dms.directory_379_benchmark,D_0379,dms.directory_148_benchmark,,,dms.category_034_benchmark,dms.tag_109_benchmark +dms.directory_380_benchmark,D_0380,dms.directory_108_benchmark,,,dms.category_012_benchmark,dms.tag_023_benchmark +dms.directory_381_benchmark,D_0381,dms.directory_064_benchmark,,,dms.category_003_benchmark,dms.tag_076_benchmark +dms.directory_382_benchmark,D_0382,dms.directory_282_benchmark,,,dms.category_043_benchmark,dms.tag_139_benchmark +dms.directory_383_benchmark,D_0383,dms.directory_172_benchmark,,,dms.category_026_benchmark,dms.tag_027_benchmark +dms.directory_384_benchmark,D_0384,dms.directory_190_benchmark,,,dms.category_039_benchmark,dms.tag_003_benchmark +dms.directory_385_benchmark,D_0385,dms.directory_216_benchmark,,,dms.category_050_benchmark,dms.tag_029_benchmark +dms.directory_386_benchmark,D_0386,dms.directory_181_benchmark,,,dms.category_003_benchmark,dms.tag_145_benchmark +dms.directory_387_benchmark,D_0387,dms.directory_193_benchmark,,,dms.category_015_benchmark,dms.tag_002_benchmark +dms.directory_388_benchmark,D_0388,dms.directory_027_benchmark,,,dms.category_025_benchmark,dms.tag_082_benchmark +dms.directory_389_benchmark,D_0389,dms.directory_164_benchmark,,,dms.category_012_benchmark,dms.tag_057_benchmark +dms.directory_390_benchmark,D_0390,dms.directory_385_benchmark,,,dms.category_013_benchmark,dms.tag_031_benchmark +dms.directory_391_benchmark,D_0391,dms.directory_283_benchmark,,,,dms.tag_086_benchmark +dms.directory_392_benchmark,D_0392,dms.directory_213_benchmark,,,dms.category_029_benchmark,dms.tag_005_benchmark +dms.directory_393_benchmark,D_0393,dms.directory_013_benchmark,,,dms.category_046_benchmark,dms.tag_022_benchmark +dms.directory_394_benchmark,D_0394,dms.directory_214_benchmark,,,dms.category_034_benchmark,dms.tag_142_benchmark +dms.directory_395_benchmark,D_0395,dms.directory_352_benchmark,,,dms.category_001_benchmark,dms.tag_122_benchmark +dms.directory_396_benchmark,D_0396,dms.directory_030_benchmark,,,,dms.tag_132_benchmark +dms.directory_397_benchmark,D_0397,dms.directory_335_benchmark,,,dms.category_001_benchmark,dms.tag_051_benchmark +dms.directory_398_benchmark,D_0398,dms.directory_135_benchmark,,,dms.category_014_benchmark,dms.tag_059_benchmark +dms.directory_399_benchmark,D_0399,dms.directory_382_benchmark,,,dms.category_015_benchmark,dms.tag_120_benchmark +dms.directory_400_benchmark,D_0400,dms.directory_108_benchmark,,,dms.category_024_benchmark,dms.tag_084_benchmark +dms.directory_401_benchmark,D_0401,dms.directory_329_benchmark,,,dms.category_005_benchmark,dms.tag_014_benchmark +dms.directory_402_benchmark,D_0402,dms.directory_253_benchmark,,,dms.category_040_benchmark,dms.tag_072_benchmark +dms.directory_403_benchmark,D_0403,dms.directory_001_benchmark,,,dms.category_020_benchmark,dms.tag_129_benchmark +dms.directory_404_benchmark,D_0404,dms.directory_343_benchmark,,,dms.category_001_benchmark,dms.tag_122_benchmark +dms.directory_405_benchmark,D_0405,dms.directory_143_benchmark,,,dms.category_046_benchmark,dms.tag_062_benchmark +dms.directory_406_benchmark,D_0406,dms.directory_308_benchmark,,,dms.category_039_benchmark,dms.tag_128_benchmark +dms.directory_407_benchmark,D_0407,dms.directory_350_benchmark,,,dms.category_022_benchmark,dms.tag_020_benchmark +dms.directory_408_benchmark,D_0408,dms.directory_383_benchmark,,,dms.category_027_benchmark,dms.tag_001_benchmark +dms.directory_409_benchmark,D_0409,dms.directory_069_benchmark,,,,dms.tag_090_benchmark +dms.directory_410_benchmark,D_0410,dms.directory_239_benchmark,,,dms.category_025_benchmark,dms.tag_097_benchmark +dms.directory_411_benchmark,D_0411,dms.directory_208_benchmark,,,dms.category_046_benchmark,dms.tag_062_benchmark +dms.directory_412_benchmark,D_0412,dms.directory_053_benchmark,,,dms.category_014_benchmark,dms.tag_149_benchmark +dms.directory_413_benchmark,D_0413,dms.directory_191_benchmark,,,dms.category_046_benchmark,dms.tag_062_benchmark +dms.directory_414_benchmark,D_0414,dms.directory_151_benchmark,,,dms.category_040_benchmark,dms.tag_024_benchmark +dms.directory_415_benchmark,D_0415,dms.directory_151_benchmark,,,,dms.tag_090_benchmark +dms.directory_416_benchmark,D_0416,dms.directory_169_benchmark,,,dms.category_039_benchmark,dms.tag_146_benchmark +dms.directory_417_benchmark,D_0417,dms.directory_282_benchmark,,,dms.category_023_benchmark,dms.tag_038_benchmark +dms.directory_418_benchmark,D_0418,dms.directory_300_benchmark,,,dms.category_021_benchmark,dms.tag_026_benchmark +dms.directory_419_benchmark,D_0419,dms.directory_239_benchmark,,,dms.category_026_benchmark,dms.tag_027_benchmark +dms.directory_420_benchmark,D_0420,dms.directory_395_benchmark,,,dms.category_024_benchmark,dms.tag_084_benchmark +dms.directory_421_benchmark,D_0421,dms.directory_303_benchmark,,,dms.category_014_benchmark,dms.tag_078_benchmark +dms.directory_422_benchmark,D_0422,dms.directory_415_benchmark,,,dms.category_022_benchmark,dms.tag_061_benchmark +dms.directory_423_benchmark,D_0423,dms.directory_183_benchmark,,,,dms.tag_006_benchmark +dms.directory_424_benchmark,D_0424,dms.directory_253_benchmark,,,dms.category_037_benchmark,dms.tag_088_benchmark +dms.directory_425_benchmark,D_0425,dms.directory_383_benchmark,,,dms.category_014_benchmark,dms.tag_107_benchmark +dms.directory_426_benchmark,D_0426,dms.directory_421_benchmark,,,dms.category_012_benchmark,dms.tag_023_benchmark +dms.directory_427_benchmark,D_0427,dms.directory_036_benchmark,,,dms.category_043_benchmark,dms.tag_079_benchmark +dms.directory_428_benchmark,D_0428,dms.directory_151_benchmark,,,dms.category_016_benchmark,dms.tag_100_benchmark +dms.directory_429_benchmark,D_0429,dms.directory_008_benchmark,,,dms.category_011_benchmark,dms.tag_021_benchmark +dms.directory_430_benchmark,D_0430,dms.directory_201_benchmark,,,dms.category_041_benchmark,dms.tag_053_benchmark +dms.directory_431_benchmark,D_0431,dms.directory_125_benchmark,,,dms.category_011_benchmark,dms.tag_080_benchmark +dms.directory_432_benchmark,D_0432,dms.directory_275_benchmark,,,dms.category_001_benchmark,dms.tag_051_benchmark +dms.directory_433_benchmark,D_0433,dms.directory_290_benchmark,,,dms.category_033_benchmark,dms.tag_039_benchmark +dms.directory_434_benchmark,D_0434,dms.directory_351_benchmark,,,dms.category_013_benchmark,dms.tag_068_benchmark +dms.directory_435_benchmark,D_0435,dms.directory_089_benchmark,,,, +dms.directory_436_benchmark,D_0436,dms.directory_165_benchmark,,,, +dms.directory_437_benchmark,D_0437,dms.directory_346_benchmark,,,dms.category_012_benchmark,dms.tag_057_benchmark +dms.directory_438_benchmark,D_0438,dms.directory_312_benchmark,,,dms.category_025_benchmark,dms.tag_112_benchmark +dms.directory_439_benchmark,D_0439,dms.directory_330_benchmark,,,dms.category_017_benchmark,dms.tag_011_benchmark +dms.directory_440_benchmark,D_0440,dms.directory_288_benchmark,,,,dms.tag_134_benchmark +dms.directory_441_benchmark,D_0441,dms.directory_342_benchmark,,,dms.category_037_benchmark,dms.tag_088_benchmark +dms.directory_442_benchmark,D_0442,dms.directory_406_benchmark,,,dms.category_021_benchmark,dms.tag_026_benchmark +dms.directory_443_benchmark,D_0443,dms.directory_181_benchmark,,,dms.category_001_benchmark,dms.tag_143_benchmark +dms.directory_444_benchmark,D_0444,dms.directory_096_benchmark,,,dms.category_012_benchmark,dms.tag_057_benchmark +dms.directory_445_benchmark,D_0445,dms.directory_432_benchmark,,,dms.category_041_benchmark,dms.tag_087_benchmark +dms.directory_446_benchmark,D_0446,dms.directory_309_benchmark,,,,dms.tag_009_benchmark +dms.directory_447_benchmark,D_0447,dms.directory_230_benchmark,,,dms.category_043_benchmark,dms.tag_138_benchmark +dms.directory_448_benchmark,D_0448,dms.directory_035_benchmark,,,dms.category_028_benchmark,dms.tag_052_benchmark +dms.directory_449_benchmark,D_0449,dms.directory_262_benchmark,,,,dms.tag_015_benchmark +dms.directory_450_benchmark,D_0450,dms.directory_286_benchmark,,,dms.category_025_benchmark,dms.tag_028_benchmark +dms.directory_451_benchmark,D_0451,dms.directory_153_benchmark,,,dms.category_032_benchmark,dms.tag_064_benchmark +dms.directory_452_benchmark,D_0452,dms.directory_419_benchmark,,,dms.category_033_benchmark,dms.tag_039_benchmark +dms.directory_453_benchmark,D_0453,dms.directory_320_benchmark,,,dms.category_040_benchmark,dms.tag_024_benchmark +dms.directory_454_benchmark,D_0454,dms.directory_333_benchmark,,,,dms.tag_090_benchmark +dms.directory_455_benchmark,D_0455,dms.directory_362_benchmark,,,dms.category_046_benchmark,dms.tag_062_benchmark +dms.directory_456_benchmark,D_0456,dms.directory_334_benchmark,,,dms.category_028_benchmark,dms.tag_052_benchmark +dms.directory_457_benchmark,D_0457,dms.directory_340_benchmark,,,dms.category_043_benchmark,dms.tag_139_benchmark +dms.directory_458_benchmark,D_0458,dms.directory_365_benchmark,,,dms.category_033_benchmark,dms.tag_039_benchmark +dms.directory_459_benchmark,D_0459,dms.directory_291_benchmark,,,,dms.tag_046_benchmark +dms.directory_460_benchmark,D_0460,dms.directory_420_benchmark,,,,dms.tag_016_benchmark +dms.directory_461_benchmark,D_0461,dms.directory_390_benchmark,,,dms.category_050_benchmark,dms.tag_117_benchmark +dms.directory_462_benchmark,D_0462,dms.directory_021_benchmark,,,dms.category_027_benchmark,dms.tag_048_benchmark +dms.directory_463_benchmark,D_0463,dms.directory_402_benchmark,,,dms.category_021_benchmark,dms.tag_136_benchmark +dms.directory_464_benchmark,D_0464,dms.directory_041_benchmark,,,dms.category_040_benchmark,dms.tag_126_benchmark +dms.directory_465_benchmark,D_0465,dms.directory_053_benchmark,,,dms.category_008_benchmark,dms.tag_077_benchmark +dms.directory_466_benchmark,D_0466,dms.directory_446_benchmark,,,,dms.tag_123_benchmark +dms.directory_467_benchmark,D_0467,dms.directory_359_benchmark,,,dms.category_041_benchmark,dms.tag_115_benchmark +dms.directory_468_benchmark,D_0468,dms.directory_321_benchmark,,,dms.category_015_benchmark,dms.tag_056_benchmark +dms.directory_469_benchmark,D_0469,dms.directory_023_benchmark,,,dms.category_014_benchmark,dms.tag_103_benchmark +dms.directory_470_benchmark,D_0470,dms.directory_103_benchmark,,,dms.category_019_benchmark,dms.tag_125_benchmark +dms.directory_471_benchmark,D_0471,dms.directory_468_benchmark,,,dms.category_023_benchmark,dms.tag_085_benchmark +dms.directory_472_benchmark,D_0472,dms.directory_047_benchmark,,,dms.category_049_benchmark,dms.tag_035_benchmark +dms.directory_473_benchmark,D_0473,dms.directory_254_benchmark,,,dms.category_019_benchmark,dms.tag_125_benchmark +dms.directory_474_benchmark,D_0474,dms.directory_200_benchmark,,,dms.category_018_benchmark,dms.tag_133_benchmark +dms.directory_475_benchmark,D_0475,dms.directory_247_benchmark,,,dms.category_011_benchmark,dms.tag_144_benchmark +dms.directory_476_benchmark,D_0476,dms.directory_099_benchmark,,,dms.category_018_benchmark,dms.tag_018_benchmark +dms.directory_477_benchmark,D_0477,dms.directory_258_benchmark,,,dms.category_024_benchmark,dms.tag_084_benchmark +dms.directory_478_benchmark,D_0478,dms.directory_235_benchmark,,,dms.category_024_benchmark,dms.tag_084_benchmark +dms.directory_479_benchmark,D_0479,dms.directory_361_benchmark,,,dms.category_031_benchmark,dms.tag_111_benchmark +dms.directory_480_benchmark,D_0480,dms.directory_027_benchmark,,,dms.category_013_benchmark,dms.tag_068_benchmark +dms.directory_481_benchmark,D_0481,dms.directory_207_benchmark,,,dms.category_041_benchmark,dms.tag_053_benchmark +dms.directory_482_benchmark,D_0482,dms.directory_331_benchmark,,,,dms.tag_123_benchmark +dms.directory_483_benchmark,D_0483,dms.directory_381_benchmark,,,,dms.tag_063_benchmark +dms.directory_484_benchmark,D_0484,dms.directory_180_benchmark,,,dms.category_041_benchmark,dms.tag_036_benchmark +dms.directory_485_benchmark,D_0485,dms.directory_470_benchmark,,,dms.category_001_benchmark,dms.tag_143_benchmark +dms.directory_486_benchmark,D_0486,dms.directory_160_benchmark,,,dms.category_024_benchmark,dms.tag_084_benchmark +dms.directory_487_benchmark,D_0487,dms.directory_307_benchmark,,,dms.category_014_benchmark,dms.tag_107_benchmark +dms.directory_488_benchmark,D_0488,dms.directory_376_benchmark,,,,dms.tag_090_benchmark +dms.directory_489_benchmark,D_0489,dms.directory_371_benchmark,,,dms.category_005_benchmark,dms.tag_058_benchmark +dms.directory_490_benchmark,D_0490,dms.directory_329_benchmark,,,,dms.tag_086_benchmark +dms.directory_491_benchmark,D_0491,dms.directory_065_benchmark,,,dms.category_022_benchmark,dms.tag_020_benchmark +dms.directory_492_benchmark,D_0492,dms.directory_159_benchmark,,,, +dms.directory_493_benchmark,D_0493,dms.directory_261_benchmark,,,dms.category_037_benchmark,dms.tag_030_benchmark +dms.directory_494_benchmark,D_0494,dms.directory_398_benchmark,,,dms.category_041_benchmark,dms.tag_036_benchmark +dms.directory_495_benchmark,D_0495,dms.directory_028_benchmark,,,dms.category_031_benchmark,dms.tag_114_benchmark +dms.directory_496_benchmark,D_0496,dms.directory_284_benchmark,,,dms.category_025_benchmark,dms.tag_082_benchmark +dms.directory_497_benchmark,D_0497,dms.directory_160_benchmark,,,dms.category_005_benchmark,dms.tag_121_benchmark +dms.directory_498_benchmark,D_0498,dms.directory_321_benchmark,,,, +dms.directory_499_benchmark,D_0499,dms.directory_075_benchmark,,,,dms.tag_086_benchmark +dms.directory_500_benchmark,D_0500,dms.directory_385_benchmark,,,dms.category_001_benchmark,dms.tag_143_benchmark diff --git a/dms/tests/data/dms.file.csv b/dms/tests/data/dms.file.csv new file mode 100644 index 00000000..ee9eb58e --- /dev/null +++ b/dms/tests/data/dms.file.csv @@ -0,0 +1,1501 @@ +id,name,directory_id/id,category_id/id,tag_ids/id,content +dms.file_0001_benchmark,F_0001.txt,dms.directory_152_benchmark,dms.category_041_benchmark,dms.tag_042_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0002_benchmark,F_0002.txt,dms.directory_456_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0003_benchmark,F_0003.txt,dms.directory_183_benchmark,dms.category_017_benchmark,dms.tag_017_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0004_benchmark,F_0004.txt,dms.directory_024_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0005_benchmark,F_0005.txt,dms.directory_305_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0006_benchmark,F_0006.txt,dms.directory_449_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0007_benchmark,F_0007.txt,dms.directory_178_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0008_benchmark,F_0008.txt,dms.directory_406_benchmark,dms.category_039_benchmark,dms.tag_146_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0009_benchmark,F_0009.txt,dms.directory_405_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0010_benchmark,F_0010.txt,dms.directory_050_benchmark,dms.category_033_benchmark,dms.tag_039_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0011_benchmark,F_0011.txt,dms.directory_120_benchmark,,dms.tag_130_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0012_benchmark,F_0012.txt,dms.directory_010_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0013_benchmark,F_0013.txt,dms.directory_214_benchmark,dms.category_021_benchmark,dms.tag_136_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0014_benchmark,F_0014.txt,dms.directory_490_benchmark,dms.category_022_benchmark,dms.tag_073_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0015_benchmark,F_0015.txt,dms.directory_435_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0016_benchmark,F_0016.txt,dms.directory_337_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0017_benchmark,F_0017.txt,dms.directory_146_benchmark,dms.category_023_benchmark,dms.tag_085_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0018_benchmark,F_0018.txt,dms.directory_260_benchmark,dms.category_035_benchmark,dms.tag_101_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0019_benchmark,F_0019.txt,dms.directory_483_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0020_benchmark,F_0020.txt,dms.directory_200_benchmark,dms.category_033_benchmark,dms.tag_113_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0021_benchmark,F_0021.txt,dms.directory_426_benchmark,dms.category_049_benchmark,dms.tag_007_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0022_benchmark,F_0022.txt,dms.directory_284_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0023_benchmark,F_0023.txt,dms.directory_463_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0024_benchmark,F_0024.txt,dms.directory_010_benchmark,dms.category_027_benchmark,dms.tag_001_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0025_benchmark,F_0025.txt,dms.directory_077_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0026_benchmark,F_0026.txt,dms.directory_131_benchmark,dms.category_024_benchmark,dms.tag_049_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0027_benchmark,F_0027.txt,dms.directory_072_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0028_benchmark,F_0028.txt,dms.directory_439_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0029_benchmark,F_0029.txt,dms.directory_314_benchmark,dms.category_014_benchmark,dms.tag_078_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0030_benchmark,F_0030.txt,dms.directory_049_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0031_benchmark,F_0031.txt,dms.directory_272_benchmark,dms.category_040_benchmark,dms.tag_072_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0032_benchmark,F_0032.txt,dms.directory_193_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0033_benchmark,F_0033.txt,dms.directory_151_benchmark,dms.category_015_benchmark,dms.tag_089_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0034_benchmark,F_0034.txt,dms.directory_482_benchmark,dms.category_018_benchmark,dms.tag_018_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0035_benchmark,F_0035.txt,dms.directory_317_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0036_benchmark,F_0036.txt,dms.directory_203_benchmark,,dms.tag_070_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0037_benchmark,F_0037.txt,dms.directory_291_benchmark,dms.category_018_benchmark,dms.tag_133_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0038_benchmark,F_0038.txt,dms.directory_191_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0039_benchmark,F_0039.txt,dms.directory_463_benchmark,dms.category_049_benchmark,dms.tag_035_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0040_benchmark,F_0040.txt,dms.directory_036_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0041_benchmark,F_0041.txt,dms.directory_280_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0042_benchmark,F_0042.txt,dms.directory_366_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0043_benchmark,F_0043.txt,dms.directory_322_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0044_benchmark,F_0044.txt,dms.directory_271_benchmark,dms.category_027_benchmark,dms.tag_001_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0045_benchmark,F_0045.txt,dms.directory_339_benchmark,dms.category_016_benchmark,dms.tag_100_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0046_benchmark,F_0046.txt,dms.directory_011_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0047_benchmark,F_0047.txt,dms.directory_281_benchmark,dms.category_034_benchmark,dms.tag_033_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0048_benchmark,F_0048.txt,dms.directory_314_benchmark,dms.category_040_benchmark,dms.tag_043_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0049_benchmark,F_0049.txt,dms.directory_022_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0050_benchmark,F_0050.txt,dms.directory_308_benchmark,dms.category_001_benchmark,dms.tag_122_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0051_benchmark,F_0051.txt,dms.directory_138_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0052_benchmark,F_0052.txt,dms.directory_332_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0053_benchmark,F_0053.txt,dms.directory_173_benchmark,dms.category_001_benchmark,dms.tag_143_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0054_benchmark,F_0054.txt,dms.directory_499_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0055_benchmark,F_0055.txt,dms.directory_184_benchmark,dms.category_019_benchmark,dms.tag_055_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0056_benchmark,F_0056.txt,dms.directory_067_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0057_benchmark,F_0057.txt,dms.directory_196_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0058_benchmark,F_0058.txt,dms.directory_222_benchmark,dms.category_049_benchmark,dms.tag_007_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0059_benchmark,F_0059.txt,dms.directory_360_benchmark,dms.category_040_benchmark,dms.tag_043_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0060_benchmark,F_0060.txt,dms.directory_260_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0061_benchmark,F_0061.txt,dms.directory_333_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0062_benchmark,F_0062.txt,dms.directory_491_benchmark,dms.category_046_benchmark,dms.tag_022_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0063_benchmark,F_0063.txt,dms.directory_408_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0064_benchmark,F_0064.txt,dms.directory_210_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0065_benchmark,F_0065.txt,dms.directory_112_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0066_benchmark,F_0066.txt,dms.directory_090_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0067_benchmark,F_0067.txt,dms.directory_207_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0068_benchmark,F_0068.txt,dms.directory_078_benchmark,dms.category_050_benchmark,dms.tag_110_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0069_benchmark,F_0069.txt,dms.directory_445_benchmark,dms.category_011_benchmark,dms.tag_144_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0070_benchmark,F_0070.txt,dms.directory_408_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0071_benchmark,F_0071.txt,dms.directory_014_benchmark,,dms.tag_091_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0072_benchmark,F_0072.txt,dms.directory_065_benchmark,dms.category_043_benchmark,dms.tag_139_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0073_benchmark,F_0073.txt,dms.directory_212_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0074_benchmark,F_0074.txt,dms.directory_297_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0075_benchmark,F_0075.txt,dms.directory_485_benchmark,dms.category_028_benchmark,dms.tag_052_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0076_benchmark,F_0076.txt,dms.directory_341_benchmark,dms.category_033_benchmark,dms.tag_113_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0077_benchmark,F_0077.txt,dms.directory_175_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0078_benchmark,F_0078.txt,dms.directory_202_benchmark,dms.category_011_benchmark,dms.tag_080_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0079_benchmark,F_0079.txt,dms.directory_392_benchmark,dms.category_018_benchmark,dms.tag_083_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0080_benchmark,F_0080.txt,dms.directory_336_benchmark,dms.category_006_benchmark,dms.tag_041_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0081_benchmark,F_0081.txt,dms.directory_427_benchmark,,dms.tag_091_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0082_benchmark,F_0082.txt,dms.directory_404_benchmark,dms.category_041_benchmark,dms.tag_087_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0083_benchmark,F_0083.txt,dms.directory_114_benchmark,,dms.tag_134_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0084_benchmark,F_0084.txt,dms.directory_281_benchmark,,dms.tag_119_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0085_benchmark,F_0085.txt,dms.directory_269_benchmark,dms.category_050_benchmark,dms.tag_050_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0086_benchmark,F_0086.txt,dms.directory_145_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0087_benchmark,F_0087.txt,dms.directory_105_benchmark,dms.category_040_benchmark,dms.tag_043_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0088_benchmark,F_0088.txt,dms.directory_452_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0089_benchmark,F_0089.txt,dms.directory_101_benchmark,,dms.tag_010_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0090_benchmark,F_0090.txt,dms.directory_387_benchmark,,dms.tag_119_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0091_benchmark,F_0091.txt,dms.directory_145_benchmark,dms.category_003_benchmark,dms.tag_145_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0092_benchmark,F_0092.txt,dms.directory_320_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0093_benchmark,F_0093.txt,dms.directory_169_benchmark,dms.category_033_benchmark,dms.tag_113_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0094_benchmark,F_0094.txt,dms.directory_171_benchmark,dms.category_041_benchmark,dms.tag_042_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0095_benchmark,F_0095.txt,dms.directory_088_benchmark,,dms.tag_004_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0096_benchmark,F_0096.txt,dms.directory_471_benchmark,dms.category_014_benchmark,dms.tag_059_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0097_benchmark,F_0097.txt,dms.directory_442_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0098_benchmark,F_0098.txt,dms.directory_104_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0099_benchmark,F_0099.txt,dms.directory_398_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0100_benchmark,F_0100.txt,dms.directory_197_benchmark,dms.category_017_benchmark,dms.tag_017_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0101_benchmark,F_0101.txt,dms.directory_194_benchmark,dms.category_011_benchmark,dms.tag_021_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0102_benchmark,F_0102.txt,dms.directory_298_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0103_benchmark,F_0103.txt,dms.directory_150_benchmark,dms.category_044_benchmark,dms.tag_095_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0104_benchmark,F_0104.txt,dms.directory_287_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0105_benchmark,F_0105.txt,dms.directory_419_benchmark,,dms.tag_034_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0106_benchmark,F_0106.txt,dms.directory_355_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0107_benchmark,F_0107.txt,dms.directory_462_benchmark,dms.category_022_benchmark,dms.tag_073_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0108_benchmark,F_0108.txt,dms.directory_386_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0109_benchmark,F_0109.txt,dms.directory_245_benchmark,dms.category_009_benchmark,dms.tag_025_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0110_benchmark,F_0110.txt,dms.directory_309_benchmark,,dms.tag_124_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0111_benchmark,F_0111.txt,dms.directory_208_benchmark,dms.category_025_benchmark,dms.tag_074_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0112_benchmark,F_0112.txt,dms.directory_416_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0113_benchmark,F_0113.txt,dms.directory_026_benchmark,,dms.tag_104_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0114_benchmark,F_0114.txt,dms.directory_253_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0115_benchmark,F_0115.txt,dms.directory_190_benchmark,,dms.tag_075_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0116_benchmark,F_0116.txt,dms.directory_017_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0117_benchmark,F_0117.txt,dms.directory_159_benchmark,dms.category_040_benchmark,dms.tag_054_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0118_benchmark,F_0118.txt,dms.directory_094_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0119_benchmark,F_0119.txt,dms.directory_132_benchmark,dms.category_049_benchmark,dms.tag_007_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0120_benchmark,F_0120.txt,dms.directory_278_benchmark,,dms.tag_137_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0121_benchmark,F_0121.txt,dms.directory_064_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0122_benchmark,F_0122.txt,dms.directory_141_benchmark,dms.category_039_benchmark,dms.tag_128_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0123_benchmark,F_0123.txt,dms.directory_372_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0124_benchmark,F_0124.txt,dms.directory_074_benchmark,,dms.tag_010_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0125_benchmark,F_0125.txt,dms.directory_262_benchmark,dms.category_031_benchmark,dms.tag_114_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0126_benchmark,F_0126.txt,dms.directory_466_benchmark,dms.category_043_benchmark,dms.tag_079_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0127_benchmark,F_0127.txt,dms.directory_316_benchmark,dms.category_015_benchmark,dms.tag_056_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0128_benchmark,F_0128.txt,dms.directory_411_benchmark,dms.category_025_benchmark,dms.tag_112_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0129_benchmark,F_0129.txt,dms.directory_288_benchmark,dms.category_019_benchmark,dms.tag_055_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0130_benchmark,F_0130.txt,dms.directory_401_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0131_benchmark,F_0131.txt,dms.directory_490_benchmark,dms.category_001_benchmark,dms.tag_102_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0132_benchmark,F_0132.txt,dms.directory_317_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0133_benchmark,F_0133.txt,dms.directory_413_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0134_benchmark,F_0134.txt,dms.directory_063_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0135_benchmark,F_0135.txt,dms.directory_450_benchmark,dms.category_013_benchmark,dms.tag_068_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0136_benchmark,F_0136.txt,dms.directory_268_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0137_benchmark,F_0137.txt,dms.directory_493_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0138_benchmark,F_0138.txt,dms.directory_252_benchmark,dms.category_040_benchmark,dms.tag_043_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0139_benchmark,F_0139.txt,dms.directory_456_benchmark,dms.category_034_benchmark,dms.tag_033_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0140_benchmark,F_0140.txt,dms.directory_134_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0141_benchmark,F_0141.txt,dms.directory_306_benchmark,dms.category_025_benchmark,dms.tag_074_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0142_benchmark,F_0142.txt,dms.directory_074_benchmark,dms.category_016_benchmark,dms.tag_100_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0143_benchmark,F_0143.txt,dms.directory_064_benchmark,dms.category_034_benchmark,dms.tag_047_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0144_benchmark,F_0144.txt,dms.directory_330_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0145_benchmark,F_0145.txt,dms.directory_390_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0146_benchmark,F_0146.txt,dms.directory_409_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0147_benchmark,F_0147.txt,dms.directory_354_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0148_benchmark,F_0148.txt,dms.directory_335_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0149_benchmark,F_0149.txt,dms.directory_032_benchmark,dms.category_025_benchmark,dms.tag_082_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0150_benchmark,F_0150.txt,dms.directory_164_benchmark,dms.category_014_benchmark,dms.tag_078_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0151_benchmark,F_0151.txt,dms.directory_202_benchmark,dms.category_008_benchmark,dms.tag_077_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0152_benchmark,F_0152.txt,dms.directory_456_benchmark,dms.category_034_benchmark,dms.tag_109_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0153_benchmark,F_0153.txt,dms.directory_250_benchmark,dms.category_023_benchmark,dms.tag_038_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0154_benchmark,F_0154.txt,dms.directory_252_benchmark,,dms.tag_034_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0155_benchmark,F_0155.txt,dms.directory_451_benchmark,dms.category_027_benchmark,dms.tag_048_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0156_benchmark,F_0156.txt,dms.directory_151_benchmark,dms.category_009_benchmark,dms.tag_025_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0157_benchmark,F_0157.txt,dms.directory_369_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0158_benchmark,F_0158.txt,dms.directory_409_benchmark,dms.category_023_benchmark,dms.tag_085_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0159_benchmark,F_0159.txt,dms.directory_061_benchmark,dms.category_001_benchmark,dms.tag_099_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0160_benchmark,F_0160.txt,dms.directory_403_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0161_benchmark,F_0161.txt,dms.directory_135_benchmark,dms.category_041_benchmark,dms.tag_087_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0162_benchmark,F_0162.txt,dms.directory_273_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0163_benchmark,F_0163.txt,dms.directory_028_benchmark,dms.category_004_benchmark,dms.tag_135_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0164_benchmark,F_0164.txt,dms.directory_146_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0165_benchmark,F_0165.txt,dms.directory_470_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0166_benchmark,F_0166.txt,dms.directory_132_benchmark,dms.category_014_benchmark,dms.tag_059_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0167_benchmark,F_0167.txt,dms.directory_237_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0168_benchmark,F_0168.txt,dms.directory_330_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0169_benchmark,F_0169.txt,dms.directory_163_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0170_benchmark,F_0170.txt,dms.directory_355_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0171_benchmark,F_0171.txt,dms.directory_154_benchmark,dms.category_020_benchmark,dms.tag_141_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0172_benchmark,F_0172.txt,dms.directory_155_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0173_benchmark,F_0173.txt,dms.directory_125_benchmark,dms.category_033_benchmark,dms.tag_113_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0174_benchmark,F_0174.txt,dms.directory_214_benchmark,dms.category_011_benchmark,dms.tag_144_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0175_benchmark,F_0175.txt,dms.directory_081_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0176_benchmark,F_0176.txt,dms.directory_238_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0177_benchmark,F_0177.txt,dms.directory_079_benchmark,dms.category_038_benchmark,dms.tag_092_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0178_benchmark,F_0178.txt,dms.directory_384_benchmark,dms.category_019_benchmark,dms.tag_055_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0179_benchmark,F_0179.txt,dms.directory_174_benchmark,dms.category_017_benchmark,dms.tag_011_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0180_benchmark,F_0180.txt,dms.directory_444_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0181_benchmark,F_0181.txt,dms.directory_184_benchmark,,dms.tag_132_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0182_benchmark,F_0182.txt,dms.directory_115_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0183_benchmark,F_0183.txt,dms.directory_414_benchmark,dms.category_041_benchmark,dms.tag_053_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0184_benchmark,F_0184.txt,dms.directory_267_benchmark,dms.category_011_benchmark,dms.tag_080_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0185_benchmark,F_0185.txt,dms.directory_231_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0186_benchmark,F_0186.txt,dms.directory_207_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0187_benchmark,F_0187.txt,dms.directory_461_benchmark,dms.category_034_benchmark,dms.tag_047_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0188_benchmark,F_0188.txt,dms.directory_146_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0189_benchmark,F_0189.txt,dms.directory_395_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0190_benchmark,F_0190.txt,dms.directory_218_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0191_benchmark,F_0191.txt,dms.directory_459_benchmark,,dms.tag_012_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0192_benchmark,F_0192.txt,dms.directory_129_benchmark,dms.category_025_benchmark,dms.tag_074_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0193_benchmark,F_0193.txt,dms.directory_327_benchmark,,dms.tag_032_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0194_benchmark,F_0194.txt,dms.directory_438_benchmark,dms.category_025_benchmark,dms.tag_082_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0195_benchmark,F_0195.txt,dms.directory_444_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0196_benchmark,F_0196.txt,dms.directory_025_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0197_benchmark,F_0197.txt,dms.directory_444_benchmark,dms.category_019_benchmark,dms.tag_105_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0198_benchmark,F_0198.txt,dms.directory_494_benchmark,dms.category_043_benchmark,dms.tag_079_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0199_benchmark,F_0199.txt,dms.directory_432_benchmark,dms.category_050_benchmark,dms.tag_110_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0200_benchmark,F_0200.txt,dms.directory_209_benchmark,dms.category_031_benchmark,dms.tag_116_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0201_benchmark,F_0201.txt,dms.directory_182_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0202_benchmark,F_0202.txt,dms.directory_214_benchmark,dms.category_013_benchmark,dms.tag_068_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0203_benchmark,F_0203.txt,dms.directory_490_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0204_benchmark,F_0204.txt,dms.directory_272_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0205_benchmark,F_0205.txt,dms.directory_163_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0206_benchmark,F_0206.txt,dms.directory_435_benchmark,dms.category_018_benchmark,dms.tag_083_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0207_benchmark,F_0207.txt,dms.directory_068_benchmark,dms.category_016_benchmark,dms.tag_147_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0208_benchmark,F_0208.txt,dms.directory_459_benchmark,,dms.tag_119_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0209_benchmark,F_0209.txt,dms.directory_413_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0210_benchmark,F_0210.txt,dms.directory_128_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0211_benchmark,F_0211.txt,dms.directory_417_benchmark,dms.category_041_benchmark,dms.tag_053_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0212_benchmark,F_0212.txt,dms.directory_278_benchmark,dms.category_049_benchmark,dms.tag_040_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0213_benchmark,F_0213.txt,dms.directory_212_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0214_benchmark,F_0214.txt,dms.directory_277_benchmark,,dms.tag_065_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0215_benchmark,F_0215.txt,dms.directory_291_benchmark,,dms.tag_065_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0216_benchmark,F_0216.txt,dms.directory_074_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0217_benchmark,F_0217.txt,dms.directory_154_benchmark,dms.category_001_benchmark,dms.tag_099_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0218_benchmark,F_0218.txt,dms.directory_466_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0219_benchmark,F_0219.txt,dms.directory_103_benchmark,dms.category_034_benchmark,dms.tag_047_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0220_benchmark,F_0220.txt,dms.directory_396_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0221_benchmark,F_0221.txt,dms.directory_467_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0222_benchmark,F_0222.txt,dms.directory_300_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0223_benchmark,F_0223.txt,dms.directory_168_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0224_benchmark,F_0224.txt,dms.directory_313_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0225_benchmark,F_0225.txt,dms.directory_103_benchmark,dms.category_038_benchmark,dms.tag_092_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0226_benchmark,F_0226.txt,dms.directory_175_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0227_benchmark,F_0227.txt,dms.directory_283_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0228_benchmark,F_0228.txt,dms.directory_494_benchmark,dms.category_012_benchmark,dms.tag_098_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0229_benchmark,F_0229.txt,dms.directory_452_benchmark,dms.category_006_benchmark,dms.tag_041_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0230_benchmark,F_0230.txt,dms.directory_393_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0231_benchmark,F_0231.txt,dms.directory_122_benchmark,,dms.tag_065_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0232_benchmark,F_0232.txt,dms.directory_186_benchmark,,dms.tag_119_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0233_benchmark,F_0233.txt,dms.directory_314_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0234_benchmark,F_0234.txt,dms.directory_075_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0235_benchmark,F_0235.txt,dms.directory_092_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0236_benchmark,F_0236.txt,dms.directory_379_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0237_benchmark,F_0237.txt,dms.directory_412_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0238_benchmark,F_0238.txt,dms.directory_308_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0239_benchmark,F_0239.txt,dms.directory_389_benchmark,dms.category_021_benchmark,dms.tag_026_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0240_benchmark,F_0240.txt,dms.directory_145_benchmark,dms.category_040_benchmark,dms.tag_054_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0241_benchmark,F_0241.txt,dms.directory_126_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0242_benchmark,F_0242.txt,dms.directory_025_benchmark,,dms.tag_032_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0243_benchmark,F_0243.txt,dms.directory_428_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0244_benchmark,F_0244.txt,dms.directory_295_benchmark,dms.category_043_benchmark,dms.tag_139_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0245_benchmark,F_0245.txt,dms.directory_083_benchmark,dms.category_017_benchmark,dms.tag_011_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0246_benchmark,F_0246.txt,dms.directory_436_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0247_benchmark,F_0247.txt,dms.directory_449_benchmark,dms.category_022_benchmark,dms.tag_061_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0248_benchmark,F_0248.txt,dms.directory_256_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0249_benchmark,F_0249.txt,dms.directory_343_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0250_benchmark,F_0250.txt,dms.directory_067_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0251_benchmark,F_0251.txt,dms.directory_363_benchmark,dms.category_024_benchmark,dms.tag_049_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0252_benchmark,F_0252.txt,dms.directory_275_benchmark,,dms.tag_009_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0253_benchmark,F_0253.txt,dms.directory_360_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0254_benchmark,F_0254.txt,dms.directory_395_benchmark,dms.category_025_benchmark,dms.tag_028_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0255_benchmark,F_0255.txt,dms.directory_426_benchmark,dms.category_015_benchmark,dms.tag_002_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0256_benchmark,F_0256.txt,dms.directory_074_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0257_benchmark,F_0257.txt,dms.directory_098_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0258_benchmark,F_0258.txt,dms.directory_358_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0259_benchmark,F_0259.txt,dms.directory_322_benchmark,,dms.tag_063_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0260_benchmark,F_0260.txt,dms.directory_150_benchmark,dms.category_003_benchmark,dms.tag_076_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0261_benchmark,F_0261.txt,dms.directory_117_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0262_benchmark,F_0262.txt,dms.directory_122_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0263_benchmark,F_0263.txt,dms.directory_268_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0264_benchmark,F_0264.txt,dms.directory_298_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0265_benchmark,F_0265.txt,dms.directory_254_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0266_benchmark,F_0266.txt,dms.directory_171_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0267_benchmark,F_0267.txt,dms.directory_298_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0268_benchmark,F_0268.txt,dms.directory_057_benchmark,dms.category_035_benchmark,dms.tag_101_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0269_benchmark,F_0269.txt,dms.directory_011_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0270_benchmark,F_0270.txt,dms.directory_154_benchmark,dms.category_039_benchmark,dms.tag_146_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0271_benchmark,F_0271.txt,dms.directory_162_benchmark,dms.category_005_benchmark,dms.tag_014_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0272_benchmark,F_0272.txt,dms.directory_406_benchmark,dms.category_015_benchmark,dms.tag_002_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0273_benchmark,F_0273.txt,dms.directory_118_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0274_benchmark,F_0274.txt,dms.directory_256_benchmark,dms.category_025_benchmark,dms.tag_112_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0275_benchmark,F_0275.txt,dms.directory_453_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0276_benchmark,F_0276.txt,dms.directory_024_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0277_benchmark,F_0277.txt,dms.directory_237_benchmark,dms.category_034_benchmark,dms.tag_033_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0278_benchmark,F_0278.txt,dms.directory_039_benchmark,,dms.tag_009_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0279_benchmark,F_0279.txt,dms.directory_134_benchmark,,dms.tag_010_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0280_benchmark,F_0280.txt,dms.directory_085_benchmark,dms.category_025_benchmark,dms.tag_112_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0281_benchmark,F_0281.txt,dms.directory_113_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0282_benchmark,F_0282.txt,dms.directory_091_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0283_benchmark,F_0283.txt,dms.directory_040_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0284_benchmark,F_0284.txt,dms.directory_141_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0285_benchmark,F_0285.txt,dms.directory_068_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0286_benchmark,F_0286.txt,dms.directory_105_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0287_benchmark,F_0287.txt,dms.directory_072_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0288_benchmark,F_0288.txt,dms.directory_479_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0289_benchmark,F_0289.txt,dms.directory_037_benchmark,dms.category_003_benchmark,dms.tag_076_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0290_benchmark,F_0290.txt,dms.directory_337_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0291_benchmark,F_0291.txt,dms.directory_088_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0292_benchmark,F_0292.txt,dms.directory_329_benchmark,,dms.tag_094_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0293_benchmark,F_0293.txt,dms.directory_215_benchmark,dms.category_018_benchmark,dms.tag_083_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0294_benchmark,F_0294.txt,dms.directory_269_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0295_benchmark,F_0295.txt,dms.directory_124_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0296_benchmark,F_0296.txt,dms.directory_188_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0297_benchmark,F_0297.txt,dms.directory_474_benchmark,,dms.tag_012_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0298_benchmark,F_0298.txt,dms.directory_220_benchmark,,dms.tag_096_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0299_benchmark,F_0299.txt,dms.directory_342_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0300_benchmark,F_0300.txt,dms.directory_194_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0301_benchmark,F_0301.txt,dms.directory_359_benchmark,dms.category_020_benchmark,dms.tag_129_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0302_benchmark,F_0302.txt,dms.directory_198_benchmark,dms.category_016_benchmark,dms.tag_147_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0303_benchmark,F_0303.txt,dms.directory_077_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0304_benchmark,F_0304.txt,dms.directory_203_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0305_benchmark,F_0305.txt,dms.directory_112_benchmark,dms.category_040_benchmark,dms.tag_054_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0306_benchmark,F_0306.txt,dms.directory_314_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0307_benchmark,F_0307.txt,dms.directory_090_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0308_benchmark,F_0308.txt,dms.directory_488_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0309_benchmark,F_0309.txt,dms.directory_444_benchmark,dms.category_035_benchmark,dms.tag_101_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0310_benchmark,F_0310.txt,dms.directory_277_benchmark,dms.category_015_benchmark,dms.tag_089_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0311_benchmark,F_0311.txt,dms.directory_388_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0312_benchmark,F_0312.txt,dms.directory_461_benchmark,dms.category_018_benchmark,dms.tag_018_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0313_benchmark,F_0313.txt,dms.directory_173_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0314_benchmark,F_0314.txt,dms.directory_012_benchmark,,dms.tag_104_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0315_benchmark,F_0315.txt,dms.directory_092_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0316_benchmark,F_0316.txt,dms.directory_299_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0317_benchmark,F_0317.txt,dms.directory_477_benchmark,dms.category_050_benchmark,dms.tag_029_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0318_benchmark,F_0318.txt,dms.directory_442_benchmark,dms.category_025_benchmark,dms.tag_097_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0319_benchmark,F_0319.txt,dms.directory_440_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0320_benchmark,F_0320.txt,dms.directory_211_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0321_benchmark,F_0321.txt,dms.directory_284_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0322_benchmark,F_0322.txt,dms.directory_347_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0323_benchmark,F_0323.txt,dms.directory_489_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0324_benchmark,F_0324.txt,dms.directory_393_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0325_benchmark,F_0325.txt,dms.directory_047_benchmark,dms.category_050_benchmark,dms.tag_050_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0326_benchmark,F_0326.txt,dms.directory_362_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0327_benchmark,F_0327.txt,dms.directory_455_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0328_benchmark,F_0328.txt,dms.directory_021_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0329_benchmark,F_0329.txt,dms.directory_010_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0330_benchmark,F_0330.txt,dms.directory_327_benchmark,dms.category_020_benchmark,dms.tag_141_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0331_benchmark,F_0331.txt,dms.directory_220_benchmark,,dms.tag_096_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0332_benchmark,F_0332.txt,dms.directory_190_benchmark,dms.category_039_benchmark,dms.tag_003_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0333_benchmark,F_0333.txt,dms.directory_040_benchmark,dms.category_034_benchmark,dms.tag_033_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0334_benchmark,F_0334.txt,dms.directory_013_benchmark,dms.category_016_benchmark,dms.tag_147_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0335_benchmark,F_0335.txt,dms.directory_184_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0336_benchmark,F_0336.txt,dms.directory_212_benchmark,dms.category_039_benchmark,dms.tag_128_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0337_benchmark,F_0337.txt,dms.directory_458_benchmark,dms.category_003_benchmark,dms.tag_076_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0338_benchmark,F_0338.txt,dms.directory_015_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0339_benchmark,F_0339.txt,dms.directory_131_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0340_benchmark,F_0340.txt,dms.directory_261_benchmark,,dms.tag_060_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0341_benchmark,F_0341.txt,dms.directory_308_benchmark,dms.category_015_benchmark,dms.tag_089_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0342_benchmark,F_0342.txt,dms.directory_343_benchmark,dms.category_017_benchmark,dms.tag_017_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0343_benchmark,F_0343.txt,dms.directory_077_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0344_benchmark,F_0344.txt,dms.directory_327_benchmark,dms.category_004_benchmark,dms.tag_135_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0345_benchmark,F_0345.txt,dms.directory_052_benchmark,dms.category_004_benchmark,dms.tag_135_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0346_benchmark,F_0346.txt,dms.directory_125_benchmark,dms.category_007_benchmark,dms.tag_067_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0347_benchmark,F_0347.txt,dms.directory_310_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0348_benchmark,F_0348.txt,dms.directory_181_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0349_benchmark,F_0349.txt,dms.directory_066_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0350_benchmark,F_0350.txt,dms.directory_438_benchmark,dms.category_049_benchmark,dms.tag_040_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0351_benchmark,F_0351.txt,dms.directory_416_benchmark,dms.category_039_benchmark,dms.tag_003_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0352_benchmark,F_0352.txt,dms.directory_190_benchmark,,dms.tag_094_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0353_benchmark,F_0353.txt,dms.directory_033_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0354_benchmark,F_0354.txt,dms.directory_256_benchmark,dms.category_022_benchmark,dms.tag_061_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0355_benchmark,F_0355.txt,dms.directory_082_benchmark,,dms.tag_104_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0356_benchmark,F_0356.txt,dms.directory_018_benchmark,dms.category_024_benchmark,dms.tag_049_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0357_benchmark,F_0357.txt,dms.directory_074_benchmark,dms.category_050_benchmark,dms.tag_110_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0358_benchmark,F_0358.txt,dms.directory_260_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0359_benchmark,F_0359.txt,dms.directory_398_benchmark,,dms.tag_132_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0360_benchmark,F_0360.txt,dms.directory_104_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0361_benchmark,F_0361.txt,dms.directory_137_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0362_benchmark,F_0362.txt,dms.directory_225_benchmark,dms.category_011_benchmark,dms.tag_144_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0363_benchmark,F_0363.txt,dms.directory_230_benchmark,,dms.tag_134_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0364_benchmark,F_0364.txt,dms.directory_103_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0365_benchmark,F_0365.txt,dms.directory_276_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0366_benchmark,F_0366.txt,dms.directory_181_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0367_benchmark,F_0367.txt,dms.directory_331_benchmark,dms.category_001_benchmark,dms.tag_099_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0368_benchmark,F_0368.txt,dms.directory_222_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0369_benchmark,F_0369.txt,dms.directory_498_benchmark,dms.category_001_benchmark,dms.tag_122_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0370_benchmark,F_0370.txt,dms.directory_041_benchmark,dms.category_027_benchmark,dms.tag_001_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0371_benchmark,F_0371.txt,dms.directory_007_benchmark,dms.category_022_benchmark,dms.tag_073_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0372_benchmark,F_0372.txt,dms.directory_293_benchmark,dms.category_004_benchmark,dms.tag_135_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0373_benchmark,F_0373.txt,dms.directory_028_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0374_benchmark,F_0374.txt,dms.directory_354_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0375_benchmark,F_0375.txt,dms.directory_031_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0376_benchmark,F_0376.txt,dms.directory_338_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0377_benchmark,F_0377.txt,dms.directory_336_benchmark,dms.category_044_benchmark,dms.tag_095_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0378_benchmark,F_0378.txt,dms.directory_169_benchmark,dms.category_038_benchmark,dms.tag_092_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0379_benchmark,F_0379.txt,dms.directory_044_benchmark,dms.category_034_benchmark,dms.tag_109_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0380_benchmark,F_0380.txt,dms.directory_442_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0381_benchmark,F_0381.txt,dms.directory_147_benchmark,dms.category_003_benchmark,dms.tag_076_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0382_benchmark,F_0382.txt,dms.directory_413_benchmark,dms.category_043_benchmark,dms.tag_139_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0383_benchmark,F_0383.txt,dms.directory_059_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0384_benchmark,F_0384.txt,dms.directory_235_benchmark,dms.category_039_benchmark,dms.tag_003_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0385_benchmark,F_0385.txt,dms.directory_051_benchmark,dms.category_050_benchmark,dms.tag_029_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0386_benchmark,F_0386.txt,dms.directory_235_benchmark,dms.category_003_benchmark,dms.tag_145_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0387_benchmark,F_0387.txt,dms.directory_278_benchmark,dms.category_015_benchmark,dms.tag_002_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0388_benchmark,F_0388.txt,dms.directory_474_benchmark,dms.category_025_benchmark,dms.tag_082_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0389_benchmark,F_0389.txt,dms.directory_290_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0390_benchmark,F_0390.txt,dms.directory_164_benchmark,dms.category_013_benchmark,dms.tag_031_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0391_benchmark,F_0391.txt,dms.directory_275_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0392_benchmark,F_0392.txt,dms.directory_041_benchmark,dms.category_029_benchmark,dms.tag_005_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0393_benchmark,F_0393.txt,dms.directory_168_benchmark,dms.category_046_benchmark,dms.tag_022_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0394_benchmark,F_0394.txt,dms.directory_457_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0395_benchmark,F_0395.txt,dms.directory_274_benchmark,dms.category_001_benchmark,dms.tag_122_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0396_benchmark,F_0396.txt,dms.directory_261_benchmark,,dms.tag_132_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0397_benchmark,F_0397.txt,dms.directory_481_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0398_benchmark,F_0398.txt,dms.directory_161_benchmark,dms.category_014_benchmark,dms.tag_059_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0399_benchmark,F_0399.txt,dms.directory_173_benchmark,dms.category_015_benchmark,dms.tag_120_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0400_benchmark,F_0400.txt,dms.directory_238_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0401_benchmark,F_0401.txt,dms.directory_382_benchmark,dms.category_005_benchmark,dms.tag_014_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0402_benchmark,F_0402.txt,dms.directory_019_benchmark,dms.category_040_benchmark,dms.tag_072_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0403_benchmark,F_0403.txt,dms.directory_201_benchmark,dms.category_020_benchmark,dms.tag_129_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0404_benchmark,F_0404.txt,dms.directory_211_benchmark,dms.category_001_benchmark,dms.tag_122_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0405_benchmark,F_0405.txt,dms.directory_155_benchmark,dms.category_046_benchmark,dms.tag_062_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0406_benchmark,F_0406.txt,dms.directory_159_benchmark,dms.category_039_benchmark,dms.tag_128_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0407_benchmark,F_0407.txt,dms.directory_188_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0408_benchmark,F_0408.txt,dms.directory_252_benchmark,dms.category_027_benchmark,dms.tag_001_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0409_benchmark,F_0409.txt,dms.directory_410_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0410_benchmark,F_0410.txt,dms.directory_470_benchmark,dms.category_025_benchmark,dms.tag_097_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0411_benchmark,F_0411.txt,dms.directory_028_benchmark,dms.category_046_benchmark,dms.tag_062_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0412_benchmark,F_0412.txt,dms.directory_064_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0413_benchmark,F_0413.txt,dms.directory_440_benchmark,dms.category_046_benchmark,dms.tag_062_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0414_benchmark,F_0414.txt,dms.directory_184_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0415_benchmark,F_0415.txt,dms.directory_396_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0416_benchmark,F_0416.txt,dms.directory_336_benchmark,dms.category_039_benchmark,dms.tag_146_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0417_benchmark,F_0417.txt,dms.directory_204_benchmark,dms.category_023_benchmark,dms.tag_038_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0418_benchmark,F_0418.txt,dms.directory_124_benchmark,dms.category_021_benchmark,dms.tag_026_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0419_benchmark,F_0419.txt,dms.directory_032_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0420_benchmark,F_0420.txt,dms.directory_343_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0421_benchmark,F_0421.txt,dms.directory_114_benchmark,dms.category_014_benchmark,dms.tag_078_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0422_benchmark,F_0422.txt,dms.directory_050_benchmark,dms.category_022_benchmark,dms.tag_061_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0423_benchmark,F_0423.txt,dms.directory_020_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0424_benchmark,F_0424.txt,dms.directory_152_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0425_benchmark,F_0425.txt,dms.directory_140_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0426_benchmark,F_0426.txt,dms.directory_175_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0427_benchmark,F_0427.txt,dms.directory_231_benchmark,dms.category_043_benchmark,dms.tag_079_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0428_benchmark,F_0428.txt,dms.directory_069_benchmark,dms.category_016_benchmark,dms.tag_100_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0429_benchmark,F_0429.txt,dms.directory_094_benchmark,dms.category_011_benchmark,dms.tag_021_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0430_benchmark,F_0430.txt,dms.directory_379_benchmark,dms.category_041_benchmark,dms.tag_053_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0431_benchmark,F_0431.txt,dms.directory_161_benchmark,dms.category_011_benchmark,dms.tag_080_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0432_benchmark,F_0432.txt,dms.directory_483_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0433_benchmark,F_0433.txt,dms.directory_043_benchmark,dms.category_033_benchmark,dms.tag_039_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0434_benchmark,F_0434.txt,dms.directory_313_benchmark,dms.category_013_benchmark,dms.tag_068_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0435_benchmark,F_0435.txt,dms.directory_339_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0436_benchmark,F_0436.txt,dms.directory_118_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0437_benchmark,F_0437.txt,dms.directory_373_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0438_benchmark,F_0438.txt,dms.directory_496_benchmark,dms.category_025_benchmark,dms.tag_112_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0439_benchmark,F_0439.txt,dms.directory_343_benchmark,dms.category_017_benchmark,dms.tag_011_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0440_benchmark,F_0440.txt,dms.directory_422_benchmark,,dms.tag_134_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0441_benchmark,F_0441.txt,dms.directory_288_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0442_benchmark,F_0442.txt,dms.directory_389_benchmark,dms.category_021_benchmark,dms.tag_026_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0443_benchmark,F_0443.txt,dms.directory_128_benchmark,dms.category_001_benchmark,dms.tag_143_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0444_benchmark,F_0444.txt,dms.directory_266_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0445_benchmark,F_0445.txt,dms.directory_438_benchmark,dms.category_041_benchmark,dms.tag_087_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0446_benchmark,F_0446.txt,dms.directory_028_benchmark,,dms.tag_009_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0447_benchmark,F_0447.txt,dms.directory_087_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0448_benchmark,F_0448.txt,dms.directory_214_benchmark,dms.category_028_benchmark,dms.tag_052_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0449_benchmark,F_0449.txt,dms.directory_048_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0450_benchmark,F_0450.txt,dms.directory_375_benchmark,dms.category_025_benchmark,dms.tag_028_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0451_benchmark,F_0451.txt,dms.directory_271_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0452_benchmark,F_0452.txt,dms.directory_286_benchmark,dms.category_033_benchmark,dms.tag_039_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0453_benchmark,F_0453.txt,dms.directory_271_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0454_benchmark,F_0454.txt,dms.directory_145_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0455_benchmark,F_0455.txt,dms.directory_096_benchmark,dms.category_046_benchmark,dms.tag_062_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0456_benchmark,F_0456.txt,dms.directory_146_benchmark,dms.category_028_benchmark,dms.tag_052_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0457_benchmark,F_0457.txt,dms.directory_136_benchmark,dms.category_043_benchmark,dms.tag_139_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0458_benchmark,F_0458.txt,dms.directory_190_benchmark,dms.category_033_benchmark,dms.tag_039_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0459_benchmark,F_0459.txt,dms.directory_449_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0460_benchmark,F_0460.txt,dms.directory_172_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0461_benchmark,F_0461.txt,dms.directory_127_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0462_benchmark,F_0462.txt,dms.directory_219_benchmark,dms.category_027_benchmark,dms.tag_048_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0463_benchmark,F_0463.txt,dms.directory_095_benchmark,dms.category_021_benchmark,dms.tag_136_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0464_benchmark,F_0464.txt,dms.directory_296_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0465_benchmark,F_0465.txt,dms.directory_321_benchmark,dms.category_008_benchmark,dms.tag_077_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0466_benchmark,F_0466.txt,dms.directory_252_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0467_benchmark,F_0467.txt,dms.directory_297_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0468_benchmark,F_0468.txt,dms.directory_338_benchmark,dms.category_015_benchmark,dms.tag_056_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0469_benchmark,F_0469.txt,dms.directory_277_benchmark,dms.category_014_benchmark,dms.tag_103_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0470_benchmark,F_0470.txt,dms.directory_457_benchmark,dms.category_019_benchmark,dms.tag_125_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0471_benchmark,F_0471.txt,dms.directory_011_benchmark,dms.category_023_benchmark,dms.tag_085_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0472_benchmark,F_0472.txt,dms.directory_273_benchmark,dms.category_049_benchmark,dms.tag_035_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0473_benchmark,F_0473.txt,dms.directory_011_benchmark,dms.category_019_benchmark,dms.tag_125_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0474_benchmark,F_0474.txt,dms.directory_246_benchmark,dms.category_018_benchmark,dms.tag_133_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0475_benchmark,F_0475.txt,dms.directory_129_benchmark,dms.category_011_benchmark,dms.tag_144_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0476_benchmark,F_0476.txt,dms.directory_248_benchmark,dms.category_018_benchmark,dms.tag_018_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0477_benchmark,F_0477.txt,dms.directory_024_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0478_benchmark,F_0478.txt,dms.directory_121_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0479_benchmark,F_0479.txt,dms.directory_097_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0480_benchmark,F_0480.txt,dms.directory_184_benchmark,dms.category_013_benchmark,dms.tag_068_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0481_benchmark,F_0481.txt,dms.directory_347_benchmark,dms.category_041_benchmark,dms.tag_053_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0482_benchmark,F_0482.txt,dms.directory_448_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0483_benchmark,F_0483.txt,dms.directory_283_benchmark,,dms.tag_063_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0484_benchmark,F_0484.txt,dms.directory_409_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0485_benchmark,F_0485.txt,dms.directory_090_benchmark,dms.category_001_benchmark,dms.tag_143_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0486_benchmark,F_0486.txt,dms.directory_172_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0487_benchmark,F_0487.txt,dms.directory_096_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0488_benchmark,F_0488.txt,dms.directory_334_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0489_benchmark,F_0489.txt,dms.directory_145_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0490_benchmark,F_0490.txt,dms.directory_383_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0491_benchmark,F_0491.txt,dms.directory_222_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0492_benchmark,F_0492.txt,dms.directory_007_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0493_benchmark,F_0493.txt,dms.directory_483_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0494_benchmark,F_0494.txt,dms.directory_276_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0495_benchmark,F_0495.txt,dms.directory_476_benchmark,dms.category_031_benchmark,dms.tag_114_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0496_benchmark,F_0496.txt,dms.directory_142_benchmark,dms.category_025_benchmark,dms.tag_082_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0497_benchmark,F_0497.txt,dms.directory_500_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0498_benchmark,F_0498.txt,dms.directory_327_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0499_benchmark,F_0499.txt,dms.directory_260_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0500_benchmark,F_0500.txt,dms.directory_205_benchmark,dms.category_001_benchmark,dms.tag_143_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0501_benchmark,F_0501.txt,dms.directory_354_benchmark,dms.category_041_benchmark,dms.tag_042_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0502_benchmark,F_0502.txt,dms.directory_302_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0503_benchmark,F_0503.txt,dms.directory_486_benchmark,dms.category_017_benchmark,dms.tag_017_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0504_benchmark,F_0504.txt,dms.directory_056_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0505_benchmark,F_0505.txt,dms.directory_037_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0506_benchmark,F_0506.txt,dms.directory_205_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0507_benchmark,F_0507.txt,dms.directory_291_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0508_benchmark,F_0508.txt,dms.directory_445_benchmark,dms.category_039_benchmark,dms.tag_146_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0509_benchmark,F_0509.txt,dms.directory_344_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0510_benchmark,F_0510.txt,dms.directory_133_benchmark,dms.category_033_benchmark,dms.tag_039_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0511_benchmark,F_0511.txt,dms.directory_453_benchmark,,dms.tag_130_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0512_benchmark,F_0512.txt,dms.directory_046_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0513_benchmark,F_0513.txt,dms.directory_287_benchmark,dms.category_021_benchmark,dms.tag_136_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0514_benchmark,F_0514.txt,dms.directory_150_benchmark,dms.category_022_benchmark,dms.tag_073_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0515_benchmark,F_0515.txt,dms.directory_325_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0516_benchmark,F_0516.txt,dms.directory_136_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0517_benchmark,F_0517.txt,dms.directory_424_benchmark,dms.category_023_benchmark,dms.tag_085_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0518_benchmark,F_0518.txt,dms.directory_163_benchmark,dms.category_035_benchmark,dms.tag_101_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0519_benchmark,F_0519.txt,dms.directory_452_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0520_benchmark,F_0520.txt,dms.directory_365_benchmark,dms.category_033_benchmark,dms.tag_113_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0521_benchmark,F_0521.txt,dms.directory_244_benchmark,dms.category_049_benchmark,dms.tag_007_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0522_benchmark,F_0522.txt,dms.directory_373_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0523_benchmark,F_0523.txt,dms.directory_327_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0524_benchmark,F_0524.txt,dms.directory_127_benchmark,dms.category_027_benchmark,dms.tag_001_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0525_benchmark,F_0525.txt,dms.directory_407_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0526_benchmark,F_0526.txt,dms.directory_367_benchmark,dms.category_024_benchmark,dms.tag_049_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0527_benchmark,F_0527.txt,dms.directory_334_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0528_benchmark,F_0528.txt,dms.directory_183_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0529_benchmark,F_0529.txt,dms.directory_303_benchmark,dms.category_014_benchmark,dms.tag_078_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0530_benchmark,F_0530.txt,dms.directory_310_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0531_benchmark,F_0531.txt,dms.directory_256_benchmark,dms.category_040_benchmark,dms.tag_072_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0532_benchmark,F_0532.txt,dms.directory_036_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0533_benchmark,F_0533.txt,dms.directory_104_benchmark,dms.category_015_benchmark,dms.tag_089_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0534_benchmark,F_0534.txt,dms.directory_481_benchmark,dms.category_018_benchmark,dms.tag_018_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0535_benchmark,F_0535.txt,dms.directory_047_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0536_benchmark,F_0536.txt,dms.directory_477_benchmark,,dms.tag_070_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0537_benchmark,F_0537.txt,dms.directory_477_benchmark,dms.category_018_benchmark,dms.tag_133_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0538_benchmark,F_0538.txt,dms.directory_381_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0539_benchmark,F_0539.txt,dms.directory_343_benchmark,dms.category_049_benchmark,dms.tag_035_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0540_benchmark,F_0540.txt,dms.directory_302_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0541_benchmark,F_0541.txt,dms.directory_108_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0542_benchmark,F_0542.txt,dms.directory_146_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0543_benchmark,F_0543.txt,dms.directory_450_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0544_benchmark,F_0544.txt,dms.directory_489_benchmark,dms.category_027_benchmark,dms.tag_001_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0545_benchmark,F_0545.txt,dms.directory_255_benchmark,dms.category_016_benchmark,dms.tag_100_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0546_benchmark,F_0546.txt,dms.directory_083_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0547_benchmark,F_0547.txt,dms.directory_128_benchmark,dms.category_034_benchmark,dms.tag_033_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0548_benchmark,F_0548.txt,dms.directory_479_benchmark,dms.category_040_benchmark,dms.tag_043_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0549_benchmark,F_0549.txt,dms.directory_374_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0550_benchmark,F_0550.txt,dms.directory_009_benchmark,dms.category_001_benchmark,dms.tag_122_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0551_benchmark,F_0551.txt,dms.directory_491_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0552_benchmark,F_0552.txt,dms.directory_230_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0553_benchmark,F_0553.txt,dms.directory_324_benchmark,dms.category_001_benchmark,dms.tag_143_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0554_benchmark,F_0554.txt,dms.directory_244_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0555_benchmark,F_0555.txt,dms.directory_264_benchmark,dms.category_019_benchmark,dms.tag_055_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0556_benchmark,F_0556.txt,dms.directory_073_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0557_benchmark,F_0557.txt,dms.directory_379_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0558_benchmark,F_0558.txt,dms.directory_019_benchmark,dms.category_049_benchmark,dms.tag_007_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0559_benchmark,F_0559.txt,dms.directory_106_benchmark,dms.category_040_benchmark,dms.tag_043_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0560_benchmark,F_0560.txt,dms.directory_143_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0561_benchmark,F_0561.txt,dms.directory_278_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0562_benchmark,F_0562.txt,dms.directory_216_benchmark,dms.category_046_benchmark,dms.tag_022_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0563_benchmark,F_0563.txt,dms.directory_418_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0564_benchmark,F_0564.txt,dms.directory_132_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0565_benchmark,F_0565.txt,dms.directory_258_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0566_benchmark,F_0566.txt,dms.directory_436_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0567_benchmark,F_0567.txt,dms.directory_018_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0568_benchmark,F_0568.txt,dms.directory_344_benchmark,dms.category_050_benchmark,dms.tag_110_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0569_benchmark,F_0569.txt,dms.directory_038_benchmark,dms.category_011_benchmark,dms.tag_144_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0570_benchmark,F_0570.txt,dms.directory_328_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0571_benchmark,F_0571.txt,dms.directory_159_benchmark,,dms.tag_091_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0572_benchmark,F_0572.txt,dms.directory_005_benchmark,dms.category_043_benchmark,dms.tag_139_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0573_benchmark,F_0573.txt,dms.directory_470_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0574_benchmark,F_0574.txt,dms.directory_498_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0575_benchmark,F_0575.txt,dms.directory_161_benchmark,dms.category_028_benchmark,dms.tag_052_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0576_benchmark,F_0576.txt,dms.directory_338_benchmark,dms.category_033_benchmark,dms.tag_113_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0577_benchmark,F_0577.txt,dms.directory_346_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0578_benchmark,F_0578.txt,dms.directory_024_benchmark,dms.category_011_benchmark,dms.tag_080_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0579_benchmark,F_0579.txt,dms.directory_318_benchmark,dms.category_018_benchmark,dms.tag_083_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0580_benchmark,F_0580.txt,dms.directory_410_benchmark,dms.category_006_benchmark,dms.tag_041_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0581_benchmark,F_0581.txt,dms.directory_324_benchmark,,dms.tag_091_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0582_benchmark,F_0582.txt,dms.directory_207_benchmark,dms.category_041_benchmark,dms.tag_087_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0583_benchmark,F_0583.txt,dms.directory_459_benchmark,,dms.tag_134_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0584_benchmark,F_0584.txt,dms.directory_138_benchmark,,dms.tag_119_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0585_benchmark,F_0585.txt,dms.directory_104_benchmark,dms.category_050_benchmark,dms.tag_050_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0586_benchmark,F_0586.txt,dms.directory_169_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0587_benchmark,F_0587.txt,dms.directory_123_benchmark,dms.category_040_benchmark,dms.tag_043_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0588_benchmark,F_0588.txt,dms.directory_202_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0589_benchmark,F_0589.txt,dms.directory_208_benchmark,,dms.tag_010_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0590_benchmark,F_0590.txt,dms.directory_029_benchmark,,dms.tag_119_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0591_benchmark,F_0591.txt,dms.directory_412_benchmark,dms.category_003_benchmark,dms.tag_145_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0592_benchmark,F_0592.txt,dms.directory_259_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0593_benchmark,F_0593.txt,dms.directory_339_benchmark,dms.category_033_benchmark,dms.tag_113_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0594_benchmark,F_0594.txt,dms.directory_129_benchmark,dms.category_041_benchmark,dms.tag_042_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0595_benchmark,F_0595.txt,dms.directory_495_benchmark,,dms.tag_004_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0596_benchmark,F_0596.txt,dms.directory_138_benchmark,dms.category_014_benchmark,dms.tag_059_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0597_benchmark,F_0597.txt,dms.directory_292_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0598_benchmark,F_0598.txt,dms.directory_148_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0599_benchmark,F_0599.txt,dms.directory_286_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0600_benchmark,F_0600.txt,dms.directory_111_benchmark,dms.category_017_benchmark,dms.tag_017_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0601_benchmark,F_0601.txt,dms.directory_349_benchmark,dms.category_011_benchmark,dms.tag_021_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0602_benchmark,F_0602.txt,dms.directory_331_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0603_benchmark,F_0603.txt,dms.directory_054_benchmark,dms.category_044_benchmark,dms.tag_095_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0604_benchmark,F_0604.txt,dms.directory_183_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0605_benchmark,F_0605.txt,dms.directory_170_benchmark,,dms.tag_034_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0606_benchmark,F_0606.txt,dms.directory_455_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0607_benchmark,F_0607.txt,dms.directory_348_benchmark,dms.category_022_benchmark,dms.tag_073_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0608_benchmark,F_0608.txt,dms.directory_464_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0609_benchmark,F_0609.txt,dms.directory_414_benchmark,dms.category_009_benchmark,dms.tag_025_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0610_benchmark,F_0610.txt,dms.directory_151_benchmark,,dms.tag_124_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0611_benchmark,F_0611.txt,dms.directory_311_benchmark,dms.category_025_benchmark,dms.tag_074_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0612_benchmark,F_0612.txt,dms.directory_493_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0613_benchmark,F_0613.txt,dms.directory_262_benchmark,,dms.tag_104_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0614_benchmark,F_0614.txt,dms.directory_339_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0615_benchmark,F_0615.txt,dms.directory_262_benchmark,,dms.tag_075_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0616_benchmark,F_0616.txt,dms.directory_292_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0617_benchmark,F_0617.txt,dms.directory_370_benchmark,dms.category_040_benchmark,dms.tag_054_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0618_benchmark,F_0618.txt,dms.directory_218_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0619_benchmark,F_0619.txt,dms.directory_438_benchmark,dms.category_049_benchmark,dms.tag_007_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0620_benchmark,F_0620.txt,dms.directory_469_benchmark,,dms.tag_137_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0621_benchmark,F_0621.txt,dms.directory_174_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0622_benchmark,F_0622.txt,dms.directory_132_benchmark,dms.category_039_benchmark,dms.tag_128_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0623_benchmark,F_0623.txt,dms.directory_427_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0624_benchmark,F_0624.txt,dms.directory_081_benchmark,,dms.tag_010_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0625_benchmark,F_0625.txt,dms.directory_015_benchmark,dms.category_031_benchmark,dms.tag_114_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0626_benchmark,F_0626.txt,dms.directory_385_benchmark,dms.category_043_benchmark,dms.tag_079_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0627_benchmark,F_0627.txt,dms.directory_158_benchmark,dms.category_015_benchmark,dms.tag_056_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0628_benchmark,F_0628.txt,dms.directory_022_benchmark,dms.category_025_benchmark,dms.tag_112_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0629_benchmark,F_0629.txt,dms.directory_378_benchmark,dms.category_019_benchmark,dms.tag_055_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0630_benchmark,F_0630.txt,dms.directory_240_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0631_benchmark,F_0631.txt,dms.directory_299_benchmark,dms.category_001_benchmark,dms.tag_102_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0632_benchmark,F_0632.txt,dms.directory_239_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0633_benchmark,F_0633.txt,dms.directory_428_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0634_benchmark,F_0634.txt,dms.directory_401_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0635_benchmark,F_0635.txt,dms.directory_048_benchmark,dms.category_013_benchmark,dms.tag_068_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0636_benchmark,F_0636.txt,dms.directory_176_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0637_benchmark,F_0637.txt,dms.directory_037_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0638_benchmark,F_0638.txt,dms.directory_360_benchmark,dms.category_040_benchmark,dms.tag_043_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0639_benchmark,F_0639.txt,dms.directory_452_benchmark,dms.category_034_benchmark,dms.tag_033_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0640_benchmark,F_0640.txt,dms.directory_257_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0641_benchmark,F_0641.txt,dms.directory_453_benchmark,dms.category_025_benchmark,dms.tag_074_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0642_benchmark,F_0642.txt,dms.directory_429_benchmark,dms.category_016_benchmark,dms.tag_100_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0643_benchmark,F_0643.txt,dms.directory_468_benchmark,dms.category_034_benchmark,dms.tag_047_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0644_benchmark,F_0644.txt,dms.directory_277_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0645_benchmark,F_0645.txt,dms.directory_240_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0646_benchmark,F_0646.txt,dms.directory_346_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0647_benchmark,F_0647.txt,dms.directory_067_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0648_benchmark,F_0648.txt,dms.directory_419_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0649_benchmark,F_0649.txt,dms.directory_275_benchmark,dms.category_025_benchmark,dms.tag_082_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0650_benchmark,F_0650.txt,dms.directory_004_benchmark,dms.category_014_benchmark,dms.tag_078_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0651_benchmark,F_0651.txt,dms.directory_359_benchmark,dms.category_008_benchmark,dms.tag_077_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0652_benchmark,F_0652.txt,dms.directory_398_benchmark,dms.category_034_benchmark,dms.tag_109_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0653_benchmark,F_0653.txt,dms.directory_045_benchmark,dms.category_023_benchmark,dms.tag_038_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0654_benchmark,F_0654.txt,dms.directory_241_benchmark,,dms.tag_034_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0655_benchmark,F_0655.txt,dms.directory_299_benchmark,dms.category_027_benchmark,dms.tag_048_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0656_benchmark,F_0656.txt,dms.directory_272_benchmark,dms.category_009_benchmark,dms.tag_025_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0657_benchmark,F_0657.txt,dms.directory_139_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0658_benchmark,F_0658.txt,dms.directory_415_benchmark,dms.category_023_benchmark,dms.tag_085_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0659_benchmark,F_0659.txt,dms.directory_111_benchmark,dms.category_001_benchmark,dms.tag_099_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0660_benchmark,F_0660.txt,dms.directory_265_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0661_benchmark,F_0661.txt,dms.directory_439_benchmark,dms.category_041_benchmark,dms.tag_087_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0662_benchmark,F_0662.txt,dms.directory_234_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0663_benchmark,F_0663.txt,dms.directory_310_benchmark,dms.category_004_benchmark,dms.tag_135_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0664_benchmark,F_0664.txt,dms.directory_367_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0665_benchmark,F_0665.txt,dms.directory_163_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0666_benchmark,F_0666.txt,dms.directory_032_benchmark,dms.category_014_benchmark,dms.tag_059_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0667_benchmark,F_0667.txt,dms.directory_319_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0668_benchmark,F_0668.txt,dms.directory_436_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0669_benchmark,F_0669.txt,dms.directory_162_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0670_benchmark,F_0670.txt,dms.directory_352_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0671_benchmark,F_0671.txt,dms.directory_462_benchmark,dms.category_020_benchmark,dms.tag_141_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0672_benchmark,F_0672.txt,dms.directory_334_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0673_benchmark,F_0673.txt,dms.directory_456_benchmark,dms.category_033_benchmark,dms.tag_113_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0674_benchmark,F_0674.txt,dms.directory_473_benchmark,dms.category_011_benchmark,dms.tag_144_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0675_benchmark,F_0675.txt,dms.directory_085_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0676_benchmark,F_0676.txt,dms.directory_467_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0677_benchmark,F_0677.txt,dms.directory_268_benchmark,dms.category_038_benchmark,dms.tag_092_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0678_benchmark,F_0678.txt,dms.directory_066_benchmark,dms.category_019_benchmark,dms.tag_055_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0679_benchmark,F_0679.txt,dms.directory_006_benchmark,dms.category_017_benchmark,dms.tag_011_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0680_benchmark,F_0680.txt,dms.directory_426_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0681_benchmark,F_0681.txt,dms.directory_011_benchmark,,dms.tag_132_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0682_benchmark,F_0682.txt,dms.directory_460_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0683_benchmark,F_0683.txt,dms.directory_053_benchmark,dms.category_041_benchmark,dms.tag_053_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0684_benchmark,F_0684.txt,dms.directory_233_benchmark,dms.category_011_benchmark,dms.tag_080_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0685_benchmark,F_0685.txt,dms.directory_330_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0686_benchmark,F_0686.txt,dms.directory_070_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0687_benchmark,F_0687.txt,dms.directory_418_benchmark,dms.category_034_benchmark,dms.tag_047_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0688_benchmark,F_0688.txt,dms.directory_220_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0689_benchmark,F_0689.txt,dms.directory_488_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0690_benchmark,F_0690.txt,dms.directory_204_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0691_benchmark,F_0691.txt,dms.directory_426_benchmark,,dms.tag_012_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0692_benchmark,F_0692.txt,dms.directory_343_benchmark,dms.category_025_benchmark,dms.tag_074_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0693_benchmark,F_0693.txt,dms.directory_423_benchmark,,dms.tag_032_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0694_benchmark,F_0694.txt,dms.directory_409_benchmark,dms.category_025_benchmark,dms.tag_082_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0695_benchmark,F_0695.txt,dms.directory_427_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0696_benchmark,F_0696.txt,dms.directory_117_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0697_benchmark,F_0697.txt,dms.directory_222_benchmark,dms.category_019_benchmark,dms.tag_105_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0698_benchmark,F_0698.txt,dms.directory_232_benchmark,dms.category_043_benchmark,dms.tag_079_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0699_benchmark,F_0699.txt,dms.directory_277_benchmark,dms.category_050_benchmark,dms.tag_110_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0700_benchmark,F_0700.txt,dms.directory_480_benchmark,dms.category_031_benchmark,dms.tag_116_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0701_benchmark,F_0701.txt,dms.directory_002_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0702_benchmark,F_0702.txt,dms.directory_137_benchmark,dms.category_013_benchmark,dms.tag_068_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0703_benchmark,F_0703.txt,dms.directory_409_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0704_benchmark,F_0704.txt,dms.directory_340_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0705_benchmark,F_0705.txt,dms.directory_499_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0706_benchmark,F_0706.txt,dms.directory_387_benchmark,dms.category_018_benchmark,dms.tag_083_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0707_benchmark,F_0707.txt,dms.directory_487_benchmark,dms.category_016_benchmark,dms.tag_147_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0708_benchmark,F_0708.txt,dms.directory_005_benchmark,,dms.tag_119_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0709_benchmark,F_0709.txt,dms.directory_322_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0710_benchmark,F_0710.txt,dms.directory_186_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0711_benchmark,F_0711.txt,dms.directory_085_benchmark,dms.category_041_benchmark,dms.tag_053_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0712_benchmark,F_0712.txt,dms.directory_223_benchmark,dms.category_049_benchmark,dms.tag_040_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0713_benchmark,F_0713.txt,dms.directory_092_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0714_benchmark,F_0714.txt,dms.directory_339_benchmark,,dms.tag_065_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0715_benchmark,F_0715.txt,dms.directory_453_benchmark,,dms.tag_065_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0716_benchmark,F_0716.txt,dms.directory_281_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0717_benchmark,F_0717.txt,dms.directory_167_benchmark,dms.category_001_benchmark,dms.tag_099_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0718_benchmark,F_0718.txt,dms.directory_175_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0719_benchmark,F_0719.txt,dms.directory_403_benchmark,dms.category_034_benchmark,dms.tag_047_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0720_benchmark,F_0720.txt,dms.directory_431_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0721_benchmark,F_0721.txt,dms.directory_426_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0722_benchmark,F_0722.txt,dms.directory_208_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0723_benchmark,F_0723.txt,dms.directory_469_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0724_benchmark,F_0724.txt,dms.directory_059_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0725_benchmark,F_0725.txt,dms.directory_331_benchmark,dms.category_038_benchmark,dms.tag_092_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0726_benchmark,F_0726.txt,dms.directory_385_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0727_benchmark,F_0727.txt,dms.directory_140_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0728_benchmark,F_0728.txt,dms.directory_339_benchmark,dms.category_012_benchmark,dms.tag_098_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0729_benchmark,F_0729.txt,dms.directory_024_benchmark,dms.category_006_benchmark,dms.tag_041_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0730_benchmark,F_0730.txt,dms.directory_153_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0731_benchmark,F_0731.txt,dms.directory_143_benchmark,,dms.tag_065_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0732_benchmark,F_0732.txt,dms.directory_441_benchmark,,dms.tag_119_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0733_benchmark,F_0733.txt,dms.directory_316_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0734_benchmark,F_0734.txt,dms.directory_006_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0735_benchmark,F_0735.txt,dms.directory_461_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0736_benchmark,F_0736.txt,dms.directory_083_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0737_benchmark,F_0737.txt,dms.directory_098_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0738_benchmark,F_0738.txt,dms.directory_427_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0739_benchmark,F_0739.txt,dms.directory_126_benchmark,dms.category_021_benchmark,dms.tag_026_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0740_benchmark,F_0740.txt,dms.directory_429_benchmark,dms.category_040_benchmark,dms.tag_054_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0741_benchmark,F_0741.txt,dms.directory_211_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0742_benchmark,F_0742.txt,dms.directory_147_benchmark,,dms.tag_032_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0743_benchmark,F_0743.txt,dms.directory_384_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0744_benchmark,F_0744.txt,dms.directory_388_benchmark,dms.category_043_benchmark,dms.tag_139_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0745_benchmark,F_0745.txt,dms.directory_122_benchmark,dms.category_017_benchmark,dms.tag_011_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0746_benchmark,F_0746.txt,dms.directory_221_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0747_benchmark,F_0747.txt,dms.directory_073_benchmark,dms.category_022_benchmark,dms.tag_061_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0748_benchmark,F_0748.txt,dms.directory_500_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0749_benchmark,F_0749.txt,dms.directory_244_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0750_benchmark,F_0750.txt,dms.directory_261_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0751_benchmark,F_0751.txt,dms.directory_233_benchmark,dms.category_024_benchmark,dms.tag_049_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0752_benchmark,F_0752.txt,dms.directory_297_benchmark,,dms.tag_009_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0753_benchmark,F_0753.txt,dms.directory_024_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0754_benchmark,F_0754.txt,dms.directory_158_benchmark,dms.category_025_benchmark,dms.tag_028_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0755_benchmark,F_0755.txt,dms.directory_128_benchmark,dms.category_015_benchmark,dms.tag_002_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0756_benchmark,F_0756.txt,dms.directory_028_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0757_benchmark,F_0757.txt,dms.directory_196_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0758_benchmark,F_0758.txt,dms.directory_495_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0759_benchmark,F_0759.txt,dms.directory_420_benchmark,,dms.tag_063_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0760_benchmark,F_0760.txt,dms.directory_101_benchmark,dms.category_003_benchmark,dms.tag_076_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0761_benchmark,F_0761.txt,dms.directory_474_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0762_benchmark,F_0762.txt,dms.directory_156_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0763_benchmark,F_0763.txt,dms.directory_028_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0764_benchmark,F_0764.txt,dms.directory_347_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0765_benchmark,F_0765.txt,dms.directory_267_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0766_benchmark,F_0766.txt,dms.directory_491_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0767_benchmark,F_0767.txt,dms.directory_379_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0768_benchmark,F_0768.txt,dms.directory_008_benchmark,dms.category_035_benchmark,dms.tag_101_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0769_benchmark,F_0769.txt,dms.directory_161_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0770_benchmark,F_0770.txt,dms.directory_286_benchmark,dms.category_039_benchmark,dms.tag_146_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0771_benchmark,F_0771.txt,dms.directory_164_benchmark,dms.category_005_benchmark,dms.tag_014_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0772_benchmark,F_0772.txt,dms.directory_488_benchmark,dms.category_015_benchmark,dms.tag_002_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0773_benchmark,F_0773.txt,dms.directory_398_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0774_benchmark,F_0774.txt,dms.directory_461_benchmark,dms.category_025_benchmark,dms.tag_112_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0775_benchmark,F_0775.txt,dms.directory_385_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0776_benchmark,F_0776.txt,dms.directory_300_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0777_benchmark,F_0777.txt,dms.directory_225_benchmark,dms.category_034_benchmark,dms.tag_033_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0778_benchmark,F_0778.txt,dms.directory_277_benchmark,,dms.tag_009_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0779_benchmark,F_0779.txt,dms.directory_122_benchmark,,dms.tag_010_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0780_benchmark,F_0780.txt,dms.directory_006_benchmark,dms.category_025_benchmark,dms.tag_112_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0781_benchmark,F_0781.txt,dms.directory_044_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0782_benchmark,F_0782.txt,dms.directory_173_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0783_benchmark,F_0783.txt,dms.directory_499_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0784_benchmark,F_0784.txt,dms.directory_379_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0785_benchmark,F_0785.txt,dms.directory_467_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0786_benchmark,F_0786.txt,dms.directory_476_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0787_benchmark,F_0787.txt,dms.directory_170_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0788_benchmark,F_0788.txt,dms.directory_107_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0789_benchmark,F_0789.txt,dms.directory_267_benchmark,dms.category_003_benchmark,dms.tag_076_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0790_benchmark,F_0790.txt,dms.directory_143_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0791_benchmark,F_0791.txt,dms.directory_146_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0792_benchmark,F_0792.txt,dms.directory_366_benchmark,,dms.tag_094_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0793_benchmark,F_0793.txt,dms.directory_492_benchmark,dms.category_018_benchmark,dms.tag_083_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0794_benchmark,F_0794.txt,dms.directory_371_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0795_benchmark,F_0795.txt,dms.directory_084_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0796_benchmark,F_0796.txt,dms.directory_302_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0797_benchmark,F_0797.txt,dms.directory_487_benchmark,,dms.tag_012_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0798_benchmark,F_0798.txt,dms.directory_207_benchmark,,dms.tag_096_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0799_benchmark,F_0799.txt,dms.directory_338_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0800_benchmark,F_0800.txt,dms.directory_235_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0801_benchmark,F_0801.txt,dms.directory_243_benchmark,dms.category_020_benchmark,dms.tag_129_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0802_benchmark,F_0802.txt,dms.directory_148_benchmark,dms.category_016_benchmark,dms.tag_147_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0803_benchmark,F_0803.txt,dms.directory_412_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0804_benchmark,F_0804.txt,dms.directory_478_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0805_benchmark,F_0805.txt,dms.directory_345_benchmark,dms.category_040_benchmark,dms.tag_054_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0806_benchmark,F_0806.txt,dms.directory_090_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0807_benchmark,F_0807.txt,dms.directory_453_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0808_benchmark,F_0808.txt,dms.directory_433_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0809_benchmark,F_0809.txt,dms.directory_229_benchmark,dms.category_035_benchmark,dms.tag_101_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0810_benchmark,F_0810.txt,dms.directory_437_benchmark,dms.category_015_benchmark,dms.tag_089_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0811_benchmark,F_0811.txt,dms.directory_284_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0812_benchmark,F_0812.txt,dms.directory_253_benchmark,dms.category_018_benchmark,dms.tag_018_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0813_benchmark,F_0813.txt,dms.directory_237_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0814_benchmark,F_0814.txt,dms.directory_392_benchmark,,dms.tag_104_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0815_benchmark,F_0815.txt,dms.directory_481_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0816_benchmark,F_0816.txt,dms.directory_215_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0817_benchmark,F_0817.txt,dms.directory_356_benchmark,dms.category_050_benchmark,dms.tag_029_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0818_benchmark,F_0818.txt,dms.directory_372_benchmark,dms.category_025_benchmark,dms.tag_097_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0819_benchmark,F_0819.txt,dms.directory_491_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0820_benchmark,F_0820.txt,dms.directory_008_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0821_benchmark,F_0821.txt,dms.directory_267_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0822_benchmark,F_0822.txt,dms.directory_494_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0823_benchmark,F_0823.txt,dms.directory_336_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0824_benchmark,F_0824.txt,dms.directory_290_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0825_benchmark,F_0825.txt,dms.directory_282_benchmark,dms.category_050_benchmark,dms.tag_050_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0826_benchmark,F_0826.txt,dms.directory_049_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0827_benchmark,F_0827.txt,dms.directory_245_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0828_benchmark,F_0828.txt,dms.directory_007_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0829_benchmark,F_0829.txt,dms.directory_295_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0830_benchmark,F_0830.txt,dms.directory_386_benchmark,dms.category_020_benchmark,dms.tag_141_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0831_benchmark,F_0831.txt,dms.directory_400_benchmark,,dms.tag_096_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0832_benchmark,F_0832.txt,dms.directory_125_benchmark,dms.category_039_benchmark,dms.tag_003_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0833_benchmark,F_0833.txt,dms.directory_231_benchmark,dms.category_034_benchmark,dms.tag_033_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0834_benchmark,F_0834.txt,dms.directory_047_benchmark,dms.category_016_benchmark,dms.tag_147_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0835_benchmark,F_0835.txt,dms.directory_143_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0836_benchmark,F_0836.txt,dms.directory_365_benchmark,dms.category_039_benchmark,dms.tag_128_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0837_benchmark,F_0837.txt,dms.directory_393_benchmark,dms.category_003_benchmark,dms.tag_076_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0838_benchmark,F_0838.txt,dms.directory_436_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0839_benchmark,F_0839.txt,dms.directory_432_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0840_benchmark,F_0840.txt,dms.directory_266_benchmark,,dms.tag_060_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0841_benchmark,F_0841.txt,dms.directory_360_benchmark,dms.category_015_benchmark,dms.tag_089_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0842_benchmark,F_0842.txt,dms.directory_144_benchmark,dms.category_017_benchmark,dms.tag_017_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0843_benchmark,F_0843.txt,dms.directory_413_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0844_benchmark,F_0844.txt,dms.directory_341_benchmark,dms.category_004_benchmark,dms.tag_135_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0845_benchmark,F_0845.txt,dms.directory_198_benchmark,dms.category_004_benchmark,dms.tag_135_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0846_benchmark,F_0846.txt,dms.directory_008_benchmark,dms.category_007_benchmark,dms.tag_067_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0847_benchmark,F_0847.txt,dms.directory_427_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0848_benchmark,F_0848.txt,dms.directory_264_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0849_benchmark,F_0849.txt,dms.directory_373_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0850_benchmark,F_0850.txt,dms.directory_383_benchmark,dms.category_049_benchmark,dms.tag_040_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0851_benchmark,F_0851.txt,dms.directory_091_benchmark,dms.category_039_benchmark,dms.tag_003_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0852_benchmark,F_0852.txt,dms.directory_250_benchmark,,dms.tag_094_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0853_benchmark,F_0853.txt,dms.directory_220_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0854_benchmark,F_0854.txt,dms.directory_356_benchmark,dms.category_022_benchmark,dms.tag_061_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0855_benchmark,F_0855.txt,dms.directory_279_benchmark,,dms.tag_104_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0856_benchmark,F_0856.txt,dms.directory_172_benchmark,dms.category_024_benchmark,dms.tag_049_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0857_benchmark,F_0857.txt,dms.directory_009_benchmark,dms.category_050_benchmark,dms.tag_110_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0858_benchmark,F_0858.txt,dms.directory_352_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0859_benchmark,F_0859.txt,dms.directory_245_benchmark,,dms.tag_132_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0860_benchmark,F_0860.txt,dms.directory_028_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0861_benchmark,F_0861.txt,dms.directory_079_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0862_benchmark,F_0862.txt,dms.directory_255_benchmark,dms.category_011_benchmark,dms.tag_144_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0863_benchmark,F_0863.txt,dms.directory_364_benchmark,,dms.tag_134_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0864_benchmark,F_0864.txt,dms.directory_269_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0865_benchmark,F_0865.txt,dms.directory_134_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0866_benchmark,F_0866.txt,dms.directory_471_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0867_benchmark,F_0867.txt,dms.directory_295_benchmark,dms.category_001_benchmark,dms.tag_099_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0868_benchmark,F_0868.txt,dms.directory_181_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0869_benchmark,F_0869.txt,dms.directory_087_benchmark,dms.category_001_benchmark,dms.tag_122_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0870_benchmark,F_0870.txt,dms.directory_361_benchmark,dms.category_027_benchmark,dms.tag_001_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0871_benchmark,F_0871.txt,dms.directory_403_benchmark,dms.category_022_benchmark,dms.tag_073_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0872_benchmark,F_0872.txt,dms.directory_472_benchmark,dms.category_004_benchmark,dms.tag_135_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0873_benchmark,F_0873.txt,dms.directory_380_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0874_benchmark,F_0874.txt,dms.directory_272_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0875_benchmark,F_0875.txt,dms.directory_464_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0876_benchmark,F_0876.txt,dms.directory_422_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0877_benchmark,F_0877.txt,dms.directory_197_benchmark,dms.category_044_benchmark,dms.tag_095_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0878_benchmark,F_0878.txt,dms.directory_158_benchmark,dms.category_038_benchmark,dms.tag_092_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0879_benchmark,F_0879.txt,dms.directory_041_benchmark,dms.category_034_benchmark,dms.tag_109_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0880_benchmark,F_0880.txt,dms.directory_046_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0881_benchmark,F_0881.txt,dms.directory_458_benchmark,dms.category_003_benchmark,dms.tag_076_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0882_benchmark,F_0882.txt,dms.directory_298_benchmark,dms.category_043_benchmark,dms.tag_139_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0883_benchmark,F_0883.txt,dms.directory_288_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0884_benchmark,F_0884.txt,dms.directory_476_benchmark,dms.category_039_benchmark,dms.tag_003_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0885_benchmark,F_0885.txt,dms.directory_177_benchmark,dms.category_050_benchmark,dms.tag_029_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0886_benchmark,F_0886.txt,dms.directory_102_benchmark,dms.category_003_benchmark,dms.tag_145_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0887_benchmark,F_0887.txt,dms.directory_058_benchmark,dms.category_015_benchmark,dms.tag_002_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0888_benchmark,F_0888.txt,dms.directory_216_benchmark,dms.category_025_benchmark,dms.tag_082_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0889_benchmark,F_0889.txt,dms.directory_403_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0890_benchmark,F_0890.txt,dms.directory_332_benchmark,dms.category_013_benchmark,dms.tag_031_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0891_benchmark,F_0891.txt,dms.directory_346_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0892_benchmark,F_0892.txt,dms.directory_327_benchmark,dms.category_029_benchmark,dms.tag_005_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0893_benchmark,F_0893.txt,dms.directory_104_benchmark,dms.category_046_benchmark,dms.tag_022_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0894_benchmark,F_0894.txt,dms.directory_211_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0895_benchmark,F_0895.txt,dms.directory_087_benchmark,dms.category_001_benchmark,dms.tag_122_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0896_benchmark,F_0896.txt,dms.directory_437_benchmark,,dms.tag_132_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0897_benchmark,F_0897.txt,dms.directory_347_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0898_benchmark,F_0898.txt,dms.directory_460_benchmark,dms.category_014_benchmark,dms.tag_059_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0899_benchmark,F_0899.txt,dms.directory_191_benchmark,dms.category_015_benchmark,dms.tag_120_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0900_benchmark,F_0900.txt,dms.directory_277_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0901_benchmark,F_0901.txt,dms.directory_035_benchmark,dms.category_005_benchmark,dms.tag_014_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0902_benchmark,F_0902.txt,dms.directory_056_benchmark,dms.category_040_benchmark,dms.tag_072_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0903_benchmark,F_0903.txt,dms.directory_433_benchmark,dms.category_020_benchmark,dms.tag_129_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0904_benchmark,F_0904.txt,dms.directory_345_benchmark,dms.category_001_benchmark,dms.tag_122_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0905_benchmark,F_0905.txt,dms.directory_486_benchmark,dms.category_046_benchmark,dms.tag_062_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0906_benchmark,F_0906.txt,dms.directory_373_benchmark,dms.category_039_benchmark,dms.tag_128_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0907_benchmark,F_0907.txt,dms.directory_288_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0908_benchmark,F_0908.txt,dms.directory_096_benchmark,dms.category_027_benchmark,dms.tag_001_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0909_benchmark,F_0909.txt,dms.directory_077_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0910_benchmark,F_0910.txt,dms.directory_075_benchmark,dms.category_025_benchmark,dms.tag_097_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0911_benchmark,F_0911.txt,dms.directory_473_benchmark,dms.category_046_benchmark,dms.tag_062_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0912_benchmark,F_0912.txt,dms.directory_422_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0913_benchmark,F_0913.txt,dms.directory_208_benchmark,dms.category_046_benchmark,dms.tag_062_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0914_benchmark,F_0914.txt,dms.directory_130_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0915_benchmark,F_0915.txt,dms.directory_455_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0916_benchmark,F_0916.txt,dms.directory_115_benchmark,dms.category_039_benchmark,dms.tag_146_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0917_benchmark,F_0917.txt,dms.directory_358_benchmark,dms.category_023_benchmark,dms.tag_038_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0918_benchmark,F_0918.txt,dms.directory_292_benchmark,dms.category_021_benchmark,dms.tag_026_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0919_benchmark,F_0919.txt,dms.directory_292_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0920_benchmark,F_0920.txt,dms.directory_193_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0921_benchmark,F_0921.txt,dms.directory_179_benchmark,dms.category_014_benchmark,dms.tag_078_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0922_benchmark,F_0922.txt,dms.directory_241_benchmark,dms.category_022_benchmark,dms.tag_061_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0923_benchmark,F_0923.txt,dms.directory_400_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0924_benchmark,F_0924.txt,dms.directory_167_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0925_benchmark,F_0925.txt,dms.directory_300_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0926_benchmark,F_0926.txt,dms.directory_450_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0927_benchmark,F_0927.txt,dms.directory_395_benchmark,dms.category_043_benchmark,dms.tag_079_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0928_benchmark,F_0928.txt,dms.directory_173_benchmark,dms.category_016_benchmark,dms.tag_100_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0929_benchmark,F_0929.txt,dms.directory_148_benchmark,dms.category_011_benchmark,dms.tag_021_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0930_benchmark,F_0930.txt,dms.directory_229_benchmark,dms.category_041_benchmark,dms.tag_053_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0931_benchmark,F_0931.txt,dms.directory_453_benchmark,dms.category_011_benchmark,dms.tag_080_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0932_benchmark,F_0932.txt,dms.directory_384_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0933_benchmark,F_0933.txt,dms.directory_378_benchmark,dms.category_033_benchmark,dms.tag_039_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0934_benchmark,F_0934.txt,dms.directory_077_benchmark,dms.category_013_benchmark,dms.tag_068_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0935_benchmark,F_0935.txt,dms.directory_309_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0936_benchmark,F_0936.txt,dms.directory_091_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0937_benchmark,F_0937.txt,dms.directory_332_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0938_benchmark,F_0938.txt,dms.directory_235_benchmark,dms.category_025_benchmark,dms.tag_112_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0939_benchmark,F_0939.txt,dms.directory_428_benchmark,dms.category_017_benchmark,dms.tag_011_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0940_benchmark,F_0940.txt,dms.directory_423_benchmark,,dms.tag_134_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0941_benchmark,F_0941.txt,dms.directory_417_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0942_benchmark,F_0942.txt,dms.directory_001_benchmark,dms.category_021_benchmark,dms.tag_026_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0943_benchmark,F_0943.txt,dms.directory_445_benchmark,dms.category_001_benchmark,dms.tag_143_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0944_benchmark,F_0944.txt,dms.directory_102_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0945_benchmark,F_0945.txt,dms.directory_049_benchmark,dms.category_041_benchmark,dms.tag_087_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0946_benchmark,F_0946.txt,dms.directory_148_benchmark,,dms.tag_009_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0947_benchmark,F_0947.txt,dms.directory_039_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0948_benchmark,F_0948.txt,dms.directory_270_benchmark,dms.category_028_benchmark,dms.tag_052_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0949_benchmark,F_0949.txt,dms.directory_138_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0950_benchmark,F_0950.txt,dms.directory_391_benchmark,dms.category_025_benchmark,dms.tag_028_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0951_benchmark,F_0951.txt,dms.directory_428_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0952_benchmark,F_0952.txt,dms.directory_249_benchmark,dms.category_033_benchmark,dms.tag_039_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0953_benchmark,F_0953.txt,dms.directory_225_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0954_benchmark,F_0954.txt,dms.directory_259_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0955_benchmark,F_0955.txt,dms.directory_304_benchmark,dms.category_046_benchmark,dms.tag_062_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0956_benchmark,F_0956.txt,dms.directory_185_benchmark,dms.category_028_benchmark,dms.tag_052_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0957_benchmark,F_0957.txt,dms.directory_272_benchmark,dms.category_043_benchmark,dms.tag_139_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0958_benchmark,F_0958.txt,dms.directory_498_benchmark,dms.category_033_benchmark,dms.tag_039_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0959_benchmark,F_0959.txt,dms.directory_062_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0960_benchmark,F_0960.txt,dms.directory_044_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0961_benchmark,F_0961.txt,dms.directory_454_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0962_benchmark,F_0962.txt,dms.directory_164_benchmark,dms.category_027_benchmark,dms.tag_048_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0963_benchmark,F_0963.txt,dms.directory_268_benchmark,dms.category_021_benchmark,dms.tag_136_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0964_benchmark,F_0964.txt,dms.directory_089_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0965_benchmark,F_0965.txt,dms.directory_214_benchmark,dms.category_008_benchmark,dms.tag_077_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0966_benchmark,F_0966.txt,dms.directory_473_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0967_benchmark,F_0967.txt,dms.directory_195_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0968_benchmark,F_0968.txt,dms.directory_483_benchmark,dms.category_015_benchmark,dms.tag_056_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0969_benchmark,F_0969.txt,dms.directory_007_benchmark,dms.category_014_benchmark,dms.tag_103_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0970_benchmark,F_0970.txt,dms.directory_286_benchmark,dms.category_019_benchmark,dms.tag_125_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0971_benchmark,F_0971.txt,dms.directory_078_benchmark,dms.category_023_benchmark,dms.tag_085_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0972_benchmark,F_0972.txt,dms.directory_012_benchmark,dms.category_049_benchmark,dms.tag_035_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0973_benchmark,F_0973.txt,dms.directory_229_benchmark,dms.category_019_benchmark,dms.tag_125_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0974_benchmark,F_0974.txt,dms.directory_471_benchmark,dms.category_018_benchmark,dms.tag_133_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0975_benchmark,F_0975.txt,dms.directory_460_benchmark,dms.category_011_benchmark,dms.tag_144_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0976_benchmark,F_0976.txt,dms.directory_105_benchmark,dms.category_018_benchmark,dms.tag_018_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0977_benchmark,F_0977.txt,dms.directory_483_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0978_benchmark,F_0978.txt,dms.directory_292_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0979_benchmark,F_0979.txt,dms.directory_344_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0980_benchmark,F_0980.txt,dms.directory_058_benchmark,dms.category_013_benchmark,dms.tag_068_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0981_benchmark,F_0981.txt,dms.directory_463_benchmark,dms.category_041_benchmark,dms.tag_053_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0982_benchmark,F_0982.txt,dms.directory_098_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0983_benchmark,F_0983.txt,dms.directory_291_benchmark,,dms.tag_063_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0984_benchmark,F_0984.txt,dms.directory_027_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0985_benchmark,F_0985.txt,dms.directory_460_benchmark,dms.category_001_benchmark,dms.tag_143_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0986_benchmark,F_0986.txt,dms.directory_499_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0987_benchmark,F_0987.txt,dms.directory_395_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0988_benchmark,F_0988.txt,dms.directory_213_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0989_benchmark,F_0989.txt,dms.directory_006_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0990_benchmark,F_0990.txt,dms.directory_276_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0991_benchmark,F_0991.txt,dms.directory_287_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0992_benchmark,F_0992.txt,dms.directory_250_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0993_benchmark,F_0993.txt,dms.directory_059_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0994_benchmark,F_0994.txt,dms.directory_476_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0995_benchmark,F_0995.txt,dms.directory_156_benchmark,dms.category_031_benchmark,dms.tag_114_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0996_benchmark,F_0996.txt,dms.directory_367_benchmark,dms.category_025_benchmark,dms.tag_082_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0997_benchmark,F_0997.txt,dms.directory_125_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0998_benchmark,F_0998.txt,dms.directory_477_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0999_benchmark,F_0999.txt,dms.directory_324_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1000_benchmark,F_1000.txt,dms.directory_447_benchmark,dms.category_001_benchmark,dms.tag_143_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1001_benchmark,F_1001.txt,dms.directory_220_benchmark,dms.category_041_benchmark,dms.tag_042_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1002_benchmark,F_1002.txt,dms.directory_286_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1003_benchmark,F_1003.txt,dms.directory_331_benchmark,dms.category_017_benchmark,dms.tag_017_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1004_benchmark,F_1004.txt,dms.directory_010_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1005_benchmark,F_1005.txt,dms.directory_048_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1006_benchmark,F_1006.txt,dms.directory_495_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1007_benchmark,F_1007.txt,dms.directory_037_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1008_benchmark,F_1008.txt,dms.directory_495_benchmark,dms.category_039_benchmark,dms.tag_146_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1009_benchmark,F_1009.txt,dms.directory_039_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1010_benchmark,F_1010.txt,dms.directory_082_benchmark,dms.category_033_benchmark,dms.tag_039_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1011_benchmark,F_1011.txt,dms.directory_267_benchmark,,dms.tag_130_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1012_benchmark,F_1012.txt,dms.directory_356_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1013_benchmark,F_1013.txt,dms.directory_418_benchmark,dms.category_021_benchmark,dms.tag_136_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1014_benchmark,F_1014.txt,dms.directory_271_benchmark,dms.category_022_benchmark,dms.tag_073_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1015_benchmark,F_1015.txt,dms.directory_173_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1016_benchmark,F_1016.txt,dms.directory_347_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1017_benchmark,F_1017.txt,dms.directory_068_benchmark,dms.category_023_benchmark,dms.tag_085_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1018_benchmark,F_1018.txt,dms.directory_476_benchmark,dms.category_035_benchmark,dms.tag_101_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1019_benchmark,F_1019.txt,dms.directory_003_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1020_benchmark,F_1020.txt,dms.directory_272_benchmark,dms.category_033_benchmark,dms.tag_113_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1021_benchmark,F_1021.txt,dms.directory_437_benchmark,dms.category_049_benchmark,dms.tag_007_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1022_benchmark,F_1022.txt,dms.directory_271_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1023_benchmark,F_1023.txt,dms.directory_371_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1024_benchmark,F_1024.txt,dms.directory_374_benchmark,dms.category_027_benchmark,dms.tag_001_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1025_benchmark,F_1025.txt,dms.directory_271_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1026_benchmark,F_1026.txt,dms.directory_415_benchmark,dms.category_024_benchmark,dms.tag_049_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1027_benchmark,F_1027.txt,dms.directory_279_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1028_benchmark,F_1028.txt,dms.directory_440_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1029_benchmark,F_1029.txt,dms.directory_341_benchmark,dms.category_014_benchmark,dms.tag_078_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1030_benchmark,F_1030.txt,dms.directory_263_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1031_benchmark,F_1031.txt,dms.directory_418_benchmark,dms.category_040_benchmark,dms.tag_072_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1032_benchmark,F_1032.txt,dms.directory_444_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1033_benchmark,F_1033.txt,dms.directory_166_benchmark,dms.category_015_benchmark,dms.tag_089_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1034_benchmark,F_1034.txt,dms.directory_442_benchmark,dms.category_018_benchmark,dms.tag_018_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1035_benchmark,F_1035.txt,dms.directory_122_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1036_benchmark,F_1036.txt,dms.directory_092_benchmark,,dms.tag_070_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1037_benchmark,F_1037.txt,dms.directory_424_benchmark,dms.category_018_benchmark,dms.tag_133_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1038_benchmark,F_1038.txt,dms.directory_482_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1039_benchmark,F_1039.txt,dms.directory_221_benchmark,dms.category_049_benchmark,dms.tag_035_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1040_benchmark,F_1040.txt,dms.directory_388_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1041_benchmark,F_1041.txt,dms.directory_273_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1042_benchmark,F_1042.txt,dms.directory_015_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1043_benchmark,F_1043.txt,dms.directory_376_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1044_benchmark,F_1044.txt,dms.directory_087_benchmark,dms.category_027_benchmark,dms.tag_001_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1045_benchmark,F_1045.txt,dms.directory_032_benchmark,dms.category_016_benchmark,dms.tag_100_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1046_benchmark,F_1046.txt,dms.directory_405_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1047_benchmark,F_1047.txt,dms.directory_133_benchmark,dms.category_034_benchmark,dms.tag_033_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1048_benchmark,F_1048.txt,dms.directory_485_benchmark,dms.category_040_benchmark,dms.tag_043_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1049_benchmark,F_1049.txt,dms.directory_354_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1050_benchmark,F_1050.txt,dms.directory_145_benchmark,dms.category_001_benchmark,dms.tag_122_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1051_benchmark,F_1051.txt,dms.directory_326_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1052_benchmark,F_1052.txt,dms.directory_042_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1053_benchmark,F_1053.txt,dms.directory_118_benchmark,dms.category_001_benchmark,dms.tag_143_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1054_benchmark,F_1054.txt,dms.directory_330_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1055_benchmark,F_1055.txt,dms.directory_045_benchmark,dms.category_019_benchmark,dms.tag_055_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1056_benchmark,F_1056.txt,dms.directory_394_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1057_benchmark,F_1057.txt,dms.directory_336_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1058_benchmark,F_1058.txt,dms.directory_043_benchmark,dms.category_049_benchmark,dms.tag_007_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1059_benchmark,F_1059.txt,dms.directory_154_benchmark,dms.category_040_benchmark,dms.tag_043_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1060_benchmark,F_1060.txt,dms.directory_294_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1061_benchmark,F_1061.txt,dms.directory_309_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1062_benchmark,F_1062.txt,dms.directory_350_benchmark,dms.category_046_benchmark,dms.tag_022_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1063_benchmark,F_1063.txt,dms.directory_491_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1064_benchmark,F_1064.txt,dms.directory_349_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1065_benchmark,F_1065.txt,dms.directory_162_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1066_benchmark,F_1066.txt,dms.directory_486_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1067_benchmark,F_1067.txt,dms.directory_411_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1068_benchmark,F_1068.txt,dms.directory_489_benchmark,dms.category_050_benchmark,dms.tag_110_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1069_benchmark,F_1069.txt,dms.directory_375_benchmark,dms.category_011_benchmark,dms.tag_144_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1070_benchmark,F_1070.txt,dms.directory_392_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1071_benchmark,F_1071.txt,dms.directory_340_benchmark,,dms.tag_091_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1072_benchmark,F_1072.txt,dms.directory_026_benchmark,dms.category_043_benchmark,dms.tag_139_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1073_benchmark,F_1073.txt,dms.directory_418_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1074_benchmark,F_1074.txt,dms.directory_035_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1075_benchmark,F_1075.txt,dms.directory_268_benchmark,dms.category_028_benchmark,dms.tag_052_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1076_benchmark,F_1076.txt,dms.directory_308_benchmark,dms.category_033_benchmark,dms.tag_113_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1077_benchmark,F_1077.txt,dms.directory_491_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1078_benchmark,F_1078.txt,dms.directory_188_benchmark,dms.category_011_benchmark,dms.tag_080_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1079_benchmark,F_1079.txt,dms.directory_324_benchmark,dms.category_018_benchmark,dms.tag_083_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1080_benchmark,F_1080.txt,dms.directory_170_benchmark,dms.category_006_benchmark,dms.tag_041_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1081_benchmark,F_1081.txt,dms.directory_163_benchmark,,dms.tag_091_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1082_benchmark,F_1082.txt,dms.directory_327_benchmark,dms.category_041_benchmark,dms.tag_087_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1083_benchmark,F_1083.txt,dms.directory_079_benchmark,,dms.tag_134_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1084_benchmark,F_1084.txt,dms.directory_052_benchmark,,dms.tag_119_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1085_benchmark,F_1085.txt,dms.directory_153_benchmark,dms.category_050_benchmark,dms.tag_050_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1086_benchmark,F_1086.txt,dms.directory_299_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1087_benchmark,F_1087.txt,dms.directory_080_benchmark,dms.category_040_benchmark,dms.tag_043_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1088_benchmark,F_1088.txt,dms.directory_158_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1089_benchmark,F_1089.txt,dms.directory_195_benchmark,,dms.tag_010_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1090_benchmark,F_1090.txt,dms.directory_164_benchmark,,dms.tag_119_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1091_benchmark,F_1091.txt,dms.directory_290_benchmark,dms.category_003_benchmark,dms.tag_145_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1092_benchmark,F_1092.txt,dms.directory_072_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1093_benchmark,F_1093.txt,dms.directory_430_benchmark,dms.category_033_benchmark,dms.tag_113_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1094_benchmark,F_1094.txt,dms.directory_180_benchmark,dms.category_041_benchmark,dms.tag_042_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1095_benchmark,F_1095.txt,dms.directory_297_benchmark,,dms.tag_004_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1096_benchmark,F_1096.txt,dms.directory_038_benchmark,dms.category_014_benchmark,dms.tag_059_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1097_benchmark,F_1097.txt,dms.directory_245_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1098_benchmark,F_1098.txt,dms.directory_416_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1099_benchmark,F_1099.txt,dms.directory_242_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1100_benchmark,F_1100.txt,dms.directory_263_benchmark,dms.category_017_benchmark,dms.tag_017_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1101_benchmark,F_1101.txt,dms.directory_196_benchmark,dms.category_011_benchmark,dms.tag_021_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1102_benchmark,F_1102.txt,dms.directory_492_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1103_benchmark,F_1103.txt,dms.directory_301_benchmark,dms.category_044_benchmark,dms.tag_095_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1104_benchmark,F_1104.txt,dms.directory_220_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1105_benchmark,F_1105.txt,dms.directory_304_benchmark,,dms.tag_034_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1106_benchmark,F_1106.txt,dms.directory_266_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1107_benchmark,F_1107.txt,dms.directory_179_benchmark,dms.category_022_benchmark,dms.tag_073_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1108_benchmark,F_1108.txt,dms.directory_049_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1109_benchmark,F_1109.txt,dms.directory_365_benchmark,dms.category_009_benchmark,dms.tag_025_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1110_benchmark,F_1110.txt,dms.directory_286_benchmark,,dms.tag_124_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1111_benchmark,F_1111.txt,dms.directory_141_benchmark,dms.category_025_benchmark,dms.tag_074_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1112_benchmark,F_1112.txt,dms.directory_479_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1113_benchmark,F_1113.txt,dms.directory_484_benchmark,,dms.tag_104_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1114_benchmark,F_1114.txt,dms.directory_166_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1115_benchmark,F_1115.txt,dms.directory_336_benchmark,,dms.tag_075_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1116_benchmark,F_1116.txt,dms.directory_169_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1117_benchmark,F_1117.txt,dms.directory_174_benchmark,dms.category_040_benchmark,dms.tag_054_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1118_benchmark,F_1118.txt,dms.directory_105_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1119_benchmark,F_1119.txt,dms.directory_131_benchmark,dms.category_049_benchmark,dms.tag_007_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1120_benchmark,F_1120.txt,dms.directory_234_benchmark,,dms.tag_137_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1121_benchmark,F_1121.txt,dms.directory_125_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1122_benchmark,F_1122.txt,dms.directory_258_benchmark,dms.category_039_benchmark,dms.tag_128_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1123_benchmark,F_1123.txt,dms.directory_018_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1124_benchmark,F_1124.txt,dms.directory_007_benchmark,,dms.tag_010_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1125_benchmark,F_1125.txt,dms.directory_102_benchmark,dms.category_031_benchmark,dms.tag_114_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1126_benchmark,F_1126.txt,dms.directory_239_benchmark,dms.category_043_benchmark,dms.tag_079_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1127_benchmark,F_1127.txt,dms.directory_369_benchmark,dms.category_015_benchmark,dms.tag_056_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1128_benchmark,F_1128.txt,dms.directory_115_benchmark,dms.category_025_benchmark,dms.tag_112_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1129_benchmark,F_1129.txt,dms.directory_006_benchmark,dms.category_019_benchmark,dms.tag_055_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1130_benchmark,F_1130.txt,dms.directory_483_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1131_benchmark,F_1131.txt,dms.directory_215_benchmark,dms.category_001_benchmark,dms.tag_102_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1132_benchmark,F_1132.txt,dms.directory_300_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1133_benchmark,F_1133.txt,dms.directory_410_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1134_benchmark,F_1134.txt,dms.directory_416_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1135_benchmark,F_1135.txt,dms.directory_476_benchmark,dms.category_013_benchmark,dms.tag_068_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1136_benchmark,F_1136.txt,dms.directory_260_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1137_benchmark,F_1137.txt,dms.directory_411_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1138_benchmark,F_1138.txt,dms.directory_377_benchmark,dms.category_040_benchmark,dms.tag_043_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1139_benchmark,F_1139.txt,dms.directory_147_benchmark,dms.category_034_benchmark,dms.tag_033_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1140_benchmark,F_1140.txt,dms.directory_312_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1141_benchmark,F_1141.txt,dms.directory_133_benchmark,dms.category_025_benchmark,dms.tag_074_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1142_benchmark,F_1142.txt,dms.directory_045_benchmark,dms.category_016_benchmark,dms.tag_100_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1143_benchmark,F_1143.txt,dms.directory_356_benchmark,dms.category_034_benchmark,dms.tag_047_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1144_benchmark,F_1144.txt,dms.directory_009_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1145_benchmark,F_1145.txt,dms.directory_362_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1146_benchmark,F_1146.txt,dms.directory_323_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1147_benchmark,F_1147.txt,dms.directory_117_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1148_benchmark,F_1148.txt,dms.directory_353_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1149_benchmark,F_1149.txt,dms.directory_066_benchmark,dms.category_025_benchmark,dms.tag_082_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1150_benchmark,F_1150.txt,dms.directory_068_benchmark,dms.category_014_benchmark,dms.tag_078_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1151_benchmark,F_1151.txt,dms.directory_316_benchmark,dms.category_008_benchmark,dms.tag_077_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1152_benchmark,F_1152.txt,dms.directory_368_benchmark,dms.category_034_benchmark,dms.tag_109_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1153_benchmark,F_1153.txt,dms.directory_294_benchmark,dms.category_023_benchmark,dms.tag_038_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1154_benchmark,F_1154.txt,dms.directory_065_benchmark,,dms.tag_034_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1155_benchmark,F_1155.txt,dms.directory_171_benchmark,dms.category_027_benchmark,dms.tag_048_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1156_benchmark,F_1156.txt,dms.directory_149_benchmark,dms.category_009_benchmark,dms.tag_025_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1157_benchmark,F_1157.txt,dms.directory_396_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1158_benchmark,F_1158.txt,dms.directory_107_benchmark,dms.category_023_benchmark,dms.tag_085_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1159_benchmark,F_1159.txt,dms.directory_380_benchmark,dms.category_001_benchmark,dms.tag_099_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1160_benchmark,F_1160.txt,dms.directory_259_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1161_benchmark,F_1161.txt,dms.directory_391_benchmark,dms.category_041_benchmark,dms.tag_087_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1162_benchmark,F_1162.txt,dms.directory_476_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1163_benchmark,F_1163.txt,dms.directory_053_benchmark,dms.category_004_benchmark,dms.tag_135_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1164_benchmark,F_1164.txt,dms.directory_408_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1165_benchmark,F_1165.txt,dms.directory_450_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1166_benchmark,F_1166.txt,dms.directory_160_benchmark,dms.category_014_benchmark,dms.tag_059_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1167_benchmark,F_1167.txt,dms.directory_415_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1168_benchmark,F_1168.txt,dms.directory_185_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1169_benchmark,F_1169.txt,dms.directory_281_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1170_benchmark,F_1170.txt,dms.directory_345_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1171_benchmark,F_1171.txt,dms.directory_357_benchmark,dms.category_020_benchmark,dms.tag_141_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1172_benchmark,F_1172.txt,dms.directory_071_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1173_benchmark,F_1173.txt,dms.directory_016_benchmark,dms.category_033_benchmark,dms.tag_113_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1174_benchmark,F_1174.txt,dms.directory_246_benchmark,dms.category_011_benchmark,dms.tag_144_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1175_benchmark,F_1175.txt,dms.directory_368_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1176_benchmark,F_1176.txt,dms.directory_154_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1177_benchmark,F_1177.txt,dms.directory_461_benchmark,dms.category_038_benchmark,dms.tag_092_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1178_benchmark,F_1178.txt,dms.directory_170_benchmark,dms.category_019_benchmark,dms.tag_055_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1179_benchmark,F_1179.txt,dms.directory_039_benchmark,dms.category_017_benchmark,dms.tag_011_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1180_benchmark,F_1180.txt,dms.directory_458_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1181_benchmark,F_1181.txt,dms.directory_286_benchmark,,dms.tag_132_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1182_benchmark,F_1182.txt,dms.directory_126_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1183_benchmark,F_1183.txt,dms.directory_160_benchmark,dms.category_041_benchmark,dms.tag_053_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1184_benchmark,F_1184.txt,dms.directory_032_benchmark,dms.category_011_benchmark,dms.tag_080_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1185_benchmark,F_1185.txt,dms.directory_202_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1186_benchmark,F_1186.txt,dms.directory_279_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1187_benchmark,F_1187.txt,dms.directory_040_benchmark,dms.category_034_benchmark,dms.tag_047_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1188_benchmark,F_1188.txt,dms.directory_201_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1189_benchmark,F_1189.txt,dms.directory_127_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1190_benchmark,F_1190.txt,dms.directory_222_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1191_benchmark,F_1191.txt,dms.directory_233_benchmark,,dms.tag_012_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1192_benchmark,F_1192.txt,dms.directory_134_benchmark,dms.category_025_benchmark,dms.tag_074_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1193_benchmark,F_1193.txt,dms.directory_245_benchmark,,dms.tag_032_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1194_benchmark,F_1194.txt,dms.directory_221_benchmark,dms.category_025_benchmark,dms.tag_082_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1195_benchmark,F_1195.txt,dms.directory_398_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1196_benchmark,F_1196.txt,dms.directory_172_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1197_benchmark,F_1197.txt,dms.directory_323_benchmark,dms.category_019_benchmark,dms.tag_105_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1198_benchmark,F_1198.txt,dms.directory_275_benchmark,dms.category_043_benchmark,dms.tag_079_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1199_benchmark,F_1199.txt,dms.directory_365_benchmark,dms.category_050_benchmark,dms.tag_110_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1200_benchmark,F_1200.txt,dms.directory_040_benchmark,dms.category_031_benchmark,dms.tag_116_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1201_benchmark,F_1201.txt,dms.directory_232_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1202_benchmark,F_1202.txt,dms.directory_315_benchmark,dms.category_013_benchmark,dms.tag_068_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1203_benchmark,F_1203.txt,dms.directory_033_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1204_benchmark,F_1204.txt,dms.directory_271_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1205_benchmark,F_1205.txt,dms.directory_262_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1206_benchmark,F_1206.txt,dms.directory_061_benchmark,dms.category_018_benchmark,dms.tag_083_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1207_benchmark,F_1207.txt,dms.directory_185_benchmark,dms.category_016_benchmark,dms.tag_147_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1208_benchmark,F_1208.txt,dms.directory_148_benchmark,,dms.tag_119_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1209_benchmark,F_1209.txt,dms.directory_395_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1210_benchmark,F_1210.txt,dms.directory_208_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1211_benchmark,F_1211.txt,dms.directory_173_benchmark,dms.category_041_benchmark,dms.tag_053_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1212_benchmark,F_1212.txt,dms.directory_453_benchmark,dms.category_049_benchmark,dms.tag_040_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1213_benchmark,F_1213.txt,dms.directory_063_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1214_benchmark,F_1214.txt,dms.directory_308_benchmark,,dms.tag_065_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1215_benchmark,F_1215.txt,dms.directory_015_benchmark,,dms.tag_065_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1216_benchmark,F_1216.txt,dms.directory_313_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1217_benchmark,F_1217.txt,dms.directory_268_benchmark,dms.category_001_benchmark,dms.tag_099_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1218_benchmark,F_1218.txt,dms.directory_253_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1219_benchmark,F_1219.txt,dms.directory_378_benchmark,dms.category_034_benchmark,dms.tag_047_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1220_benchmark,F_1220.txt,dms.directory_278_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1221_benchmark,F_1221.txt,dms.directory_361_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1222_benchmark,F_1222.txt,dms.directory_234_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1223_benchmark,F_1223.txt,dms.directory_283_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1224_benchmark,F_1224.txt,dms.directory_126_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1225_benchmark,F_1225.txt,dms.directory_271_benchmark,dms.category_038_benchmark,dms.tag_092_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1226_benchmark,F_1226.txt,dms.directory_354_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1227_benchmark,F_1227.txt,dms.directory_118_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1228_benchmark,F_1228.txt,dms.directory_325_benchmark,dms.category_012_benchmark,dms.tag_098_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1229_benchmark,F_1229.txt,dms.directory_250_benchmark,dms.category_006_benchmark,dms.tag_041_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1230_benchmark,F_1230.txt,dms.directory_159_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1231_benchmark,F_1231.txt,dms.directory_216_benchmark,,dms.tag_065_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1232_benchmark,F_1232.txt,dms.directory_168_benchmark,,dms.tag_119_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1233_benchmark,F_1233.txt,dms.directory_026_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1234_benchmark,F_1234.txt,dms.directory_436_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1235_benchmark,F_1235.txt,dms.directory_296_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1236_benchmark,F_1236.txt,dms.directory_113_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1237_benchmark,F_1237.txt,dms.directory_278_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1238_benchmark,F_1238.txt,dms.directory_070_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1239_benchmark,F_1239.txt,dms.directory_058_benchmark,dms.category_021_benchmark,dms.tag_026_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1240_benchmark,F_1240.txt,dms.directory_190_benchmark,dms.category_040_benchmark,dms.tag_054_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1241_benchmark,F_1241.txt,dms.directory_204_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1242_benchmark,F_1242.txt,dms.directory_278_benchmark,,dms.tag_032_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1243_benchmark,F_1243.txt,dms.directory_478_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1244_benchmark,F_1244.txt,dms.directory_458_benchmark,dms.category_043_benchmark,dms.tag_139_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1245_benchmark,F_1245.txt,dms.directory_140_benchmark,dms.category_017_benchmark,dms.tag_011_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1246_benchmark,F_1246.txt,dms.directory_037_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1247_benchmark,F_1247.txt,dms.directory_411_benchmark,dms.category_022_benchmark,dms.tag_061_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1248_benchmark,F_1248.txt,dms.directory_293_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1249_benchmark,F_1249.txt,dms.directory_077_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1250_benchmark,F_1250.txt,dms.directory_342_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1251_benchmark,F_1251.txt,dms.directory_310_benchmark,dms.category_024_benchmark,dms.tag_049_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1252_benchmark,F_1252.txt,dms.directory_093_benchmark,,dms.tag_009_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1253_benchmark,F_1253.txt,dms.directory_337_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1254_benchmark,F_1254.txt,dms.directory_415_benchmark,dms.category_025_benchmark,dms.tag_028_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1255_benchmark,F_1255.txt,dms.directory_223_benchmark,dms.category_015_benchmark,dms.tag_002_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1256_benchmark,F_1256.txt,dms.directory_473_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1257_benchmark,F_1257.txt,dms.directory_382_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1258_benchmark,F_1258.txt,dms.directory_057_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1259_benchmark,F_1259.txt,dms.directory_450_benchmark,,dms.tag_063_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1260_benchmark,F_1260.txt,dms.directory_178_benchmark,dms.category_003_benchmark,dms.tag_076_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1261_benchmark,F_1261.txt,dms.directory_476_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1262_benchmark,F_1262.txt,dms.directory_219_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1263_benchmark,F_1263.txt,dms.directory_345_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1264_benchmark,F_1264.txt,dms.directory_278_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1265_benchmark,F_1265.txt,dms.directory_001_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1266_benchmark,F_1266.txt,dms.directory_222_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1267_benchmark,F_1267.txt,dms.directory_120_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1268_benchmark,F_1268.txt,dms.directory_411_benchmark,dms.category_035_benchmark,dms.tag_101_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1269_benchmark,F_1269.txt,dms.directory_386_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1270_benchmark,F_1270.txt,dms.directory_299_benchmark,dms.category_039_benchmark,dms.tag_146_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1271_benchmark,F_1271.txt,dms.directory_335_benchmark,dms.category_005_benchmark,dms.tag_014_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1272_benchmark,F_1272.txt,dms.directory_019_benchmark,dms.category_015_benchmark,dms.tag_002_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1273_benchmark,F_1273.txt,dms.directory_055_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1274_benchmark,F_1274.txt,dms.directory_483_benchmark,dms.category_025_benchmark,dms.tag_112_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1275_benchmark,F_1275.txt,dms.directory_033_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1276_benchmark,F_1276.txt,dms.directory_439_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1277_benchmark,F_1277.txt,dms.directory_473_benchmark,dms.category_034_benchmark,dms.tag_033_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1278_benchmark,F_1278.txt,dms.directory_397_benchmark,,dms.tag_009_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1279_benchmark,F_1279.txt,dms.directory_002_benchmark,,dms.tag_010_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1280_benchmark,F_1280.txt,dms.directory_382_benchmark,dms.category_025_benchmark,dms.tag_112_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1281_benchmark,F_1281.txt,dms.directory_386_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1282_benchmark,F_1282.txt,dms.directory_387_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1283_benchmark,F_1283.txt,dms.directory_148_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1284_benchmark,F_1284.txt,dms.directory_414_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1285_benchmark,F_1285.txt,dms.directory_337_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1286_benchmark,F_1286.txt,dms.directory_005_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1287_benchmark,F_1287.txt,dms.directory_310_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1288_benchmark,F_1288.txt,dms.directory_204_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1289_benchmark,F_1289.txt,dms.directory_370_benchmark,dms.category_003_benchmark,dms.tag_076_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1290_benchmark,F_1290.txt,dms.directory_216_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1291_benchmark,F_1291.txt,dms.directory_379_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1292_benchmark,F_1292.txt,dms.directory_187_benchmark,,dms.tag_094_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1293_benchmark,F_1293.txt,dms.directory_276_benchmark,dms.category_018_benchmark,dms.tag_083_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1294_benchmark,F_1294.txt,dms.directory_498_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1295_benchmark,F_1295.txt,dms.directory_287_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1296_benchmark,F_1296.txt,dms.directory_086_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1297_benchmark,F_1297.txt,dms.directory_324_benchmark,,dms.tag_012_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1298_benchmark,F_1298.txt,dms.directory_218_benchmark,,dms.tag_096_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1299_benchmark,F_1299.txt,dms.directory_097_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1300_benchmark,F_1300.txt,dms.directory_494_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1301_benchmark,F_1301.txt,dms.directory_274_benchmark,dms.category_020_benchmark,dms.tag_129_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1302_benchmark,F_1302.txt,dms.directory_206_benchmark,dms.category_016_benchmark,dms.tag_147_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1303_benchmark,F_1303.txt,dms.directory_251_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1304_benchmark,F_1304.txt,dms.directory_068_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1305_benchmark,F_1305.txt,dms.directory_313_benchmark,dms.category_040_benchmark,dms.tag_054_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1306_benchmark,F_1306.txt,dms.directory_099_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1307_benchmark,F_1307.txt,dms.directory_164_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1308_benchmark,F_1308.txt,dms.directory_194_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1309_benchmark,F_1309.txt,dms.directory_185_benchmark,dms.category_035_benchmark,dms.tag_101_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1310_benchmark,F_1310.txt,dms.directory_007_benchmark,dms.category_015_benchmark,dms.tag_089_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1311_benchmark,F_1311.txt,dms.directory_337_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1312_benchmark,F_1312.txt,dms.directory_276_benchmark,dms.category_018_benchmark,dms.tag_018_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1313_benchmark,F_1313.txt,dms.directory_074_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1314_benchmark,F_1314.txt,dms.directory_305_benchmark,,dms.tag_104_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1315_benchmark,F_1315.txt,dms.directory_300_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1316_benchmark,F_1316.txt,dms.directory_358_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1317_benchmark,F_1317.txt,dms.directory_102_benchmark,dms.category_050_benchmark,dms.tag_029_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1318_benchmark,F_1318.txt,dms.directory_018_benchmark,dms.category_025_benchmark,dms.tag_097_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1319_benchmark,F_1319.txt,dms.directory_370_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1320_benchmark,F_1320.txt,dms.directory_408_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1321_benchmark,F_1321.txt,dms.directory_242_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1322_benchmark,F_1322.txt,dms.directory_243_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1323_benchmark,F_1323.txt,dms.directory_323_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1324_benchmark,F_1324.txt,dms.directory_011_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1325_benchmark,F_1325.txt,dms.directory_316_benchmark,dms.category_050_benchmark,dms.tag_050_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1326_benchmark,F_1326.txt,dms.directory_159_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1327_benchmark,F_1327.txt,dms.directory_135_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1328_benchmark,F_1328.txt,dms.directory_310_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1329_benchmark,F_1329.txt,dms.directory_413_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1330_benchmark,F_1330.txt,dms.directory_045_benchmark,dms.category_020_benchmark,dms.tag_141_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1331_benchmark,F_1331.txt,dms.directory_468_benchmark,,dms.tag_096_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1332_benchmark,F_1332.txt,dms.directory_033_benchmark,dms.category_039_benchmark,dms.tag_003_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1333_benchmark,F_1333.txt,dms.directory_354_benchmark,dms.category_034_benchmark,dms.tag_033_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1334_benchmark,F_1334.txt,dms.directory_420_benchmark,dms.category_016_benchmark,dms.tag_147_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1335_benchmark,F_1335.txt,dms.directory_152_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1336_benchmark,F_1336.txt,dms.directory_319_benchmark,dms.category_039_benchmark,dms.tag_128_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1337_benchmark,F_1337.txt,dms.directory_027_benchmark,dms.category_003_benchmark,dms.tag_076_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1338_benchmark,F_1338.txt,dms.directory_241_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1339_benchmark,F_1339.txt,dms.directory_465_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1340_benchmark,F_1340.txt,dms.directory_146_benchmark,,dms.tag_060_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1341_benchmark,F_1341.txt,dms.directory_243_benchmark,dms.category_015_benchmark,dms.tag_089_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1342_benchmark,F_1342.txt,dms.directory_356_benchmark,dms.category_017_benchmark,dms.tag_017_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1343_benchmark,F_1343.txt,dms.directory_148_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1344_benchmark,F_1344.txt,dms.directory_145_benchmark,dms.category_004_benchmark,dms.tag_135_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1345_benchmark,F_1345.txt,dms.directory_116_benchmark,dms.category_004_benchmark,dms.tag_135_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1346_benchmark,F_1346.txt,dms.directory_454_benchmark,dms.category_007_benchmark,dms.tag_067_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1347_benchmark,F_1347.txt,dms.directory_298_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1348_benchmark,F_1348.txt,dms.directory_360_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1349_benchmark,F_1349.txt,dms.directory_239_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1350_benchmark,F_1350.txt,dms.directory_210_benchmark,dms.category_049_benchmark,dms.tag_040_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1351_benchmark,F_1351.txt,dms.directory_054_benchmark,dms.category_039_benchmark,dms.tag_003_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1352_benchmark,F_1352.txt,dms.directory_448_benchmark,,dms.tag_094_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1353_benchmark,F_1353.txt,dms.directory_059_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1354_benchmark,F_1354.txt,dms.directory_327_benchmark,dms.category_022_benchmark,dms.tag_061_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1355_benchmark,F_1355.txt,dms.directory_182_benchmark,,dms.tag_104_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1356_benchmark,F_1356.txt,dms.directory_294_benchmark,dms.category_024_benchmark,dms.tag_049_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1357_benchmark,F_1357.txt,dms.directory_460_benchmark,dms.category_050_benchmark,dms.tag_110_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1358_benchmark,F_1358.txt,dms.directory_389_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1359_benchmark,F_1359.txt,dms.directory_365_benchmark,,dms.tag_132_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1360_benchmark,F_1360.txt,dms.directory_373_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1361_benchmark,F_1361.txt,dms.directory_447_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1362_benchmark,F_1362.txt,dms.directory_398_benchmark,dms.category_011_benchmark,dms.tag_144_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1363_benchmark,F_1363.txt,dms.directory_416_benchmark,,dms.tag_134_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1364_benchmark,F_1364.txt,dms.directory_037_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1365_benchmark,F_1365.txt,dms.directory_467_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1366_benchmark,F_1366.txt,dms.directory_467_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1367_benchmark,F_1367.txt,dms.directory_475_benchmark,dms.category_001_benchmark,dms.tag_099_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1368_benchmark,F_1368.txt,dms.directory_037_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1369_benchmark,F_1369.txt,dms.directory_070_benchmark,dms.category_001_benchmark,dms.tag_122_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1370_benchmark,F_1370.txt,dms.directory_222_benchmark,dms.category_027_benchmark,dms.tag_001_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1371_benchmark,F_1371.txt,dms.directory_105_benchmark,dms.category_022_benchmark,dms.tag_073_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1372_benchmark,F_1372.txt,dms.directory_018_benchmark,dms.category_004_benchmark,dms.tag_135_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1373_benchmark,F_1373.txt,dms.directory_334_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1374_benchmark,F_1374.txt,dms.directory_445_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1375_benchmark,F_1375.txt,dms.directory_349_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1376_benchmark,F_1376.txt,dms.directory_171_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1377_benchmark,F_1377.txt,dms.directory_268_benchmark,dms.category_044_benchmark,dms.tag_095_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1378_benchmark,F_1378.txt,dms.directory_126_benchmark,dms.category_038_benchmark,dms.tag_092_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1379_benchmark,F_1379.txt,dms.directory_066_benchmark,dms.category_034_benchmark,dms.tag_109_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1380_benchmark,F_1380.txt,dms.directory_258_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1381_benchmark,F_1381.txt,dms.directory_245_benchmark,dms.category_003_benchmark,dms.tag_076_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1382_benchmark,F_1382.txt,dms.directory_299_benchmark,dms.category_043_benchmark,dms.tag_139_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1383_benchmark,F_1383.txt,dms.directory_281_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1384_benchmark,F_1384.txt,dms.directory_071_benchmark,dms.category_039_benchmark,dms.tag_003_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1385_benchmark,F_1385.txt,dms.directory_196_benchmark,dms.category_050_benchmark,dms.tag_029_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1386_benchmark,F_1386.txt,dms.directory_447_benchmark,dms.category_003_benchmark,dms.tag_145_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1387_benchmark,F_1387.txt,dms.directory_432_benchmark,dms.category_015_benchmark,dms.tag_002_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1388_benchmark,F_1388.txt,dms.directory_281_benchmark,dms.category_025_benchmark,dms.tag_082_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1389_benchmark,F_1389.txt,dms.directory_456_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1390_benchmark,F_1390.txt,dms.directory_132_benchmark,dms.category_013_benchmark,dms.tag_031_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1391_benchmark,F_1391.txt,dms.directory_120_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1392_benchmark,F_1392.txt,dms.directory_254_benchmark,dms.category_029_benchmark,dms.tag_005_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1393_benchmark,F_1393.txt,dms.directory_312_benchmark,dms.category_046_benchmark,dms.tag_022_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1394_benchmark,F_1394.txt,dms.directory_278_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1395_benchmark,F_1395.txt,dms.directory_477_benchmark,dms.category_001_benchmark,dms.tag_122_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1396_benchmark,F_1396.txt,dms.directory_131_benchmark,,dms.tag_132_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1397_benchmark,F_1397.txt,dms.directory_272_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1398_benchmark,F_1398.txt,dms.directory_257_benchmark,dms.category_014_benchmark,dms.tag_059_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1399_benchmark,F_1399.txt,dms.directory_468_benchmark,dms.category_015_benchmark,dms.tag_120_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1400_benchmark,F_1400.txt,dms.directory_102_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1401_benchmark,F_1401.txt,dms.directory_064_benchmark,dms.category_005_benchmark,dms.tag_014_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1402_benchmark,F_1402.txt,dms.directory_036_benchmark,dms.category_040_benchmark,dms.tag_072_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1403_benchmark,F_1403.txt,dms.directory_079_benchmark,dms.category_020_benchmark,dms.tag_129_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1404_benchmark,F_1404.txt,dms.directory_013_benchmark,dms.category_001_benchmark,dms.tag_122_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1405_benchmark,F_1405.txt,dms.directory_241_benchmark,dms.category_046_benchmark,dms.tag_062_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1406_benchmark,F_1406.txt,dms.directory_452_benchmark,dms.category_039_benchmark,dms.tag_128_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1407_benchmark,F_1407.txt,dms.directory_374_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1408_benchmark,F_1408.txt,dms.directory_296_benchmark,dms.category_027_benchmark,dms.tag_001_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1409_benchmark,F_1409.txt,dms.directory_136_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1410_benchmark,F_1410.txt,dms.directory_475_benchmark,dms.category_025_benchmark,dms.tag_097_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1411_benchmark,F_1411.txt,dms.directory_071_benchmark,dms.category_046_benchmark,dms.tag_062_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1412_benchmark,F_1412.txt,dms.directory_201_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1413_benchmark,F_1413.txt,dms.directory_386_benchmark,dms.category_046_benchmark,dms.tag_062_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1414_benchmark,F_1414.txt,dms.directory_407_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1415_benchmark,F_1415.txt,dms.directory_335_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1416_benchmark,F_1416.txt,dms.directory_310_benchmark,dms.category_039_benchmark,dms.tag_146_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1417_benchmark,F_1417.txt,dms.directory_313_benchmark,dms.category_023_benchmark,dms.tag_038_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1418_benchmark,F_1418.txt,dms.directory_180_benchmark,dms.category_021_benchmark,dms.tag_026_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1419_benchmark,F_1419.txt,dms.directory_322_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1420_benchmark,F_1420.txt,dms.directory_178_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1421_benchmark,F_1421.txt,dms.directory_467_benchmark,dms.category_014_benchmark,dms.tag_078_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1422_benchmark,F_1422.txt,dms.directory_321_benchmark,dms.category_022_benchmark,dms.tag_061_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1423_benchmark,F_1423.txt,dms.directory_489_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1424_benchmark,F_1424.txt,dms.directory_270_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1425_benchmark,F_1425.txt,dms.directory_228_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1426_benchmark,F_1426.txt,dms.directory_400_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1427_benchmark,F_1427.txt,dms.directory_237_benchmark,dms.category_043_benchmark,dms.tag_079_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1428_benchmark,F_1428.txt,dms.directory_020_benchmark,dms.category_016_benchmark,dms.tag_100_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1429_benchmark,F_1429.txt,dms.directory_395_benchmark,dms.category_011_benchmark,dms.tag_021_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1430_benchmark,F_1430.txt,dms.directory_160_benchmark,dms.category_041_benchmark,dms.tag_053_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1431_benchmark,F_1431.txt,dms.directory_372_benchmark,dms.category_011_benchmark,dms.tag_080_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1432_benchmark,F_1432.txt,dms.directory_200_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1433_benchmark,F_1433.txt,dms.directory_122_benchmark,dms.category_033_benchmark,dms.tag_039_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1434_benchmark,F_1434.txt,dms.directory_374_benchmark,dms.category_013_benchmark,dms.tag_068_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1435_benchmark,F_1435.txt,dms.directory_173_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1436_benchmark,F_1436.txt,dms.directory_412_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1437_benchmark,F_1437.txt,dms.directory_204_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1438_benchmark,F_1438.txt,dms.directory_347_benchmark,dms.category_025_benchmark,dms.tag_112_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1439_benchmark,F_1439.txt,dms.directory_030_benchmark,dms.category_017_benchmark,dms.tag_011_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1440_benchmark,F_1440.txt,dms.directory_347_benchmark,,dms.tag_134_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1441_benchmark,F_1441.txt,dms.directory_103_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1442_benchmark,F_1442.txt,dms.directory_295_benchmark,dms.category_021_benchmark,dms.tag_026_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1443_benchmark,F_1443.txt,dms.directory_381_benchmark,dms.category_001_benchmark,dms.tag_143_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1444_benchmark,F_1444.txt,dms.directory_151_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1445_benchmark,F_1445.txt,dms.directory_136_benchmark,dms.category_041_benchmark,dms.tag_087_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1446_benchmark,F_1446.txt,dms.directory_059_benchmark,,dms.tag_009_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1447_benchmark,F_1447.txt,dms.directory_216_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1448_benchmark,F_1448.txt,dms.directory_182_benchmark,dms.category_028_benchmark,dms.tag_052_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1449_benchmark,F_1449.txt,dms.directory_442_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1450_benchmark,F_1450.txt,dms.directory_258_benchmark,dms.category_025_benchmark,dms.tag_028_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1451_benchmark,F_1451.txt,dms.directory_272_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1452_benchmark,F_1452.txt,dms.directory_326_benchmark,dms.category_033_benchmark,dms.tag_039_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1453_benchmark,F_1453.txt,dms.directory_147_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1454_benchmark,F_1454.txt,dms.directory_377_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1455_benchmark,F_1455.txt,dms.directory_464_benchmark,dms.category_046_benchmark,dms.tag_062_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1456_benchmark,F_1456.txt,dms.directory_425_benchmark,dms.category_028_benchmark,dms.tag_052_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1457_benchmark,F_1457.txt,dms.directory_361_benchmark,dms.category_043_benchmark,dms.tag_139_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1458_benchmark,F_1458.txt,dms.directory_394_benchmark,dms.category_033_benchmark,dms.tag_039_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1459_benchmark,F_1459.txt,dms.directory_133_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1460_benchmark,F_1460.txt,dms.directory_334_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1461_benchmark,F_1461.txt,dms.directory_341_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1462_benchmark,F_1462.txt,dms.directory_179_benchmark,dms.category_027_benchmark,dms.tag_048_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1463_benchmark,F_1463.txt,dms.directory_352_benchmark,dms.category_021_benchmark,dms.tag_136_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1464_benchmark,F_1464.txt,dms.directory_231_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1465_benchmark,F_1465.txt,dms.directory_226_benchmark,dms.category_008_benchmark,dms.tag_077_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1466_benchmark,F_1466.txt,dms.directory_216_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1467_benchmark,F_1467.txt,dms.directory_061_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1468_benchmark,F_1468.txt,dms.directory_298_benchmark,dms.category_015_benchmark,dms.tag_056_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1469_benchmark,F_1469.txt,dms.directory_144_benchmark,dms.category_014_benchmark,dms.tag_103_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1470_benchmark,F_1470.txt,dms.directory_233_benchmark,dms.category_019_benchmark,dms.tag_125_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1471_benchmark,F_1471.txt,dms.directory_325_benchmark,dms.category_023_benchmark,dms.tag_085_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1472_benchmark,F_1472.txt,dms.directory_394_benchmark,dms.category_049_benchmark,dms.tag_035_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1473_benchmark,F_1473.txt,dms.directory_362_benchmark,dms.category_019_benchmark,dms.tag_125_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1474_benchmark,F_1474.txt,dms.directory_363_benchmark,dms.category_018_benchmark,dms.tag_133_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1475_benchmark,F_1475.txt,dms.directory_131_benchmark,dms.category_011_benchmark,dms.tag_144_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1476_benchmark,F_1476.txt,dms.directory_478_benchmark,dms.category_018_benchmark,dms.tag_018_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1477_benchmark,F_1477.txt,dms.directory_184_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1478_benchmark,F_1478.txt,dms.directory_120_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1479_benchmark,F_1479.txt,dms.directory_139_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1480_benchmark,F_1480.txt,dms.directory_042_benchmark,dms.category_013_benchmark,dms.tag_068_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1481_benchmark,F_1481.txt,dms.directory_296_benchmark,dms.category_041_benchmark,dms.tag_053_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1482_benchmark,F_1482.txt,dms.directory_043_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1483_benchmark,F_1483.txt,dms.directory_013_benchmark,,dms.tag_063_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1484_benchmark,F_1484.txt,dms.directory_025_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1485_benchmark,F_1485.txt,dms.directory_444_benchmark,dms.category_001_benchmark,dms.tag_143_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1486_benchmark,F_1486.txt,dms.directory_085_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1487_benchmark,F_1487.txt,dms.directory_427_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1488_benchmark,F_1488.txt,dms.directory_136_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1489_benchmark,F_1489.txt,dms.directory_397_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1490_benchmark,F_1490.txt,dms.directory_033_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1491_benchmark,F_1491.txt,dms.directory_130_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1492_benchmark,F_1492.txt,dms.directory_247_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1493_benchmark,F_1493.txt,dms.directory_105_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1494_benchmark,F_1494.txt,dms.directory_149_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1495_benchmark,F_1495.txt,dms.directory_246_benchmark,dms.category_031_benchmark,dms.tag_114_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1496_benchmark,F_1496.txt,dms.directory_285_benchmark,dms.category_025_benchmark,dms.tag_082_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1497_benchmark,F_1497.txt,dms.directory_237_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1498_benchmark,F_1498.txt,dms.directory_020_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1499_benchmark,F_1499.txt,dms.directory_277_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1500_benchmark,F_1500.txt,dms.directory_434_benchmark,dms.category_001_benchmark,dms.tag_143_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== diff --git a/dms/tests/data/dms.storage.csv b/dms/tests/data/dms.storage.csv new file mode 100644 index 00000000..5db4c3e2 --- /dev/null +++ b/dms/tests/data/dms.storage.csv @@ -0,0 +1,3 @@ +id,name,save_type +dms.storage_001_benchmark,S_001,database +dms.storage_002_benchmark,S_002,database diff --git a/dms/tests/data/dms.tag.csv b/dms/tests/data/dms.tag.csv new file mode 100644 index 00000000..dc25364b --- /dev/null +++ b/dms/tests/data/dms.tag.csv @@ -0,0 +1,151 @@ +id,name,category_id/id +dms.tag_001_benchmark,T_001,dms.category_027_benchmark +dms.tag_002_benchmark,T_002,dms.category_015_benchmark +dms.tag_003_benchmark,T_003,dms.category_039_benchmark +dms.tag_004_benchmark,T_004, +dms.tag_005_benchmark,T_005,dms.category_029_benchmark +dms.tag_006_benchmark,T_006, +dms.tag_007_benchmark,T_007,dms.category_049_benchmark +dms.tag_008_benchmark,T_008,dms.category_015_benchmark +dms.tag_009_benchmark,T_009, +dms.tag_010_benchmark,T_010, +dms.tag_011_benchmark,T_011,dms.category_017_benchmark +dms.tag_012_benchmark,T_012, +dms.tag_013_benchmark,T_013, +dms.tag_014_benchmark,T_014,dms.category_005_benchmark +dms.tag_015_benchmark,T_015, +dms.tag_016_benchmark,T_016, +dms.tag_017_benchmark,T_017,dms.category_017_benchmark +dms.tag_018_benchmark,T_018,dms.category_018_benchmark +dms.tag_019_benchmark,T_019,dms.category_040_benchmark +dms.tag_020_benchmark,T_020,dms.category_022_benchmark +dms.tag_021_benchmark,T_021,dms.category_011_benchmark +dms.tag_022_benchmark,T_022,dms.category_046_benchmark +dms.tag_023_benchmark,T_023,dms.category_012_benchmark +dms.tag_024_benchmark,T_024,dms.category_040_benchmark +dms.tag_025_benchmark,T_025,dms.category_009_benchmark +dms.tag_026_benchmark,T_026,dms.category_021_benchmark +dms.tag_027_benchmark,T_027,dms.category_026_benchmark +dms.tag_028_benchmark,T_028,dms.category_025_benchmark +dms.tag_029_benchmark,T_029,dms.category_050_benchmark +dms.tag_030_benchmark,T_030,dms.category_037_benchmark +dms.tag_031_benchmark,T_031,dms.category_013_benchmark +dms.tag_032_benchmark,T_032, +dms.tag_033_benchmark,T_033,dms.category_034_benchmark +dms.tag_034_benchmark,T_034, +dms.tag_035_benchmark,T_035,dms.category_049_benchmark +dms.tag_036_benchmark,T_036,dms.category_041_benchmark +dms.tag_037_benchmark,T_037, +dms.tag_038_benchmark,T_038,dms.category_023_benchmark +dms.tag_039_benchmark,T_039,dms.category_033_benchmark +dms.tag_040_benchmark,T_040,dms.category_049_benchmark +dms.tag_041_benchmark,T_041,dms.category_006_benchmark +dms.tag_042_benchmark,T_042,dms.category_041_benchmark +dms.tag_043_benchmark,T_043,dms.category_040_benchmark +dms.tag_044_benchmark,T_044, +dms.tag_045_benchmark,T_045,dms.category_026_benchmark +dms.tag_046_benchmark,T_046, +dms.tag_047_benchmark,T_047,dms.category_034_benchmark +dms.tag_048_benchmark,T_048,dms.category_027_benchmark +dms.tag_049_benchmark,T_049,dms.category_024_benchmark +dms.tag_050_benchmark,T_050,dms.category_050_benchmark +dms.tag_051_benchmark,T_051,dms.category_001_benchmark +dms.tag_052_benchmark,T_052,dms.category_028_benchmark +dms.tag_053_benchmark,T_053,dms.category_041_benchmark +dms.tag_054_benchmark,T_054,dms.category_040_benchmark +dms.tag_055_benchmark,T_055,dms.category_019_benchmark +dms.tag_056_benchmark,T_056,dms.category_015_benchmark +dms.tag_057_benchmark,T_057,dms.category_012_benchmark +dms.tag_058_benchmark,T_058,dms.category_005_benchmark +dms.tag_059_benchmark,T_059,dms.category_014_benchmark +dms.tag_060_benchmark,T_060, +dms.tag_061_benchmark,T_061,dms.category_022_benchmark +dms.tag_062_benchmark,T_062,dms.category_046_benchmark +dms.tag_063_benchmark,T_063, +dms.tag_064_benchmark,T_064,dms.category_032_benchmark +dms.tag_065_benchmark,T_065, +dms.tag_066_benchmark,T_066,dms.category_017_benchmark +dms.tag_067_benchmark,T_067,dms.category_007_benchmark +dms.tag_068_benchmark,T_068,dms.category_013_benchmark +dms.tag_069_benchmark,T_069,dms.category_035_benchmark +dms.tag_070_benchmark,T_070, +dms.tag_071_benchmark,T_071,dms.category_049_benchmark +dms.tag_072_benchmark,T_072,dms.category_040_benchmark +dms.tag_073_benchmark,T_073,dms.category_022_benchmark +dms.tag_074_benchmark,T_074,dms.category_025_benchmark +dms.tag_075_benchmark,T_075, +dms.tag_076_benchmark,T_076,dms.category_003_benchmark +dms.tag_077_benchmark,T_077,dms.category_008_benchmark +dms.tag_078_benchmark,T_078,dms.category_014_benchmark +dms.tag_079_benchmark,T_079,dms.category_043_benchmark +dms.tag_080_benchmark,T_080,dms.category_011_benchmark +dms.tag_081_benchmark,T_081,dms.category_019_benchmark +dms.tag_082_benchmark,T_082,dms.category_025_benchmark +dms.tag_083_benchmark,T_083,dms.category_018_benchmark +dms.tag_084_benchmark,T_084,dms.category_024_benchmark +dms.tag_085_benchmark,T_085,dms.category_023_benchmark +dms.tag_086_benchmark,T_086, +dms.tag_087_benchmark,T_087,dms.category_041_benchmark +dms.tag_088_benchmark,T_088,dms.category_037_benchmark +dms.tag_089_benchmark,T_089,dms.category_015_benchmark +dms.tag_090_benchmark,T_090, +dms.tag_091_benchmark,T_091, +dms.tag_092_benchmark,T_092,dms.category_038_benchmark +dms.tag_093_benchmark,T_093,dms.category_049_benchmark +dms.tag_094_benchmark,T_094, +dms.tag_095_benchmark,T_095,dms.category_044_benchmark +dms.tag_096_benchmark,T_096, +dms.tag_097_benchmark,T_097,dms.category_025_benchmark +dms.tag_098_benchmark,T_098,dms.category_012_benchmark +dms.tag_099_benchmark,T_099,dms.category_001_benchmark +dms.tag_100_benchmark,T_100,dms.category_016_benchmark +dms.tag_101_benchmark,T_101,dms.category_035_benchmark +dms.tag_102_benchmark,T_102,dms.category_001_benchmark +dms.tag_103_benchmark,T_103,dms.category_014_benchmark +dms.tag_104_benchmark,T_104, +dms.tag_105_benchmark,T_105,dms.category_019_benchmark +dms.tag_106_benchmark,T_106,dms.category_003_benchmark +dms.tag_107_benchmark,T_107,dms.category_014_benchmark +dms.tag_108_benchmark,T_108, +dms.tag_109_benchmark,T_109,dms.category_034_benchmark +dms.tag_110_benchmark,T_110,dms.category_050_benchmark +dms.tag_111_benchmark,T_111,dms.category_031_benchmark +dms.tag_112_benchmark,T_112,dms.category_025_benchmark +dms.tag_113_benchmark,T_113,dms.category_033_benchmark +dms.tag_114_benchmark,T_114,dms.category_031_benchmark +dms.tag_115_benchmark,T_115,dms.category_041_benchmark +dms.tag_116_benchmark,T_116,dms.category_031_benchmark +dms.tag_117_benchmark,T_117,dms.category_050_benchmark +dms.tag_118_benchmark,T_118,dms.category_007_benchmark +dms.tag_119_benchmark,T_119, +dms.tag_120_benchmark,T_120,dms.category_015_benchmark +dms.tag_121_benchmark,T_121,dms.category_005_benchmark +dms.tag_122_benchmark,T_122,dms.category_001_benchmark +dms.tag_123_benchmark,T_123, +dms.tag_124_benchmark,T_124, +dms.tag_125_benchmark,T_125,dms.category_019_benchmark +dms.tag_126_benchmark,T_126,dms.category_040_benchmark +dms.tag_127_benchmark,T_127, +dms.tag_128_benchmark,T_128,dms.category_039_benchmark +dms.tag_129_benchmark,T_129,dms.category_020_benchmark +dms.tag_130_benchmark,T_130, +dms.tag_131_benchmark,T_131, +dms.tag_132_benchmark,T_132, +dms.tag_133_benchmark,T_133,dms.category_018_benchmark +dms.tag_134_benchmark,T_134, +dms.tag_135_benchmark,T_135,dms.category_004_benchmark +dms.tag_136_benchmark,T_136,dms.category_021_benchmark +dms.tag_137_benchmark,T_137, +dms.tag_138_benchmark,T_138,dms.category_043_benchmark +dms.tag_139_benchmark,T_139,dms.category_043_benchmark +dms.tag_140_benchmark,T_140,dms.category_021_benchmark +dms.tag_141_benchmark,T_141,dms.category_020_benchmark +dms.tag_142_benchmark,T_142,dms.category_034_benchmark +dms.tag_143_benchmark,T_143,dms.category_001_benchmark +dms.tag_144_benchmark,T_144,dms.category_011_benchmark +dms.tag_145_benchmark,T_145,dms.category_003_benchmark +dms.tag_146_benchmark,T_146,dms.category_039_benchmark +dms.tag_147_benchmark,T_147,dms.category_016_benchmark +dms.tag_148_benchmark,T_148,dms.category_040_benchmark +dms.tag_149_benchmark,T_149,dms.category_014_benchmark +dms.tag_150_benchmark,T_150,dms.category_013_benchmark diff --git a/dms/tests/data/mail01.eml b/dms/tests/data/mail01.eml new file mode 100644 index 00000000..2f4e8033 --- /dev/null +++ b/dms/tests/data/mail01.eml @@ -0,0 +1,170 @@ +Return-Path: <123@acm.org> +To: Manuel Lemos <directory+test@dmsTest.com> +Subject: Testing Manuel Lemos' MIME E-mail composing and sending PHP class: HTML message +From: mlemos <345@acm.org> +Reply-To: mlemos <456@acm.org> +Sender: mlemos@acm.org +X-Mailer: http://www.phpclasses.org/mimemessage $Revision: 1.63 $ (mail) +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary="652b8c4dcb00cdcdda1e16af36781caf" +Message-ID: <20050430192829.0489.mlemos@dmsTest.com> +Date: Sat, 30 Apr 2005 19:28:29 -0300 + + +--652b8c4dcb00cdcdda1e16af36781caf +Content-Type: multipart/related; boundary="6a82fb459dcaacd40ab3404529e808dc" + + +--6a82fb459dcaacd40ab3404529e808dc +Content-Type: multipart/alternative; boundary="69c1683a3ee16ef7cf16edd700694a2f" + + +--69c1683a3ee16ef7cf16edd700694a2f +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: quoted-printable + +This is an HTML message. Please use an HTML capable mail program to read +this message. + +--69c1683a3ee16ef7cf16edd700694a2f +Content-Type: text/html; charset=ISO-8859-1 +Content-Transfer-Encoding: quoted-printable + +<html> +<head> +<title>Testing Manuel Lemos' MIME E-mail composing and sending PHP class: H= +TML message + + + + + + + +
+

Testing Manuel Lemos' MIME E-mail composing and sending PHP cla= +ss: HTML message

+
+

Hello Manuel,

+This message is just to let you know that the MIME E-mail message composing and sending PHP class is working as expected.

+

Here is an image embedded in a message as a separate part:

= +
+
Than= +k you,
+mlemos

+
+ + +--69c1683a3ee16ef7cf16edd700694a2f-- + +--6a82fb459dcaacd40ab3404529e808dc +Content-Type: image/gif; name="logo.gif" +Content-Transfer-Encoding: base64 +Content-Disposition: inline; filename="logo.gif" +Content-ID: + +R0lGODlhlgAjAPMJAAAAAAAA/y8vLz8/P19fX19f339/f4+Pj4+Pz7+/v/////////////////// +/////yH5BAEAAAkALAAAAACWACMAQwT+MMlJq7046827/2AoHYChGAChAkBylgKgKClFyEl6xDMg +qLFBj3C5uXKplVAxIOxkA8BhdFCpDlMK1urMTrZWbAV8tVS5YsxtxmZHBVOSCcW9zaXyNhslVcto +RBp5NQYxLAYGLi8oSwoJBlE+BiSNj5E/PDQsmy4pAJWQLAKJY5+hXhZ2dDYldFWtNSFPiXssXnZR +k5+1pjpBiDMJUXG/Jo7DI4eKfMSmxsJ9GAUB1NXW19jZ2tvc3d7f4OHi2AgZN5vom1kk6F7s6u/p +m3Ab7AOIiCxOyZuBIv8AOeTJIaYQjiR/kKTr5GQNE3pYSjCJ9mUXClRUsLxaZGciC0X+OlpoOuQo +ZKdNJnIoKfnxRUQh6FLG0iLxIoYnJd0JEKISJyAQDodp3EUDC48oDnUY7HFI3wEDRjzycQJVZCQT +Ol7NK+G0qgtkAcOKHUu2rNmzYTVqRMt2bB49bHompSchqg6HcGeANSMxr8sEa2y2HexnSEUTuWri +SSbkYh7BgGVAnhB1b2REibESYaRoBgqIMYx59tFM9AvQffVG49P5NMZkMlHKhJPJb0knmSKZ6kSX +JtbeF3Am7ocok6c7cM7pU5xcXiJJETUz16qPrzEfaFgZpvzn7h86YV5r/1mxXeAUMVyEIpnVUGpN +RlG2ka9b3lP3pm2l6u7P+l/YLj3+RlEHbz1C0kRxSITQaAcilVBMEzmkkEQO8oSOBNg9SN+AX6hV +z1pjgJiAhwCRsY8ZIp6xj1ruqCgeGeKNGEZwLnIwzTg45qjjjjz2GEA5hAUp5JBEFmnkkSCoWEcZ +X8yohZNK1pFGPQS4hx0qNSLJlk9wCQORYu5QiMd7bUzGVyNlRiOHSlpuKdGEItHQ3HZ18beRRyws +YSY/waDTiHf/tWlWUBAJiMJ1/Z0XXU7N0FnREpKM4NChCgbyRDq9XYpOplaKopN9NMkDnBbG+UMC +QwLWIeaiglES6AjGARcPHCWoVAiatcTnGTABZoLPaPG1phccPv366mEvWEFSLnj+2QaonECwcJt/ +e1Zw3lJvVMmftBdVNQS3UngLCA85YHIQOy6JO9N4eZW7KJwtOUZmGwOMWqejwVW6RQzaikRHX3yI +osKhDAq8wmnKSmdMwNidSOof9ZG2DoV0RfTVmLFtGmNk+CoZna0HQnPHS3AhRbIeDpqmR09E0bsu +soeaw994z+rwQVInvqLenBftYjLOVphLFHhV9qsnez8AEUbQRgO737AxChjmyANxuEFHSGi7hFCV +4jxLst2N8sRJYU+SHiAKjlmCgz2IffbLI5aaQR71hnkxq1ZfHSfKata6YDCJDMAQwY7wOgzhjxgj +VFQnKB5uX4mr9qJ79pann+VcfcSzsSCd2mw5scqRRvlQ6TgcUelYhu75iPE4JejrsJOFQAG01277 +7bjnrvvuvPfu++/ABy887hfc6OPxyCevPDdAVoDA89BHL/301Fdv/fXYZ6/99tx3Pz0FEQAAOw== + +--6a82fb459dcaacd40ab3404529e808dc +Content-Type: image/gif; name="background.gif" +Content-Transfer-Encoding: base64 +Content-Disposition: inline; filename="background.gif" +Content-ID: <4c837ed463ad29c820668e835a270e8a.gif> + +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 +eZmYmZmauZmc2ZlCEQEAOw== + +--6a82fb459dcaacd40ab3404529e808dc-- + +--652b8c4dcb00cdcdda1e16af36781caf +Content-Type: text/plain; name="attachment.txt" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="attachment.txt" + +VGhpcyBpcyBqdXN0IGEgcGxhaW4gdGV4dCBhdHRhY2htZW50IGZpbGUgbmFtZWQgYXR0YWNobWVu +dC50eHQgLg== + +--652b8c4dcb00cdcdda1e16af36781caf-- diff --git a/dms/tests/data/mail02.eml b/dms/tests/data/mail02.eml new file mode 100644 index 00000000..bb07b14f --- /dev/null +++ b/dms/tests/data/mail02.eml @@ -0,0 +1,44 @@ +MIME-Version: 1.0 +Received: by 10.220.191.194 with HTTP; Wed, 11 May 2011 12:27:12 -0700 (PDT) +Date: Wed, 11 May 2011 13:27:12 -0600 +Delivered-To: jncjkq@dmsTest.com +Message-ID: +Subject: Test +From: Bill Jncjkq +To: directory+test@dmsTest.com +Content-Type: multipart/mixed; boundary=bcaec54eecc63acce904a3050f79 + +--bcaec54eecc63acce904a3050f79 +Content-Type: multipart/alternative; boundary=bcaec54eecc63acce604a3050f77 + +--bcaec54eecc63acce604a3050f77 +Content-Type: text/plain; charset=ISO-8859-1 + +-- +Bill Jncjkq + +--bcaec54eecc63acce604a3050f77 +Content-Type: text/html; charset=ISO-8859-1 + +
--
Bill Jncjkq
+ +--bcaec54eecc63acce604a3050f77-- +--bcaec54eecc63acce904a3050f79 +Content-Type: text/html; charset=US-ASCII; name="bookmarks-really-short.html" +Content-Disposition: attachment; filename="bookmarks-really-short.html" +Content-Transfer-Encoding: base64 +X-Attachment-Id: f_gnknv6u70 + +PCFET0NUWVBFIE5FVFNDQVBFLUJvb2ttYXJrLWZpbGUtMT4KCTxIVE1MPgoJPE1FVEEgSFRUUC1F +UVVJVj0iQ29udGVudC1UeXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgoJ +PFRpdGxlPkJvb2ttYXJrczwvVGl0bGU+Cgk8SDE+Qm9va21hcmtzPC9IMT4KCQk8RFQ+PEgzIEZP +TERFRD5UZWNoIE5ld3M8L0gzPgoJCTxETD48cD4KCQkJPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cu +Y25ldC5jb20vIj5DTmV0PC9BPgoJCQk8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy53aXJlZC5jb20v +Ij5XaXJlZCBOZXdzPC9BPgoJCTwvREw+PHA+CgkJPERUPjxIMyBGT0xERUQ+VG9vbHMgYW5kIFJl +ZmVyZW5jZTwvSDM+CgkJPERMPjxwPgoJCQk8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5tb25zdGVy +LmNvbS8iPk1vbnN0ZXIuY29tPC9BPgoJCQk8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy53ZWJtZC5j +b20vIj5XZWJNRDwvQT4KCQk8L0RMPjxwPgoJCTxEVD48SDMgRk9MREVEPlRyYXZlbDwvSDM+CgkJ +PERMPjxwPgoJCQk8RFQ+PEEgSFJFRj0iaHR0cDovL2ZvZG9ycy5jb20vIj5Gb2RvcnM8L0E+CgkJ +CTxEVD48QSBIUkVGPSJodHRwOi8vd3d3LnRyYXZlbG9jaXR5LmNvbS8iPlRyYXZlbG9jaXR5PC9B +PgoJCTwvREw+PHA+Cgk8L0RMPjxwPgo8L0hUTUw+ +--bcaec54eecc63acce904a3050f79-- diff --git a/dms/tests/test_benchmark.py b/dms/tests/test_benchmark.py new file mode 100644 index 00000000..1a85e4ed --- /dev/null +++ b/dms/tests/test_benchmark.py @@ -0,0 +1,391 @@ +# Copyright 2017-2019 MuK IT GmbH. +# Copyright 2020 Creu Blanca +# Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +import cProfile +import logging +import os +import unittest +import warnings +from functools import wraps + +from odoo.tests import common, tagged +from odoo.tools import convert_file + +from .common import track_function + +_logger = logging.getLogger(__name__) + + +class profile: + def __init__(self, fname=None): + warnings.warn("Since 16.0.", DeprecationWarning, stacklevel=2) + self.fname = fname + + def __call__(self, f): + @wraps(f) + def wrapper(*args, **kwargs): + profile = cProfile.Profile() + result = profile.runcall(f, *args, **kwargs) + profile.dump_stats(self.fname or (f"{f.__name__}.cprof")) + return result + + return wrapper + + +# This tests will only be executed if --test-tags benchmark is defined +@tagged("-standard", "benchmark") +class BenchmarkTestCase(common.TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls._clean_existing_records() + cls._setup_benchmark_data() + + @classmethod + def _clean_existing_records(cls): + cls.env["dms.category"].search([]).sudo().unlink() + cls.env["dms.directory"].search([]).sudo().unlink() + cls.env["dms.storage"].search([]).sudo().unlink() + cls.env["dms.tag"].search([]).sudo().unlink() + + @classmethod + def _load(cls, module, *args): + path = str(os.path.join(module, *args)) + convert_file(cls.env, "dms", args[-1], {}, "init", False, "test", path) + + @classmethod + def _setup_benchmark_data(cls): + cls._load("dms", "tests", "data", "dms.category.csv") + cls._load("dms", "tests", "data", "dms.storage.csv") + cls._load("dms", "tests", "data", "dms.tag.csv") + cls._load("dms", "tests", "data", "dms.directory.csv") + cls._load("dms", "tests", "data", "dms.file.csv") + + def _benchmark_table(self, data): + columns = len(data[0]) - 1 + formt = "{:7}" + "| {:28}" * columns + + result = formt.format(*data[0]) + "\n" + result += ("-" * 7) + (("+" + "-" * 29) * columns) + "\n" + for row in data[1:]: + result += formt.format(*row) + "\n" + return result + + def _benchmark_function(self, func, args_list): + tfunc = track_function(return_tracking=True)(func) + benchmark = [] + for item in args_list: + self.registry.clear_all_caches() + args = item[0] if len(item) > 0 else [] + kwargs = item[1] if len(item) > 1 else {} + tracking = tuple(tfunc(*args, **kwargs)[1][1:]) + # pylint: disable=too-few-format-args + # pyupgrade: disable=UP030 + benchmark.append("{}sq {:.3f}s {:.3f}s {:.3f}s".format(*tracking)) + return benchmark + + # ---------------------------------------------------------- + # File + # ---------------------------------------------------------- + + def _file_kanban_fields(self): + return [ + "id", + "tag_ids", + "name", + "color", + "active", + "mimetype", + "create_uid", + "write_date", + "locked_by", + "is_locked", + "is_lock_editor", + "permission_write", + "permission_unlink", + ] + + def test_file_search_benchmark(self): + demo_uid = self.browse_ref("base.user_demo").id + admin_uid = self.browse_ref("base.user_admin").id + model = self.env["dms.file"].with_context(bin_size=True) + args = [ + [[[]], {"limit": 1}], + [[[]], {"limit": 80}], + [[[]], {"limit": 500}], + [[[]]], + ] + + benchmark_data_super = ["Super"] + self._benchmark_function( + model.sudo().search, args + ) + benchmark_data_admin = ["Admin"] + self._benchmark_function( + model.with_user(admin_uid).search, args + ) + benchmark_data_demo = ["Demo"] + self._benchmark_function( + model.with_user(demo_uid).search, args + ) + + info_message = "\n\nSearching files with bin_size = True | " + info_message += "Benchmark with Limit 1 / 80 / 500 / None (1500)\n\n" + info_message += self._benchmark_table( + [ + [ + "User", + "Search Limit 1", + "Search Limit 80", + "Search Limit 500", + "Search No Limit", + ], + benchmark_data_super, + benchmark_data_admin, + benchmark_data_demo, + ] + ) + info_message += "\nLegend: Queries | Query Time | Server Time | Total Time\n" + _logger.info(info_message) + + def test_file_search_read_benchmark(self): + demo_uid = self.browse_ref("base.user_demo").id + admin_uid = self.browse_ref("base.user_admin").id + model = self.env["dms.file"].with_context(bin_size=True) + args = [[[], {"limit": 1}], [[], {"limit": 80}], [[], {"limit": 500}], [[]]] + + benchmark_data_super = ["Super"] + self._benchmark_function( + model.sudo().search_read, args + ) + benchmark_data_admin = ["Admin"] + self._benchmark_function( + model.with_user(admin_uid).search_read, args + ) + benchmark_data_demo = ["Demo"] + self._benchmark_function( + model.with_user(demo_uid).search_read, args + ) + + info_message = "\n\nSearching and reading all fields with bin_size = True | " + info_message += "Benchmark with Limit 1 / 80 / 500 / None (1500)\n\n" + info_message += self._benchmark_table( + [ + [ + "User", + "Search Limit 1", + "Search Limit 80", + "Search Limit 500", + "Search No Limit", + ], + benchmark_data_super, + benchmark_data_admin, + benchmark_data_demo, + ] + ) + info_message += "\nLegend: Queries | Query Time | Server Time | Total Time\n" + _logger.info(info_message) + + def test_file_search_name_get_benchmark(self): + demo_uid = self.browse_ref("base.user_demo").id + admin_uid = self.browse_ref("base.user_admin").id + model = self.env["dms.file"].with_context(bin_size=True) + + def test_function(model, limit): + return model.search([], limit=limit).mapped("display_name") + + model_super = model.sudo() + model_admin = model.with_user(admin_uid) + model_demo = model.with_user(demo_uid) + args_super = [ + [[model_super, 1]], + [[model_super, 800]], + [[model_super, 500]], + [[model_super, None]], + ] + args_admin = [ + [[model_admin, 1]], + [[model_admin, 800]], + [[model_admin, 500]], + [[model_admin, None]], + ] + args_demo = [ + [[model_demo, 1]], + [[model_demo, 800]], + [[model_demo, 500]], + [[model_demo, None]], + ] + + benchmark_data_super = ["Super"] + self._benchmark_function( + test_function, args_super + ) + benchmark_data_admin = ["Admin"] + self._benchmark_function( + test_function, args_admin + ) + benchmark_data_demo = ["Demo"] + self._benchmark_function( + test_function, args_demo + ) + + info_message = ( + "\n\nSearching and 'display_name' function with bin_size = True | " + ) + info_message += "Benchmark with Limit 1 / 80 / 500 / None (1500)\n\n" + info_message += self._benchmark_table( + [ + [ + "User", + "Search Limit 1", + "Search Limit 80", + "Search Limit 500", + "Search No Limit", + ], + benchmark_data_super, + benchmark_data_admin, + benchmark_data_demo, + ] + ) + info_message += "\nLegend: Queries | Query Time | Server Time | Total Time\n" + _logger.info(info_message) + + def test_file_kanban_backend_benchmark(self): + demo_uid = self.browse_ref("base.user_demo").id + admin_uid = self.browse_ref("base.user_admin").id + model = self.env["dms.file"].with_context(bin_size=True) + kanban_fields = self._file_kanban_fields() + + def test_function(model, kanban_fields, limit=80): + model.search_panel_select_range("directory_id") + model.search_panel_select_multi_range("directory_id") + model.search_panel_select_multi_range("tag_ids") + model.search_read(fields=kanban_fields, limit=limit) + + def function_args(args, kwargs): + return [[args, {"limit": arg}] for arg in kwargs] + + args_super = function_args([model.sudo(), kanban_fields], [1, 80, 500, None]) + args_admin = function_args( + [model.with_user(admin_uid), kanban_fields], [1, 80, 500, None] + ) + args_demo = function_args( + [model.with_user(demo_uid), kanban_fields], [1, 80, 500, None] + ) + + benchmark_data_super = ["Super"] + self._benchmark_function( + test_function, args_super + ) + benchmark_data_admin = ["Admin"] + self._benchmark_function( + test_function, args_admin + ) + benchmark_data_demo = ["Demo"] + self._benchmark_function( + test_function, args_demo + ) + + info_message = "\n\nSimulate kanban view loading on the backend | " + info_message += "Benchmark with Limit 1 / 80 / 500 / None (1500)\n\n" + info_message += self._benchmark_table( + [ + [ + "User", + "Search Limit 1", + "Search Limit 80", + "Search Limit 500", + "Search No Limit", + ], + benchmark_data_super, + benchmark_data_admin, + benchmark_data_demo, + ] + ) + info_message += "\nLegend: Queries | Query Time | Server Time | Total Time || " + info_message += "500 Directories | 150 Tags | 50 Categories\n" + _logger.info(info_message) + + # ---------------------------------------------------------- + # Directory + # ---------------------------------------------------------- + + def test_directory_search_benchmark(self): + demo_uid = self.browse_ref("base.user_demo").id + admin_uid = self.browse_ref("base.user_admin").id + model = self.env["dms.directory"].with_context(bin_size=True) + args = [ + [[[]], {"limit": 1}], + [[[]], {"limit": 80}], + [[[]], {"limit": 500}], + [[[]]], + ] + + benchmark_data_super = ["Super"] + self._benchmark_function( + model.sudo().search, args + ) + benchmark_data_admin = ["Admin"] + self._benchmark_function( + model.with_user(admin_uid).search, args + ) + benchmark_data_demo = ["Demo"] + self._benchmark_function( + model.with_user(demo_uid).search, args + ) + + info_message = "\n\nSearching directories with bin_size = True | " + info_message += "Benchmark with Limit 1 / 80 / 500 / None (1500)\n\n" + info_message += self._benchmark_table( + [ + [ + "User", + "Search Limit 1", + "Search Limit 80", + "Search Limit 500", + "Search No Limit", + ], + benchmark_data_super, + benchmark_data_admin, + benchmark_data_demo, + ] + ) + info_message += "\nLegend: Queries | Query Time | Server Time | Total Time\n" + _logger.info(info_message) + + def test_directory_search_read_benchmark(self): + demo_uid = self.browse_ref("base.user_demo").id + admin_uid = self.browse_ref("base.user_admin").id + model = self.env["dms.directory"].with_context(bin_size=True) + args = [[[], {"limit": 1}], [[], {"limit": 80}], [[], {"limit": 500}], [[]]] + + benchmark_data_super = ["Super"] + self._benchmark_function( + model.sudo().search_read, args + ) + benchmark_data_admin = ["Admin"] + self._benchmark_function( + model.with_user(admin_uid).search_read, args + ) + benchmark_data_demo = ["Demo"] + self._benchmark_function( + model.with_user(demo_uid).search_read, args + ) + + info_message = "\n\nSearching and reading all fields with bin_size = True | " + info_message += "Benchmark with Limit 1 / 80 / 500 / None (1500)\n\n" + info_message += self._benchmark_table( + [ + [ + "User", + "Search Limit 1", + "Search Limit 80", + "Search Limit 500", + "Search No Limit", + ], + benchmark_data_super, + benchmark_data_admin, + benchmark_data_demo, + ] + ) + info_message += "\nLegend: Queries | Query Time | Server Time | Total Time\n" + _logger.info(info_message) + + # ---------------------------------------------------------- + # Profiler + # ---------------------------------------------------------- + + @unittest.skip("Takes to long to be tested every time.") + def test_file_search_read_profile_admin(self): + @track_function() + @profile(minimum_queries=35) + def profile_function(model): + model.search_read([]) + + admin_uid = self.browse_ref("base.user_admin").id + model = self.env["dms.file"].with_user(admin_uid) + profile_function(model.with_context(bin_size=True)) diff --git a/dms/tests/test_directory.py b/dms/tests/test_directory.py new file mode 100644 index 00000000..f7e81eb1 --- /dev/null +++ b/dms/tests/test_directory.py @@ -0,0 +1,319 @@ +# Copyright 2017-2019 MuK IT GmbH. +# Copyright 2020 Creu Blanca +# Copyright 2021-2022 Tecnativa - Víctor Martínez +# Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +import os + +from odoo import Command +from odoo.exceptions import AccessError, UserError +from odoo.tests import new_test_user +from odoo.tests.common import users +from odoo.tools import mute_logger + +from .common import StorageDatabaseBaseCase + +_path = os.path.dirname(os.path.dirname(__file__)) + + +class DirectoryTestCaseBase(StorageDatabaseBaseCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.subdirectory = cls.create_directory(directory=cls.directory) + cls.file.directory_id = cls.subdirectory + cls.new_storage = cls.create_storage(save_type="database") + + @users("dms-manager", "dms-user") + def test_create_directory(self): + root_directory = self.create_directory(storage=self.storage) + sub_directory = self.create_directory(directory=root_directory) + self.assertEqual( + sub_directory.storage_id.id, + self.storage.id, + msg="The storage of the subdirectory should be the same as " + "the root directory", + ) + self.assertEqual( + root_directory.count_directories, + 1, + msg="The root directory should have one subdirectory", + ) + + @users("dms-manager", "dms-user") + def test_copy_root_directory(self): + copy_root_directory = self.directory.copy() + copy_root_directory.flush_recordset() + self.assertEqual( + self.directory.storage_id.id, + copy_root_directory.storage_id.id, + msg="The storage of the copied root directory should be the same as the " + "original root directory", + ) + self.assertEqual( + self.directory.count_directories, + copy_root_directory.count_directories, + msg="The copied root directory should have the same number of " + "subdirectories as the original root directory", + ) + self.assertEqual( + self.directory.count_files, + copy_root_directory.count_files, + msg="The copied root directory should have the same number of " + "files as the original root directory", + ) + + @users("dms-manager", "dms-user") + def test_copy_sub_directory(self): + copy_sub_directory = self.subdirectory.copy() + self.assertEqual( + self.subdirectory.storage_id.id, + copy_sub_directory.storage_id.id, + msg="The storage of the copied subdirectory should be the same as the " + "original subdirectory", + ) + self.assertEqual( + self.subdirectory.count_directories, + copy_sub_directory.count_directories, + msg="The copied subdirectory should have the same number of subdirectories " + "as the original subdirectory", + ) + self.assertEqual( + self.subdirectory.count_files, + copy_sub_directory.count_files, + msg="The copied subdirectory should have the same number of " + "files as the original subdirectory", + ) + + @users("dms-manager", "dms-user") + def test_rename_directory(self): + path_names = self.subdirectory.complete_name + self.directory.write({"name": f"New Test Name {self.env.user.login}"}) + self.assertNotEqual( + path_names, + self.subdirectory.complete_name, + msg="The path name of the subdirectory should have changed", + ) + + @users("dms-manager", "dms-user") + def test_move_directory(self): + with self.assertRaises(UserError, msg="The root directory should not be moved"): + self.directory.write( + { + "is_root_directory": False, + "parent_id": self.subdirectory.id, + } + ) + with self.assertRaises( + UserError, msg="The subdirectory storage should not be changed" + ): + self.subdirectory.write( + { + "is_root_directory": True, + "storage_id": self.new_storage.id, + "parent_id": False, + } + ) + self.subdirectory.write( + { + "is_root_directory": True, + "storage_id": self.storage.id, + "parent_id": False, + } + ) + new_directory = self.create_directory(storage=self.storage) + self.subdirectory.write( + { + "is_root_directory": False, + "storage_id": False, + "parent_id": new_directory.id, + } + ) + with self.assertRaises(UserError, msg="The root directory should not be moved"): + self.directory.storage_id = self.new_storage.id + self.subdirectory.write( + { + "is_root_directory": False, + "storage_id": False, + "parent_id": self.directory.id, + } + ) + + @users("dms-manager", "dms-user") + @mute_logger("odoo.models.unlink") + def test_unlink_root_directory(self): + root_directory = self.create_directory(storage=self.storage) + sub_directory = self.create_directory(directory=root_directory) + sub_files = self.create_file(directory=sub_directory) + root_directory.unlink() + self.assertFalse( + sub_directory.exists(), msg="The subdirectory should not exist anymore" + ) + self.assertFalse( + sub_files.exists(), msg="The subfiles should not exist anymore" + ) + + @users("dms-manager", "dms-user") + @mute_logger("odoo.models.unlink") + def test_unlink_directory(self): + root_directory = self.create_directory(storage=self.storage) + sub_directory = self.create_directory(directory=root_directory) + sub_files = self.create_file(directory=sub_directory) + sub_directory.unlink() + self.assertTrue( + root_directory.exists(), msg="The root directory should still exist" + ) + self.assertFalse( + sub_files.exists(), msg="The subfiles should not exist anymore" + ) + + @users("dms-manager", "dms-user") + def test_storage(self): + root_directory = self.create_directory(storage=self.storage) + sub_directory = self.create_directory(directory=root_directory) + self.assertEqual( + sub_directory.storage_id.id, + self.storage.id, + msg="The storage " + "of the subdirectory should be the same as the root " + "directory", + ) + with self.assertRaises( + UserError, msg="The storage of the root directory should " "not be changed" + ): + root_directory.write({"storage_id": self.new_storage.id}) + + @users("dms-manager", "dms-user") + def test_starred(self): + self.directory.toggle_starred() + self.subdirectory.write({"starred": True}) + starred = self.directory_model.search([("starred", "=", True)]) + self.assertIn( + self.directory.id, starred.ids, msg="The directory should be starred" + ) + self.assertIn( + self.subdirectory.id, starred.ids, msg="The subdirectory should be starred" + ) + + @users("dms-manager", "dms-user") + def test_count_directories(self): + self.assertTrue( + self.directory.count_directories, + msg="The directory should have subdirectories", + ) + + @users("dms-manager", "dms-user") + def test_count_files(self): + self.assertTrue( + self.subdirectory.count_files, msg="The subdirectory should have files" + ) + + @users("dms-manager", "dms-user") + def test_count_elements(self): + self.assertTrue( + self.directory.count_elements, + msg="The directory should have subdirectories and files", + ) + + @users("dms-manager", "dms-user") + def test_count_total_directories(self): + self.assertTrue( + self.directory.count_total_directories, + msg="The directory should have subdirectories", + ) + + @users("dms-manager", "dms-user") + def test_count_count_total_files(self): + self.assertTrue( + self.directory.count_total_files, msg="The directory should have files" + ) + + @users("dms-manager", "dms-user") + def test_count_total_elements(self): + self.assertTrue( + self.directory.count_total_elements, + msg="The directory should have subdirectories and files", + ) + + @users("dms-manager", "dms-user") + def test_size(self): + self.assertTrue(self.directory.size, msg="The directory should have a size") + + @users("dms-manager", "dms-user") + def test_name_get(self): + directory = self.subdirectory.with_context(dms_directory_show_path=True) + self.assertTrue( + "/" in directory.with_context(dms_directory_show_path=True).display_name, + msg="The path should be displayed in the directory name", + ) + + @users("dms-manager", "dms-user") + def test_name_search(self): + directories = self.directory_model.name_search("/") + self.assertTrue(len(directories), msg="The root directory should be found") + + @users("dms-manager", "dms-user") + def test_search_panel(self): + self.assertTrue( + self.directory_model.search_panel_select_multi_range("parent_id"), + msg="The parent_id field should be a multi range field", + ) + self.assertTrue( + self.directory_model.search_panel_select_multi_range("category_id"), + msg="The category_id field should be a multi range field", + ) + self.assertTrue( + self.directory_model.search_panel_select_multi_range("tag_ids"), + msg="The tag_ids field should be a multi range field", + ) + + def test_directory_unlink_custom(self): + user = new_test_user( + self.env, login="test-dms-customer-user", groups="dms.group_dms_user" + ) + group = self.access_group_model.create( + {"name": "Test read group", "explicit_user_ids": [Command.set(user.ids)]} + ) + root_directory = self.create_directory(storage=self.storage) + root_directory.group_ids = [Command.link(group.id)] + with self.assertRaises(AccessError): + root_directory.with_user(user).unlink() + + +class DirectoryMailTestCase(StorageDatabaseBaseCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.params = cls.env["ir.config_parameter"].sudo() + cls.params.set_param("mail.catchall.domain", "dmstest.com") + cls.domain = cls.env["mail.alias.domain"].create({"name": "dmstest.com"}) + cls.alias = cls.env["mail.alias"].create( + { + "alias_model_id": cls.env["ir.model"] + .search([("model", "=", "dms.directory")]) + .id, + "alias_domain_id": cls.domain.id, + } + ) + + @mute_logger("odoo.addons.mail.mail_thread") + def test_mail_alias_files(self): + self.directory.write({"alias_process": "files", "alias_name": "directory+test"}) + self._handle_mail_reception() + + def _handle_mail_reception(self): + with open(os.path.join(_path, "tests", "data", "mail01.eml")) as file: + self.env["mail.thread"].message_process(None, file.read()) + with open(os.path.join(_path, "tests", "data", "mail02.eml")) as file: + self.env["mail.thread"].message_process(None, file.read()) + + @mute_logger("odoo.addons.mail.mail_thread") + def test_mail_alias_directory(self): + self.directory.write( + {"alias_process": "directory", "alias_name": "directory+test"} + ) + self.assertEqual( + self.directory.alias_id.display_name, + f"{self.directory.alias_name}@{self.domain.name}", + ) diff --git a/dms/tests/test_file.py b/dms/tests/test_file.py new file mode 100644 index 00000000..f67aa4ec --- /dev/null +++ b/dms/tests/test_file.py @@ -0,0 +1,193 @@ +# Copyright 2017-2019 MuK IT GmbH. +# Copyright 2020 Creu Blanca +# Copyright 2021-2022 Tecnativa - Víctor Martínez +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +import base64 + +from odoo.exceptions import UserError +from odoo.tests import new_test_user +from odoo.tests.common import users +from odoo.tools import mute_logger + +from .common import StorageFileBaseCase + +try: + import magic +except ImportError: + magic = None + + +class FileFilestoreTestCase(StorageFileBaseCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.user_a = new_test_user(cls.env, login="user-a", groups="dms.group_dms_user") + cls.directory_group_a = cls.create_directory(storage=cls.storage) + cls.inaccessible_directory = cls.create_directory(storage=cls.storage) + cls.inaccessible_file = cls.create_file(directory=cls.inaccessible_directory) + cls.inaccessible_group = cls.access_group_model.create( + { + "name": "Inaccessible Group. No directory set", + "perm_create": True, + "explicit_user_ids": [(6, 0, [cls.user_a.id])], + } + ) + cls.sub_directory_x = cls.create_directory(directory=cls.directory_group_a) + cls.group_a = cls.access_group_model.create( + { + "name": "Group A", + "perm_create": True, + "explicit_user_ids": [(6, 0, [cls.user_a.id])], + "directory_ids": [ + (4, cls.directory_group_a.id), + (4, cls.sub_directory_x.id), + ], + } + ) + cls.directory_group_a.group_ids = [(4, cls.group_a.id)] + cls.file2 = cls.create_file(directory=cls.sub_directory_x) + + @users("user-a") + def test_unaccessible_file(self): + dms_files = self.file_model.with_user(self.env.user).search( + [("storage_id", "=", self.storage.id)] + ) + self.assertNotIn( + self.inaccessible_file.id, + dms_files.ids, + msg="User A should not see the unaccessible file since it " + "was not granted access to the directory", + ) + self.assertIn( + self.file2.id, + dms_files.ids, + msg="User A should see the file2 since it was granted access to " + "the directory", + ) + + @users("user-a") + def test_inaccessible_directory(self): + dms_directories = self.directory_model.with_user(self.env.user).search( + [("storage_id", "=", self.storage.id)] + ) + self.assertNotIn( + self.inaccessible_directory.id, + dms_directories.ids, + msg="User A should not see the inaccessible directory since " + "it was not granted access to the directory", + ) + self.assertIn( + self.sub_directory_x.id, + dms_directories.ids, + msg="User A should see the sub_directory_x since it was granted " + "access to the directory", + ) + + @users("user-a") + def test_file_access(self): + dms_files = self.file_model.with_user(self.env.user).search( + [("storage_id", "=", self.storage.id)] + ) + self.assertNotIn(self.file.id, dms_files.ids, msg="User A should not see file") + self.assertIn(self.file2.id, dms_files.ids, msg="User A should see file2") + dms_directories = self.directory_model.with_user(self.env.user).search( + [("storage_id", "=", self.storage.id)] + ) + self.assertNotIn( + self.directory.id, + dms_directories.ids, + msg="User A should not see directory", + ) + self.assertIn( + self.sub_directory_x.id, + dms_directories.ids, + msg="User A should see sub_directory_x", + ) + + @users("dms-manager", "dms-user") + @mute_logger("odoo.models.unlink") + def test_content_file(self): + object_file = self.create_file(directory=self.directory) + self.assertTrue(object_file.content, msg="Content is not empty") + self.assertTrue(object_file.content_file, msg="Content file is not empty") + self.assertTrue( + object_file.with_context(bin_size=True).content, + msg="Content is not empty (with bin_size)", + ) + self.assertTrue( + object_file.with_context(bin_size=True).content_file, + msg="Content file is not empty (with bin_size)", + ) + self.assertTrue( + object_file.with_context(human_size=True).content_file, + msg="Content file is not empty (with human_size)", + ) + self.assertTrue( + object_file.with_context(base64=True).content_file, + msg="Content file is not empty (with base64)", + ) + self.assertTrue( + object_file.with_context(stream=True).content_file, + msg="Content file is not empty (with stream)", + ) + oid = object_file.with_context(oid=True).content_file + self.assertTrue(oid, msg="Content file is not empty (with oid)") + object_file.with_context(**{"show_content": True}).write( + {"content": base64.b64encode(b"\xff new content")} + ) + self.assertNotEqual( + oid, + object_file.with_context(**{"oid": True}).content_file, + msg="Content file has changed", + ) + self.assertTrue(object_file.export_data(["content"])) + object_file.unlink() + + def test_content_file_mimetype(self): + file_svg = self.env.ref("dms.file_05_demo") + self.assertEqual(file_svg.mimetype, "image/svg+xml", msg="SVG mimetype") + file_logo = self.env.ref("dms.file_02_demo") + self.assertEqual(file_logo.mimetype, "image/jpeg", msg="JPEG mimetype") + + def test_content_file_mimetype_magic_library(self): + if not magic: + self.skipTest("Without python-magic library installed") + file_video = self.env.ref("dms.file_10_demo") + self.assertEqual(file_video.mimetype, "video/mp4", msg="MP4 mimetype") + + def test_content_file_extension(self): + file_pdf = self.env.ref("dms.file_27_demo") + self.assertEqual(file_pdf.extension, "pdf", msg="PDF extension") + file_pdf.name = "Document_05" + self.assertEqual( + file_pdf.extension, "pdf", msg="PDF extension without extension" + ) + file_pdf.name = "Document_05.pdf" + self.assertEqual(file_pdf.extension, "pdf", msg="PDF extension with extension") + + def test_wizard_dms_file_move(self): + file3 = self.create_file(directory=self.sub_directory_x) + all_files = self.file + self.file2 + file3 + # Error: All files must have the same root directory + with self.assertRaises( + UserError, msg="All files must have the same root directory" + ): + self.file_model.with_context( + active_ids=all_files.ids + ).action_wizard_dms_file_move() + # Change the files that have the same root directory + files = self.file2 + file3 + res = self.file_model.with_context( + active_ids=files.ids + ).action_wizard_dms_file_move() + wizard_model = self.env[res["res_model"]].with_context(**res["context"]) + wizard = wizard_model.create({"directory_id": self.directory.id}) + self.assertEqual(wizard.count_files, 2, msg="Wizard has 2 files") + wizard.process() + self.assertEqual( + self.file2.directory_id, self.directory, msg="File2 has a new directory" + ) + self.assertEqual( + file3.directory_id, self.directory, msg="File3 has a new directory" + ) diff --git a/dms/tests/test_file_database.py b/dms/tests/test_file_database.py new file mode 100644 index 00000000..d619db37 --- /dev/null +++ b/dms/tests/test_file_database.py @@ -0,0 +1,154 @@ +# Copyright 2017-2019 MuK IT GmbH. +# Copyright 2020 Creu Blanca +# Copyright 2021-2022 Tecnativa - Víctor Martínez +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo.exceptions import UserError +from odoo.tests.common import users +from odoo.tools import mute_logger + +from .common import StorageDatabaseBaseCase + + +class FileDatabaseTestCase(StorageDatabaseBaseCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.file_demo_01 = cls.env.ref("dms.file_01_demo") + cls.directory2 = cls.create_directory(storage=cls.storage) + cls.new_storage2 = cls.create_storage(save_type="database") + cls.directory3 = cls.create_directory(storage=cls.new_storage2) + + @users("dms-manager", "dms-user") + def test_create_file(self): + root_directory = self.create_directory(storage=self.storage) + self.create_file(directory=root_directory) + sub_directory = self.create_directory(directory=root_directory) + self.create_file(sub_directory) + self.assertEqual(root_directory.count_total_files, 2, "Total files should be 2") + self.assertEqual( + sub_directory.count_files, 1, "Subdirectory total files should be 1" + ) + + @users("dms-manager", "dms-user") + def test_lock_file(self): + file = self.create_file(directory=self.directory) + file.lock() + self.assertTrue(file.is_locked, "File should be locked") + file.unlock() + self.assertFalse(file.is_locked, "File should be unlocked") + + @users("dms-manager", "dms-user") + def test_copy_file(self): + copy_file = self.file.copy() + self.assertEqual( + self.file.storage_id, copy_file.storage_id, "Storage should be the same" + ) + self.assertEqual( + self.file.content, copy_file.content, "Content should be the same" + ) + + @users("dms-manager", "dms-user") + def test_rename_file(self): + file = self.create_file(directory=self.directory) + extension = file.extension + file.write({"name": f"test-{self.env.user.login}.jpg"}) + self.assertNotEqual(file.extension, extension, "Extension should be different") + + @users("dms-manager", "dms-user") + def test_move_file(self): + file = self.create_file(directory=self.directory) + path_names = file.path_names + file.write({"directory_id": self.directory2.id}) + file.flush_recordset() + self.assertNotEqual( + path_names, file.path_names, "Path names should be different" + ) + + @users("dms-manager", "dms-user") + def test_move_directory(self): + with self.assertRaises( + UserError, msg="Directory can't have any parent, because it is " "root" + ): + self.directory.write( + { + "is_root_directory": False, + "parent_id": self.directory3.id, + } + ) + + @users("dms-manager", "dms-user") + @mute_logger("odoo.models.unlink") + def test_unlink_file(self): + file = self.create_file(directory=self.directory) + file.unlink() + self.assertFalse(file.exists(), "File should not exist") + + @users("dms-manager", "dms-user") + def test_compute_thumbnail(self): + self.assertTrue(self.file_demo_01.image_128, "Thumbnail should be computed") + + @users("dms-manager", "dms-user") + def test_compute_path_names(self): + self.assertTrue(self.file.path_names, "Path names should be computed") + + @users("dms-manager", "dms-user") + def test_compute_path_json(self): + self.assertTrue(self.file.path_json, "Path json should be computed") + + @users("dms-manager", "dms-user") + def test_compute_mimetype(self): + self.assertTrue(self.file.mimetype, "Mimetype should be computed") + + @users("dms-manager", "dms-user") + def test_compute_extension(self): + self.assertTrue(self.file.extension, "Extension should be computed") + + @users("dms-manager", "dms-user") + def test_size_calculation(self): + self.assertTrue(self.file.size, "Size should be computed") + + @users("dms-manager", "dms-user") + def test_checksum_calculation(self): + self.assertTrue(self.file.checksum, "Checksum should be computed") + + @users("dms-manager", "dms-user") + def test_compute_content(self): + self.assertTrue( + self.file.with_context(bin_size=True).content, + "Content should be computed (with bin_size)", + ) + self.assertTrue( + self.file.with_context(bin_size=False).content, + "Content should be computed (without bin_size)", + ) + self.assertNotEqual( + self.file.with_context(bin_size=False).content, + self.file.with_context(bin_size=True).content, + "Content should be different", + ) + + @users("dms-manager", "dms-user") + def test_compute_save_type(self): + self.assertTrue(self.file.save_type, "Save type should be computed") + + @users("dms-manager", "dms-user") + def test_compute_migration(self): + self.assertTrue(self.file.migration, "Migration should be computed") + + @users("dms-manager", "dms-user") + def test_search_panel(self): + self.assertTrue( + self.file.search_panel_select_range("directory_id"), + "Directory should be selected", + ) + self.assertTrue( + self.file.search_panel_select_multi_range("directory_id"), + "Directory should be selected", + ) + self.assertTrue( + self.file.search_panel_select_multi_range("tag_ids"), + "Tag should be selected", + ) + res = self.file.search_panel_select_range("directory_id", enable_counters=True) + self.assertTrue(self.directory2.id == x["id"] for x in res["values"]) diff --git a/dms/tests/test_portal.py b/dms/tests/test_portal.py new file mode 100644 index 00000000..dbc321ae --- /dev/null +++ b/dms/tests/test_portal.py @@ -0,0 +1,90 @@ +# Copyright 2021-2025 Tecnativa - Víctor Martínez +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl) + +import odoo.tests +from odoo.exceptions import AccessError +from odoo.tests.common import users +from odoo.tools import mute_logger + +from .common import StorageAttachmentBaseCase + + +@odoo.tests.tagged("post_install", "-at_install") +class TestDmsPortal(odoo.tests.HttpCase, StorageAttachmentBaseCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.partner = cls.env.ref("base.partner_demo_portal") + cls.portal_user = cls.partner.user_ids + cls._create_attachment("test.txt") + cls._create_attachment("test2.txt", cls.other_partner) + cls.directory_partner = cls._get_partner_directory() + cls.other_directory_partner = cls._get_partner_directory(cls.other_partner) + cls.file_partner = cls.directory_partner.file_ids[0] + cls.other_file_partner = cls.other_directory_partner.file_ids[0] + + def test_access_portal(self): + self.authenticate("portal", "portal") + # 404: Incorrect access_token + file_text = self.create_file(directory=self.directory_partner) + url = f"{file_text.access_url}&access_token=abc-def" + response = self.url_open(url, timeout=20) + self.assertEqual( + response.status_code, 404, "Can't access file with incorrect access_token" + ) + # 200 + response = self.url_open(self.file_partner._get_share_url(), timeout=20) + self.assertEqual( + response.status_code, 200, "Can access file with correct access_token" + ) + # 200 + response = self.url_open(self.directory_partner._get_share_url(), timeout=20) + self.assertEqual( + response.status_code, 200, "Can access directory with correct access_token" + ) + + def test_tour(self): + for tour in ("dms_portal_mail_tour", "dms_portal_partners_tour"): + with self.subTest(tour=tour): + self.start_tour("/my", tour, login="portal") + + @users("portal") + @mute_logger("odoo.addons.base.models.ir_rule") + def test_permission_portal_user_access_own_attachment(self): + """ + The user can access its own attachments, even if its access group are not set + """ + # Has to manually su=False because the portal user is not a superuser, + # but odoo uses somewhere sudo() internally + file = self.file_partner.with_user(self.env.user).with_env(self.env(su=False)) + directory = self.directory_partner.with_user(self.env.user).with_env( + self.env(su=False) + ) + # Portal user can only read + file.check_access("read") + + # Portal user can't do anything else + with self.assertRaises(AccessError, msg="Portal user should not have access"): + file.check_access("write") + file.check_access("unlink") + directory.check_access("create") + + @users("portal") + @mute_logger("odoo.addons.base.models.ir_rule") + def test_permission_portal_user_access_other_attachment(self): + """ + The user can't access other attachments if its access group are not set + """ + # Has to manually su=False because the portal user is not a superuser, + # but odoo uses somewhere sudo() internally + file = self.other_file_partner.with_user(self.env.user).with_env( + self.env(su=False) + ) + # file.invalidate_recordset() + # Portal user can't do anything + with self.assertRaises(AccessError, msg="Portal user should not have access"): + file.check_access("read") + with self.assertRaises(AccessError, msg="Portal user should not have access"): + file.check_access("write") + with self.assertRaises(AccessError, msg="Portal user should not have access"): + file.check_access("unlink") diff --git a/dms/tests/test_storage_attachment.py b/dms/tests/test_storage_attachment.py new file mode 100644 index 00000000..c278fcd4 --- /dev/null +++ b/dms/tests/test_storage_attachment.py @@ -0,0 +1,168 @@ +# Copyright 2021-2022 Tecnativa - Víctor Martínez +# Copyright 2021 Tecnativa - João Marques +# Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo.tests.common import users +from odoo.tools import mute_logger + +from .common import StorageAttachmentBaseCase + + +class StorageAttachmentTestCase(StorageAttachmentBaseCase): + @users("dms-manager") + @mute_logger("odoo.models.unlink") + def test_storage_attachment(self): + self._create_attachment("demo.txt") + self.assertTrue( + self.storage.storage_file_ids.filtered(lambda x: x.name == "demo.txt"), + "File should be created", + ) + directory = self._get_partner_directory() + self.assertEqual(directory.count_files, 1, "Directory should have 1 file") + self.assertEqual( + directory.file_ids[0].name, "demo.txt", "File should be demo.txt" + ) + file_01 = self.create_file(directory=directory) + self.assertEqual(file_01.storage_id, self.storage, "Storage should be the same") + self.assertEqual( + file_01.storage_id.save_type, "attachment", "Save type should be attachment" + ) + self.assertEqual(file_01.save_type, "database", "Save type should be database") + self.assertEqual(directory.count_files, 2, "Directory should have 2 files") + # Assert cascade removal + self.partner.unlink() + self.assertFalse(file_01.exists(), "File should not exist") + self.assertFalse(directory.exists(), "Directory should not exist") + + @users("dms-manager") + def test_storage_attachment_record_db_unlink(self): + self._create_attachment("demo.txt") + self.assertTrue( + self.storage.storage_file_ids.filtered(lambda x: x.name == "demo.txt") + ) + directory = self._get_partner_directory() + self.assertEqual(directory.res_model, self.partner._name) + self.assertEqual(directory.res_id, self.partner.id) + directory.res_id = -1 # Trick to reference a non-existing record + directories = self.env["dms.directory"].search([]) + self.assertNotIn(directory.id, directories.ids) + + @mute_logger("odoo.models.unlink") + def test_storage_attachment_unlink_lock_file(self): + group_partner_manager = self.env.ref("base.group_partner_manager") + self.dms_manager_user.write({"group_ids": [(4, group_partner_manager.id)]}) + self.dms_user.write({"group_ids": [(4, group_partner_manager.id)]}) + attachment = self._create_attachment("demo.txt") + attachment = attachment.with_user(self.dms_manager_user) + file = self.storage.storage_file_ids.filtered(lambda x: x.name == "demo.txt") + file.with_user(self.dms_user).lock() + self.assertTrue(file.is_locked) + self.assertFalse(file.is_lock_editor) + file.with_user(self.dms_user).unlock() + self.assertFalse(file.is_locked) + attachment.unlink() + self.assertFalse(file.exists()) + + @users("dms-manager") + def test_storage_attachment_misc(self): + attachment = self._create_attachment("demo.txt") + root_directory = self.storage.root_directory_ids.filtered( + lambda x: x.is_root_directory + ) + self.assertEqual( + root_directory.count_directories, + 1, + "Root directory should have 1 directory", + ) + self.assertEqual( + len(root_directory.child_directory_ids), + 1, + "Root directory should have 1 child directory", + ) + child_directory = root_directory.child_directory_ids[0] + self.assertEqual( + child_directory.res_model, + self.partner_model._name, + "Model should be res.partner", + ) + self.assertEqual( + child_directory.res_id, self.partner.id, "Record ID should be partner ID" + ) + self.assertEqual( + len(root_directory.child_directory_ids.file_ids), + 1, + "Root directory should have 1 file", + ) + dms_file = root_directory.child_directory_ids.file_ids[0] + self.assertEqual( + dms_file.attachment_id, attachment, "Attachment should be the same" + ) + self.assertEqual(dms_file.name, "demo.txt", "Name should be demo.txt") + self.assertEqual( + dms_file.res_model, self.partner_model._name, "Model should be res.partner" + ) + self.assertEqual( + dms_file.res_id, self.partner.id, "Record ID should be partner ID" + ) + directory = self._get_partner_directory() + file_01 = self.create_file(directory=directory) + self.assertEqual( + file_01.res_model, self.partner_model._name, "Model should be res.partner" + ) + self.assertEqual( + file_01.res_id, self.partner.id, "Record ID should be partner ID" + ) + self.assertEqual(file_01.storage_id, self.storage, "Storage should be the same") + self.assertEqual( + file_01.storage_id.save_type, "attachment", "Save type should be attachment" + ) + self.assertEqual(file_01.save_type, "database", "Save type should be database") + self.assertEqual( + self.storage.count_storage_files, 2, "Storage should have 2 files" + ) + dms_file.unlink() + self.assertFalse(attachment.exists()) + + @users("dms-manager") + def test_storage_attachment_directory_record_ref_access_dms_manager(self): + self._create_attachment("demo.txt") + directory = self._get_partner_directory() + self.assertTrue(directory.permission_read, "Permission read should be True") + self.assertEqual(self.partner.type, "contact", "Type should be contact") + self.assertTrue( + directory.sudo().permission_read, "Permission read should be True" + ) + + @users("dms-user") + def test_storage_attachment_directory_record_ref_access_dms_user(self): + self._create_attachment("demo.txt") + directory = self._get_partner_directory() + self.assertTrue(directory.permission_read, "Permission read should be True") + self.assertEqual(self.partner.type, "contact", "Type should be contact") + self.assertTrue( + directory.sudo().permission_read, "Permission read should be True" + ) + directory.invalidate_recordset() + self.assertTrue( + directory.permission_read, "Permission read should still be True" + ) + + @users("basic-user") + def test_storage_attachment_directory_record_ref_access_basic_user(self): + self._create_attachment("demo.txt") + directory = self._get_partner_directory() + self.assertTrue(directory.permission_read, "Permission read should be True") + self.assertTrue(directory.permission_read, "Permission read should be True") + self.assertEqual(self.partner.type, "contact", "Type should be contact") + self.partner.sudo().write({"type": "other"}) + self.assertEqual(self.partner.type, "other", "Type should now be other") + self.assertTrue( + directory.sudo().permission_read, "Permission read should be True" + ) + + @users("basic-user") + def test_create_attachment_basic_user(self): + attachment = self._create_attachment("Test file") + self.assertEqual(attachment.name, "Test file", "Name should be Test file") + self.assertTrue(self._get_partner_directory(), "Directory should exist") diff --git a/dms/tests/test_storage_database.py b/dms/tests/test_storage_database.py new file mode 100644 index 00000000..cd8dab61 --- /dev/null +++ b/dms/tests/test_storage_database.py @@ -0,0 +1,138 @@ +# Copyright 2017-2019 MuK IT GmbH. +# Copyright 2020 Creu Blanca +# Copyright 2022 Víctor Martínez +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo.tests.common import users +from odoo.tools import mute_logger + +from .common import StorageDatabaseBaseCase + + +class StorageDatabaseTestCase(StorageDatabaseBaseCase): + @users("dms-manager") + def test_action_storage_migrate(self): + self.storage.action_storage_migrate() + + @users("dms-manager", "dms-user") + def test_count_storage_directories(self): + self.assertTrue( + self.storage.count_storage_directories, "Storage should have directories" + ) + + @users("dms-manager", "dms-user") + def test_count_storage_files(self): + self.assertTrue(self.storage.count_storage_files, "Storage should have files") + + @users("dms-manager") + @mute_logger("odoo.models.unlink") + def test_file_migrate(self): + root_directory = self.storage.root_directory_ids.filtered( + lambda x: x.is_root_directory + ) + file_01 = self.create_file(directory=root_directory) + self.assertEqual( + file_01.storage_id, self.storage, "File should be in the storage" + ) + self.assertEqual( + file_01.storage_id.save_type, "database", "Storage should be database" + ) + self.assertEqual( + file_01.save_type, "database", "File savetype should be database" + ) + self.storage.write({"save_type": "file"}) + directory = self.create_directory(storage=self.storage) + file_02 = self.create_file(directory=directory) + self.assertEqual( + file_01.storage_id, self.storage, "File should be in the storage" + ) + self.assertEqual(file_01.storage_id.save_type, "file", "Storage should be file") + self.assertEqual( + file_01.save_type, "database", "File savetype should be database" + ) + self.assertEqual( + file_02.storage_id, self.storage, "File should be in the storage" + ) + self.assertEqual(file_02.storage_id.save_type, "file", "Storage should be file") + self.assertEqual(file_02.save_type, "file", "File savetype should be file") + self.storage.action_storage_migrate() + self.assertEqual( + file_01.storage_id, self.storage, "File should be in the storage" + ) + self.assertEqual(file_01.storage_id.save_type, "file", "Storage should be file") + self.assertEqual(file_01.save_type, "file", "File savetype should be file") + self.assertEqual( + file_02.storage_id, self.storage, "File should be in the storage" + ) + self.assertEqual(file_02.storage_id.save_type, "file", "Storage should be file") + self.assertEqual(file_02.save_type, "file", "File savetype should be file") + self.storage.write({"save_type": "database"}) + self.storage.action_storage_migrate() + self.assertEqual( + file_01.storage_id, self.storage, "File should be in the storage" + ) + self.assertEqual( + file_01.storage_id.save_type, "database", "Storage should be database" + ) + self.assertEqual( + file_01.save_type, "database", "File savetype should be database" + ) + self.assertEqual( + file_02.storage_id, self.storage, "File should be in the storage" + ) + self.assertEqual( + file_02.storage_id.save_type, "database", "Storage should be database" + ) + self.assertEqual( + file_02.save_type, "database", "File savetype should be database" + ) + self.storage.write({"save_type": "attachment"}) + model_partner = self.env.ref("base.model_res_partner") + partner = self.partner_model.create({"name": "Test partner"}) + directory = self.directory_model.create( + { + "name": self.partner_model._name, + "model_id": model_partner.id, + "res_id": partner.id, + "parent_id": self.storage.root_directory_ids[0].id, + "storage_id": self.storage.id, + } + ) + file_03 = self.create_file(directory=directory) + self.assertEqual( + file_02.storage_id, self.storage, "File should be in the storage" + ) + self.assertEqual( + file_02.storage_id.save_type, "attachment", "Storage should be attachment" + ) + self.assertEqual( + file_02.save_type, "database", "File savetype should be database" + ) + self.assertEqual( + file_03.storage_id, self.storage, "File should be in the storage" + ) + self.assertEqual( + file_03.storage_id.save_type, "attachment", "Storage should be attachment" + ) + self.assertEqual( + file_03.save_type, "database", "File savetype should be database" + ) + self.storage.action_storage_migrate() + self.assertEqual( + file_02.storage_id, self.storage, "File should be in the storage" + ) + self.assertEqual( + file_02.storage_id.save_type, "attachment", "Storage should be attachment" + ) + self.assertEqual( + file_02.save_type, "database", "File savetype should be database" + ) + self.assertEqual( + file_03.storage_id, self.storage, "File should be in the storage" + ) + self.assertEqual( + file_03.storage_id.save_type, "attachment", "Storage should be attachment" + ) + self.assertEqual( + file_03.save_type, "database", "File savetype should be database" + ) diff --git a/dms/tools/__init__.py b/dms/tools/__init__.py new file mode 100644 index 00000000..1f48df09 --- /dev/null +++ b/dms/tools/__init__.py @@ -0,0 +1 @@ +from . import file diff --git a/dms/tools/file.py b/dms/tools/file.py new file mode 100644 index 00000000..3f3bce3f --- /dev/null +++ b/dms/tools/file.py @@ -0,0 +1,103 @@ +# Copyright 2020 Antoni Romera +# Copyright 2017-2019 MuK IT GmbH +# Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +import mimetypes +import os +import re +import shutil +import tempfile + +from odoo.tools.mimetypes import guess_mimetype + + +def check_name(name): + """ + Check if a file name is valid. + + :param str name: The file name to check. + :return: True if the file name is valid, False otherwise. + :rtype: bool + """ + tmp_dir = tempfile.mkdtemp() + try: + open(os.path.join(tmp_dir, name), "a").close() + except OSError: + return False + finally: + shutil.rmtree(tmp_dir) + return True + + +def compute_name(name, suffix, escape_suffix): + """ + Compute a new name by adding a suffix to the original name. + + :param str name: The original name. + :param int suffix: The suffix to add. + :param bool escape_suffix: If True, the suffix is added in between the name and + the file extension. + :return: The new name. + :rtype: str + """ + if escape_suffix: + name, extension = os.path.splitext(name) + return f"{name}({suffix}){extension}" + + return f"{name}({suffix})" + + +def unique_name(name, names, escape_suffix=False): + """ + Generate a unique name by adding a suffix to the original name. + + :param str name: The original name. + :param list names: The list of existing names. + :param bool escape_suffix: If True, the suffix is added in between the name and + the file extension. + :return: The unique name. + :rtype: str + """ + if name not in names: + return name + + # Extract the suffix from the name + # e.g: "file(1).txt" -> "1" + # "Directory (1)(2)" -> "2" + digits = re.compile(r"\((\d+)\)(\.\w+)?$") + match = digits.search(name) + suffix = 1 + if match: + suffix = int(match.group(1)) + 1 + # get the name without the suffix and append the extension + name = name[: match.span()[0]] + (match.group(2) or "") + + name = compute_name(name, suffix, escape_suffix) + while name in names: + # has to check recursively if the new name is unique because the user can + # rename the file with suffix n+1 + # and then duplicate the file n, leading to a new file with suffix n+1 which + # is already used. + return unique_name(name, names, escape_suffix) + return name + + +def guess_extension(filename=None, mimetype=None, binary=None): + """ + Guess the extension of a file. + + :param str filename: The name of the file. + :param str mimetype: The mimetype of the file. + :param str binary: The binary content of the file. + + :return: The extension of the file. + :rtype: str + """ + extension = filename and os.path.splitext(filename)[1][1:].strip().lower() + if not extension and mimetype and mimetype != "application/x-empty": + extension = mimetypes.guess_extension(mimetype)[1:].strip().lower() + if not extension and binary: + mimetype = guess_mimetype(binary, default="") + extension = mimetypes.guess_extension(mimetype)[1:].strip().lower() + return extension diff --git a/dms/views/dms_access_groups_views.xml b/dms/views/dms_access_groups_views.xml new file mode 100644 index 00000000..7d501acd --- /dev/null +++ b/dms/views/dms_access_groups_views.xml @@ -0,0 +1,112 @@ + + + + + dms_access_groups.list + dms.access.group + + + + + + + + + + + + + dms_access.group.form + dms.access.group + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + Access Groups + dms.access.group + list,form + + +
diff --git a/dms/views/dms_category.xml b/dms/views/dms_category.xml new file mode 100644 index 00000000..ce1e8dc1 --- /dev/null +++ b/dms/views/dms_category.xml @@ -0,0 +1,110 @@ + + + + + dms_category.search + dms.category + + + + + + + + + dms_category.list + dms.category + + + + + + + + + + dms_category.form + dms.category + +
+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Categories + dms.category + list,form + {'search_default_all': 1} + +

+ Create a new Category. +

+

+ Categories are used to categorize Documents. +

+
+
+ diff --git a/dms/views/dms_directory.xml b/dms/views/dms_directory.xml new file mode 100644 index 00000000..4d048a53 --- /dev/null +++ b/dms/views/dms_directory.xml @@ -0,0 +1,727 @@ + + + + + Subdirectories + dms.directory + kanban,list,form + + [ + ("is_hidden", "=", False), + ] + + + { + 'default_parent_id': active_id, + 'searchpanel_default_parent_id': active_id + } + + +

+ Click to add a new directory. +

+

+ Directories can be used to structure and organize + files directly in Odoo. +

+
+
+ + Files + dms.file + kanban,list,graph,pivot,form + + [ + ("is_hidden", "=", False), + ] + + + { + 'default_directory_id': active_id, + 'searchpanel_default_directory_id': active_id + } + + +

+ Click to add a new file. +

+

+ Files are used to save content directly in Odoo. +

+
+
+ + Subdirectories + dms.directory + kanban,list,form + + [ + ("parent_id", "child_of", active_id), + ("is_hidden", "=", False), + ("id", "!=", active_id), + ] + + + { + 'default_parent_id': active_id, + } + + +

+ Click to add a new directory. +

+

+ Directories can be used to structure and organize + files directly in Odoo. +

+
+
+ + Files + dms.file + kanban,list,graph,pivot,form + + [ + ("is_hidden", "=", False), + ] + + + { + 'default_directory_id': active_id, + 'searchpanel_default_directory_id': active_id + } + + +

+ Click to add a new file. +

+

+ Files are used to save content directly in Odoo. +

+
+
+ + dms_directory.search + dms.directory + + + + + + + + + + + + + + + + + + + + + + + + + + dms_directory.kanban + dms.directory + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+
+ + + + +
+
+
+ +
+
+
+ +
+
+
+ Icon +
+
+ + + +
+
+ +
+
+
+
+
+
+ + dms_directory.list + dms.directory + + + + + + + + + + + + + dms_directory.form + dms.directory + +
+
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + Directories + dms.directory + kanban,list,form + [("is_hidden", "=", False)] + +

+ Add a new Directory. +

+

+ Directories can be used to structure and organize + files directly in Odoo. +

+
+
+ + dms_directory.form + dms.directory + + primary + + + 1 + + + 1 + + + 1 + + + 1 + + + + + + + + + + + + + + +
+
+
+
+
+
+ + New Root Directory + dms.directory + form + new + + + diff --git a/dms/views/dms_file.xml b/dms/views/dms_file.xml new file mode 100644 index 00000000..ed44ad57 --- /dev/null +++ b/dms/views/dms_file.xml @@ -0,0 +1,638 @@ + + + + + dms_file.search + dms.file + + + + + + + + + + + + + + + + + + + + + + + + + + dms_file.kanban + dms.file + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ + Icon + +
+
+ + + +
+
+
+ + + + +
+
+
+
+
+ + + + + + + dms_file.kanban.wizard.selection + dms.file + + 9999 + primary + + + + o_kanban_mobile mk_file_kanban_view + + +
+ + + + + dms_file.list + dms.file + + + + + + + + + + + + + + + + + + dms_file.graph + dms.file + + + + + + + + + dms_file.pivot + dms.file + + + + + + + + + + dms_file.form + dms.file + +
+
+
+ + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + Files + dms.file + kanban,list,graph,pivot,form + [("is_hidden", "=", False)] + +

+ Add a new File. +

+

+ Files are used to save content directly in Odoo. +

+
+
+ + + Files + dms.file + new + kanban + {'create': False} + + + + dms_file.search + dms.file + + + + + + + + + + + + + + + dms_file.list + dms.file + + + + + + + + + + + + + + + Files + dms.file + list + + [('require_migration', '=', True), '|', ('active', '=', False), ('active', '!=', False)] + + {'search_default_group_storage': 1} + + +

+ Add a new File. +

+

+ Files are used to save content directly in Odoo. +

+
+
+ + dms_file.form + dms.file + + primary + + + 1 + + + 1 + +
+
+
+
+
+
+ + New Root Directory + dms.file + form + new + + + + Move + + + + list + code + + action = model.action_wizard_dms_file_move() + + + diff --git a/dms/views/dms_tag.xml b/dms/views/dms_tag.xml new file mode 100644 index 00000000..663a2bae --- /dev/null +++ b/dms/views/dms_tag.xml @@ -0,0 +1,151 @@ + + + + + dms_tag.search + dms.tag + + + + + + + + + + + + + dms_tag.kanban + dms.tag + + + + +
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+
+ + dms_tag.list + dms.tag + + + + + + + + + + dms_tag.form + dms.tag + +
+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + Tags + dms.tag + kanban,list,form + {'search_default_group_by_category': 1} + +

+ Click to create a new tag. +

+

+ Tags are used to categorize Documents. +

+
+
+ diff --git a/dms/views/menu.xml b/dms/views/menu.xml new file mode 100644 index 00000000..2b70c2c5 --- /dev/null +++ b/dms/views/menu.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/dms/views/res_config_settings.xml b/dms/views/res_config_settings.xml new file mode 100644 index 00000000..f9f0484c --- /dev/null +++ b/dms/views/res_config_settings.xml @@ -0,0 +1,56 @@ + + + + + res.config.settings.view.form.inherit.dms + res.config.settings + + + + + + + + + + + + + +
+ +
+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +º + + Storages + dms.storage + list,form + +

+ Create a new Storage object. +

+

+ Storages are used to configure your Documents. +

+
+
+ + dms_storage.form + dms.storage + + primary + + + 1 + + + 1 + +
+
+
+
+
+
+ + New Storage + dms.storage + form + new + + +
diff --git a/dms/wizards/__init__.py b/dms/wizards/__init__.py new file mode 100644 index 00000000..8f4a16b6 --- /dev/null +++ b/dms/wizards/__init__.py @@ -0,0 +1,2 @@ +from . import wizard_dms_file_move +from . import wizard_dms_share diff --git a/dms/wizards/wizard_dms_file_move.py b/dms/wizards/wizard_dms_file_move.py new file mode 100644 index 00000000..53109b58 --- /dev/null +++ b/dms/wizards/wizard_dms_file_move.py @@ -0,0 +1,25 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class WizardDmsFileMove(models.TransientModel): + _name = "wizard.dms.file.move" + _description = "Wizard Dms File Move" + + count_files = fields.Integer(readonly=True) + directory_id = fields.Many2one( + comodel_name="dms.directory", required=True, string="Directory" + ) + + @api.model + def default_get(self, fields): + vals = super().default_get(fields) + if self.env.context.get("active_ids"): + vals.update({"count_files": len(self.env.context.get("active_ids"))}) + return vals + + def process(self): + items = self.env["dms.file"].browse(self.env.context.get("active_ids")) + items.write({"directory_id": self.directory_id}) diff --git a/dms/wizards/wizard_dms_file_move_views.xml b/dms/wizards/wizard_dms_file_move_views.xml new file mode 100644 index 00000000..127d7b8b --- /dev/null +++ b/dms/wizards/wizard_dms_file_move_views.xml @@ -0,0 +1,41 @@ + + + + + wizard.dms.file.move.form + wizard.dms.file.move + +
+ + + + + +
+
+ +
+
+ + Move files + wizard.dms.file.move + form + new + +
diff --git a/dms/wizards/wizard_dms_share.py b/dms/wizards/wizard_dms_share.py new file mode 100644 index 00000000..c36a3c94 --- /dev/null +++ b/dms/wizards/wizard_dms_share.py @@ -0,0 +1,19 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, models + + +class WizardDmsShare(models.TransientModel): + _name = "wizard.dms.share" + _inherit = "portal.share" + _description = "Wizard for sharing DMS records" + + @api.model + def _selection_target_model(self): + return [ + (model.model, model.name) + for model in self.env["ir.model"] + .sudo() + .search([("model", "in", ("dms.directory", "dms.file"))]) + ] diff --git a/dms/wizards/wizard_dms_share_views.xml b/dms/wizards/wizard_dms_share_views.xml new file mode 100644 index 00000000..affae078 --- /dev/null +++ b/dms/wizards/wizard_dms_share_views.xml @@ -0,0 +1,28 @@ + + + + wizard.dms.share.form + wizard.dms.share + + primary + + + 1 + + + + + Share + wizard.dms.share + + form + new + + + Share + wizard.dms.share + + form + new + + diff --git a/docx_report/README.md b/docx_report/README.md new file mode 100644 index 00000000..de948180 --- /dev/null +++ b/docx_report/README.md @@ -0,0 +1,101 @@ +# DOCX-шаблоны +name: docx_report +version: 19.0.1.0.0 +author: Mk.Lab + +### 1. Общее описание + +Модуль добавляет в Odoo систему DOCX-шаблонов для печати документов. Вместо стандартных HTML-отчётов пользователь загружает файл `.docx` с разметкой переменных — и система формирует готовый документ Word, подставляя данные из карточки записи. + +Модуль расширяет возможности базового `docx_report_generation`: добавляет интерфейс управления шаблонами, валидацию, кастомные переменные и привязку шаблонов к моделям. + +### 2. Установка + +1. Убедитесь что установлены модули `docx_report_generation`, `account`, `sale`, `l10n_ru_contract` + +2. Установите Python-пакеты: `pip install docxtpl docxcompose beautifulsoup4` + +3. Скопируйте папку `docx_report` в директорию `addons` + +4. Перезапустите сервер Odoo + +5. Обновите список приложений: **Настройки → Приложения → Обновить список** + +6. Найдите модуль **«DOCX Templates»** и установите + +### 3. Функциональность + +3.1 Основные возможности: + +- Загрузка `.docx`-файла как шаблона отчёта для любой модели Odoo +- Подстановка данных из записи через переменные `{{ object.field }}` +- Условные конструкции `{% if %}` и циклы `{% for %}` в шаблоне +- Кастомные переменные с произвольными Python-выражениями +- Валидация шаблона: проверка синтаксиса и существования полей модели +- Подсказки доступных полей выбранной модели прямо в форме шаблона +- Привязка шаблона к форме записи через меню печати + +3.2 Синтаксис шаблона: + +| Конструкция | Пример | Описание | +|---|---|---| +| Переменная | `{{ object.name }}` | Значение поля записи | +| Связанное поле | `{{ object.partner_id.name }}` | Поле через Many2one | +| Условие | `{% if object.amount > 0 %}...{% endif %}` | Условный вывод | +| Цикл | `{% for line in object.line_ids %}...{% endfor %}` | Перебор строк | +| Кастомная переменная | `{{ my_var }}` | Переменная из вкладки «Кастомные переменные» | +| Дата | `{{ time.strftime('%d.%m.%Y') }}` | Текущая дата | + +3.3 Меню: + +В главном меню появляется пункт **«Шаблоны для отчетов»** — список всех DOCX-шаблонов. + +![img_1.png](img_1.png) + +## Как это выглядит в интерфейсе + +Форма шаблона содержит основные поля, кнопку **«Валидация»** и две вкладки: **«Кастомные переменные»** и **«Доступные переменные»**. + +![img_2.png](img_2.png) + +После привязки шаблона к модели в меню **⚙️ Печать** записи появляется дополнительный пункт с именем шаблона. + +![img_3.png](img_3.png) + +### Пример использования + +### Создать шаблон + +Перейдите в меню **«Шаблоны для отчетов»**, нажмите **Создать**. Укажите название, загрузите `.docx`-файл, выберите модель документа. + +![img_4.png](img_4.png) + +### Проверить доступные поля + +На вкладке **«Доступные переменные»** выберите модель для подсказки — отобразится список всех полей с техническими именами и типами. Используйте их при создании шаблона. + +![img_5.png](img_5.png) + +### Добавить кастомную переменную (если нужно) + +На вкладке **«Кастомные переменные»** добавьте переменную: укажите техническое имя и Python-выражение для вычисления значения. + +![img_6.png](img_6.png) + +### Проверить шаблон + +Нажмите кнопку **«Валидация»** в шапке формы. Система проверит синтаксис и существование всех полей в шаблоне, отобразит результат. + +![img_7.png](img_7.png) + +### Привязать шаблон к модели + +Нажмите кнопку **«Добавить печать в действия»** — шаблон появится в меню ⚙️ Печать для записей выбранной модели. + +![img_8.png](img_8.png) + +### Распечатать документ + +Откройте нужную запись (договор, заказ и т.д.) → меню **⚙️ Печать** → выберите название шаблона. Файл `.docx` скачается автоматически. + +![img_9.png](img_9.png) diff --git a/docx_report/TECHNICAL.md b/docx_report/TECHNICAL.md new file mode 100644 index 00000000..d312f580 --- /dev/null +++ b/docx_report/TECHNICAL.md @@ -0,0 +1,185 @@ +# DOCX-шаблоны +name: docx_report +version: 19.0.1.0.0 +author: MK.Lab +depends: `base`, `account`, `sale`, `l10n_ru_contract`, `docx_report_generation` +external_dependencies: `docxtpl`, `docxcompose`, `bs4` + +## Архитектура + +Модуль надстраивается над `docx_report_generation` и добавляет интерфейс управления шаблонами. Ключевая модель `docx.template` наследует технические поля в `ir.actions.report` через `_inherits`. + +``` +docx_report +├── docx.template — шаблон (наследует ir.actions.report через _inherits) +├── docx.custom.field — кастомные переменные шаблона +├── docx.template.mixin — AbstractModel для привязки шаблона к модели +├── ir.actions.report — расширение: рендер DOCX, кастомные переменные, валидация +├── ir.model — расширение: display_name в контексте docx_template +├── ir.model.fields — расширение: вычисляемый тип поля для подсказки +└── DocxReportController — HTTP-контроллер: скачивание DOCX и PDF +``` + +--- + +## Модели + +### `docx.template` — Шаблон + +**Файл:** `models/docx_template.py` + +Использует `_inherits = {"ir.actions.report": "report_id"}` — все технические поля (`name`, `model`, `report_type`, `report_docx_template`) берутся из связанного `ir.actions.report`. + +| Поле | Тип | Описание | +|---|---|---| +| `report_id` | Many2one → `ir.actions.report` (required, cascade) | Связанное действие отчёта | +| `filename_pattern` | Char | Python-выражение для имени скачиваемого файла (без расширения). Переменные: `object`, `time` | +| `docx_output_type` | Selection (`docx`) | Формат вывода | +| `docx_model_id` | Many2one → `ir.model` | Модель документа (устанавливает `model` в `ir.actions.report`) | +| `available_field_ids` | Many2many → `ir.model.fields` (computed) | Доступные поля модели | +| `global_template` | Boolean (default: True) | Глобальный шаблон — доступен для всех записей модели | +| `hint_model_id` | Many2one → `ir.model` | Модель для подсказки полей | +| `report_docx_template_filename` | Char | Имя загруженного файла шаблона | + +#### Методы + +**`_compute_available_field_ids()`** — вычисляет список полей модели для вкладки «Доступные переменные». + +**`create()` / `write()`** — при сохранении синхронизируют `docx_output_type` → `report_type` (`docx` → `docx-docx`) и `docx_model_id` → `model` в связанном `ir.actions.report`. + +**`action_bind_to_actions()`** — создаёт `binding` для отображения шаблона в меню. + +**`action_unbind_from_actions()`** — удаляет привязку через `unlink_action()`. + +**`action_bind_all_to_actions()`** — добавляет в меню печати все шаблоны сразу. + +**`action_validate_docx_template()`** — валидирует загруженный шаблон: +1. Распаковывает `.docx` как ZIP, читает XML-файлы внутри `word/` +2. Извлекает все выражения `{{ }}` и переменные циклов `{% for %}` +3. Для каждого выражения разбирает цепочку полей и проверяет их существование через `self.env[model_name]._fields` +4. Возвращает уведомление: успех или список неизвестных переменных + +--- + +### `docx.custom.field` — Кастомная переменная + +**Файл:** `models/docx_custom_field.py` + +| Поле | Тип | Описание | +|---|---|---| +| `report_id` | Many2one → `ir.actions.report` (required, cascade) | Основной отчёт | +| `technical_name` | Char (required) | Имя переменной в шаблоне | +| `name` | Char (required) | Отображаемое название | +| `value_python` | Text (required) | Python-выражение. Контекст: `env`, `user`, `record`, `docs`, `time`, `context` | + +--- + +### `docx.template.mixin` — Миксин + +**Файл:** `models/docx_template_mixin.py` + +Добавляет поле `docx_template_id` (Many2one → `docx.template`) в любую модель. Используется для хранения шаблона по умолчанию для конкретного объекта (например, вид договора → шаблон). + +--- + +### `ir.actions.report` — Расширение + +**Файл:** `models/ir_actions_report.py` + +Добавляет поля и реализует рендер DOCX. + +| Поле | Тип | Описание | +|---|---|---| +| `docx_custom_field_ids` | One2many → `docx.custom.field` | Кастомные переменные | +| `report_docx_template` | Binary | Загруженный `.docx`-файл шаблона | +| `report_type` | Selection (расширение) | Добавлен тип `docx-docx` | +| `report_name` | Char (computed) | Формат: `{model}-docx_report+{id}` для DOCX-отчётов | + +#### Метод `_render_docx_template(template, values)` + +Основной метод рендеринга. Последовательность: + +1. Формирует базовый контекст: `record`, `time`, `user`, `res_company`, `web_base_url`, `website` +2. Вычисляет кастомные переменные через `safe_eval` и добавляет их в контекст +3. Рендерит шаблон через `DocxTemplate` (библиотека `docxtpl`) +4. Возвращает `BytesIO` с готовым DOCX + +#### Метод `_render_docx_docx(res_ids, data)` + +Оркестрирует рендер для списка записей: поддерживает кэш вложений, рендерит по одной записи, объединяет через `_merge_docx()` если несколько. + +#### Метод `_merge_docx(streams)` + +Объединяет несколько DOCX-файлов в один через `docxcompose.Composer` с разрывами страниц между ними. + +#### Метод `_parse_markup(markup_data)` + +Конвертирует HTML-поля Odoo в plain text для вставки в DOCX через `BeautifulSoup`. + +--- + +### `ir.model.fields` — Расширение + +**Файл:** `models/ir_model_fields.py` + +Добавляет вычисляемое поле `docx_type_label` — человекочитаемый тип поля для вкладки «Доступные переменные»: +- Many2one/One2many/Many2many: `many2one (res.partner)` +- Selection: `selection (value1, value2)` + +--- + +## HTTP-контроллер + +**Файл:** `controllers/main.py` +**Класс:** `DocxReportController` (наследует `ReportController`) + +### Маршрут `report_routes` + +Расширяет стандартный маршрут `/report///`: + +| Converter | Действие | +|---|---| +| `docx` | Вызывает `_render_docx_docx()`, возвращает DOCX с MIME-типом `application/vnd.openxmlformats-officedocument.wordprocessingml.document` | +| `pdf` (для DOCX-отчёта) | Вызывает `_render_docx_pdf()` (из `docx_report_generation`) | +| Остальные | Передаёт в родительский `ReportController` | + +### Маршрут `report_download` + +Обрабатывает скачивание файлов типов `docx-docx` и `docx-pdf`. Формирует имя файла через `_get_docx_output_filename()`: + +| Приоритет | Источник имени | +|---|---| +| 1 | `docx.template.filename_pattern` (Python-выражение) | +| 2 | `ir.actions.report.print_report_name` | +| 3 | `ir.actions.report.name` | + +--- + +## Представления и меню + +**Файл:** `views/docx_template_views.xml` + +Форма шаблона содержит: +- Кнопка **«Валидация»** в header +- Кнопки **«Добавить печать в действия»** / **«Убрать печать из действий»** в button_box +- Основные поля: название, формат, модель, файл шаблона, шаблон имени файла, флаг «Глобальный» +- Вкладка **«Кастомные переменные»** — список `docx_custom_field_ids` +- Вкладка **«Доступные переменные»** — readonly список полей модели с техническим именем, названием и типом + +Пункт меню **«Шаблоны для отчетов»** добавляется в корень главного меню. + +--- + +## Безопасность + +**Файл:** `security/ir.model.access.csv` + +CRUD-права на `docx.template` и `docx.custom.field` для стандартных групп пользователей. + +--- + +## Тесты + +**Файл:** `tests/test_docx.py` + +Покрывает создание шаблона, валидацию, рендер DOCX для тестовой модели. diff --git a/docx_report/__init__.py b/docx_report/__init__.py new file mode 100644 index 00000000..38718f08 --- /dev/null +++ b/docx_report/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import controllers \ No newline at end of file diff --git a/docx_report/__manifest__.py b/docx_report/__manifest__.py new file mode 100644 index 00000000..7f537c2c --- /dev/null +++ b/docx_report/__manifest__.py @@ -0,0 +1,29 @@ +{ + "name": "DOCX Templates", + "summary": "DOCX-шаблоны", + "version": "19.0.1.0.0", + "license": "LGPL-3", + "category": "Accounting/Localizations", + "depends": [ + "base", + "account", + "sale", + "l10n_ru_contract", + ], + "data": [ + "security/ir.model.access.csv", + "views/docx_template_views.xml", + "views/docx_report.xml", + "data/docx_template.xml", + ], + "demo": [ + "demo/demo.xml", + ], + "assets": { + "web.assets_backend": [ + "docx_report/static/src/js/contract_docx_print_menu.js", + "docx_report/static/src/js/action_manager_report.js", + ], + }, + "installable": True, +} diff --git a/docx_report/controllers/__init__.py b/docx_report/controllers/__init__.py new file mode 100644 index 00000000..12a7e529 --- /dev/null +++ b/docx_report/controllers/__init__.py @@ -0,0 +1 @@ +from . import main diff --git a/docx_report/controllers/main.py b/docx_report/controllers/main.py new file mode 100644 index 00000000..98e31f0c --- /dev/null +++ b/docx_report/controllers/main.py @@ -0,0 +1,221 @@ +from json import dumps as json_dumps, loads as json_loads +from werkzeug.urls import url_decode +import re + +from odoo.http import ( + content_disposition, + request, + route, + serialize_exception as _serialize_exception, +) +from odoo.tools import html_escape +from odoo.tools.safe_eval import safe_eval, time + +from odoo.addons.web.controllers.report import ReportController + +import logging +_logger = logging.getLogger(__name__) + +class DocxReportController(ReportController): + + def _prepare_docx_report_context(self, docids, data): + """ + По сути дублирует сбор контекста и docids в части базового report_routes. Новая логика непосредственно в переопределенном report_routes. + Возможно есть и более изящный способ. + """ + context = dict(request.env.context) + payload = {} + docids_list = [int(i) for i in docids.split(",")] if docids else [] + if data.get("options"): + payload.update(json_loads(data.pop("options"))) + if data.get("context"): + payload["context"] = json_loads(data["context"]) + if payload["context"].get("lang") and not payload.get("force_context_lang"): + del payload["context"]["lang"] + context.update(payload["context"]) + return context, payload, docids_list + + def _get_docx_report_from_name(self, reportname): + template = request.env["docx.template"].search([("report_name", "=", reportname)], limit=1) + if template: + return template.report_id + return request.env["ir.actions.report"]._get_report_from_name(reportname) + + @route() + def report_routes(self, reportname, docids=None, converter=None, **data): + """ + Расширенный маршрут `/report///` + Добавлена поддержка: + - converter=docx → генерация DOCX + - converter=pdf → конвертация DOCX → PDF (Gotenberg) + """ + _logger.info("[ROUTE] report_routes() called: reportname=%s converter=%s docids=%s", + reportname, converter, docids) + + context, payload, docids_list = self._prepare_docx_report_context(docids, data) + + report = self._get_docx_report_from_name(reportname) + + # ----------------------- + # 1) DOCX генерация + # ----------------------- + if converter == "docx": + _logger.info("[ROUTE] DOCX branch for report=%s", reportname) + + docx_result = report.with_context(context)._render_docx_docx( + docids_list, data=payload + ) + # _render_docx_docx returns (bytes, "docx") tuple + docx_bytes = docx_result[0] if isinstance(docx_result, tuple) else docx_result + headers = [ + ( + "Content-Type", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + ), + ] + return request.make_response(docx_bytes, headers=headers) + + # ----------------------- + # 2) PDF генерация из DOCX + # ----------------------- + if converter == "pdf" and "docx" in (report.report_type or ""): + _logger.info("[ROUTE] PDF branch for report=%s docids=%s", reportname, docids_list) + + pdf_result = report.with_context(context)._render_docx_pdf( + docids_list, data=payload + ) + + # Может быть либо bytes, либо (bytes, ext) + if isinstance(pdf_result, tuple): + pdf_content = pdf_result[0] + else: + pdf_content = pdf_result + + headers = [ + ("Content-Type", "application/pdf"), + ("Content-Length", len(pdf_content)), + ] + return request.make_response(pdf_content, headers=headers) + + return super().report_routes( + reportname, docids, converter, **data + ) + + def _get_docx_output_filename(self, report, docids, extension): + """ + Возвращает финальное имя файла для скачивания DOCX. + + Приоритет: + 1) docx.template.filename_pattern (если существует docx.template) + 2) report.print_report_name (как fallback, если оно всё же задано) + 3) report.name + + Ожидается, что выражение возвращает строку БЕЗ расширения (.docx). + """ + filename = "%s.%s" % (report.name, extension) + + template = request.env["docx.template"].sudo().search( + [("report_id", "=", report.id)], limit=1 + ) + + pattern = None + if template and template.filename_pattern: + pattern = template.filename_pattern + elif report.print_report_name: + pattern = report.print_report_name + + if not pattern or not docids: + return filename + + ids = [int(x) for x in docids.split(",") if x.isdigit()] + if len(ids) != 1: + return filename + + obj = request.env[report.model].browse(ids) + + try: + report_name = safe_eval( + pattern, + {"object": obj, "time": time}, + ) + except Exception as e: + return filename + + if not isinstance(report_name, str): + return filename + + clean = report_name.strip() + if not clean: + return filename + + clean = re.sub(r"\.(docx?|pdf)$", "", clean, flags=re.IGNORECASE) + + return "%s.%s" % (clean, extension) + + @route() + def report_download(self, data, context=None, token=None, readonly=True): + """ + Обрабатывает запрос на скачивание файла отчета. + Расширен для: + - docx-docx (DOCX) + - docx-pdf (PDF из DOCX) + """ + _logger.info("[REPORT DOWNLOAD] data=%s, token=%s", data, token) + + requestcontent = json_loads(data) + url, type_ = requestcontent[0], requestcontent[1] + + try: + if type_ in ["docx-docx", "docx-pdf"]: + converter = "docx" if type_ == "docx-docx" else "pdf" + extension = "docx" if type_ == "docx-docx" else "pdf" + + pattern = "/report/%s/" % ("docx" if type_ == "docx-docx" else "pdf") + reportname = url.split(pattern)[1].split("?")[0] + + docids = None + if "/" in reportname: + reportname, docids = reportname.split("/") + + _logger.info( + "[REPORT DOWNLOAD] type=%s converter=%s extension=%s reportname=%s docids=%s", + type_, converter, extension, reportname, docids, + ) + + if docids: + response = self.report_routes( + reportname, docids=docids, converter=converter, context=context + ) + + else: + query_data = {} + if "?" in url: + query_data = dict(url_decode(url.split("?")[1]).items()) + + if "context" in query_data: + base_ctx = json_loads(context or "{}") if context else {} + data_context = json_loads(query_data.pop("context")) + context = json_dumps({**base_ctx, **data_context}) + + response = self.report_routes( + reportname, converter=converter, context=context, **query_data + ) + + report = self._get_docx_report_from_name(reportname) + filename = self._get_docx_output_filename(report, docids, extension) + + response.headers.add( + "Content-Disposition", content_disposition(filename) + ) + return response + + else: + return super().report_download( + data, context=context, token=token, readonly=readonly + ) + + except Exception as e: + _logger.exception("[REPORT DOWNLOAD] ERROR: %s", e) + se = _serialize_exception(e) + error = {"code": 200, "message": "Odoo Server Error", "data": se} + return request.make_response(html_escape(json_dumps(error))) diff --git a/docx_report/data/docx_template.xml b/docx_report/data/docx_template.xml new file mode 100644 index 00000000..e370ee3f --- /dev/null +++ b/docx_report/data/docx_template.xml @@ -0,0 +1,58 @@ + + + + + + + Контракт с клиентом + docx-docx + partner.contract.customer + docx + + + object.name or 'contract' + + contract.docx + + + + + Универсальный передаточный документ(УПД) DOCX + docx-docx + account.move + docx + + + object.name or 'upd' + + report_account_invoice_upd_new_templates.docx + + + + + УПД без печатей DOCX + docx-docx + account.move + docx + + + object.name or 'updn' + + report_account_invoice_updn_templates.docx + + + + + Счет по форме 1С DOCX + docx-docx + sale.order + docx + + + object.name or 'sale_order' + + report_saleorder_new_template.docx + + + + diff --git a/docx_report/demo/demo.xml b/docx_report/demo/demo.xml new file mode 100644 index 00000000..4ece8750 --- /dev/null +++ b/docx_report/demo/demo.xml @@ -0,0 +1,18 @@ + + + + + + + + Печать договора + docx-docx + account.move + docx + + + object.name or 'contract' + + + + diff --git a/docx_report/img_1.png b/docx_report/img_1.png new file mode 100644 index 00000000..3b4e3dbf Binary files /dev/null and b/docx_report/img_1.png differ diff --git a/docx_report/img_2.png b/docx_report/img_2.png new file mode 100644 index 00000000..457e5c43 Binary files /dev/null and b/docx_report/img_2.png differ diff --git a/docx_report/img_3.png b/docx_report/img_3.png new file mode 100644 index 00000000..a8754316 Binary files /dev/null and b/docx_report/img_3.png differ diff --git a/docx_report/img_4.png b/docx_report/img_4.png new file mode 100644 index 00000000..4e75922f Binary files /dev/null and b/docx_report/img_4.png differ diff --git a/docx_report/img_5.png b/docx_report/img_5.png new file mode 100644 index 00000000..10a03837 Binary files /dev/null and b/docx_report/img_5.png differ diff --git a/docx_report/img_6.png b/docx_report/img_6.png new file mode 100644 index 00000000..a2d49fae Binary files /dev/null and b/docx_report/img_6.png differ diff --git a/docx_report/img_7.png b/docx_report/img_7.png new file mode 100644 index 00000000..e55290c4 Binary files /dev/null and b/docx_report/img_7.png differ diff --git a/docx_report/img_8.png b/docx_report/img_8.png new file mode 100644 index 00000000..32cd1a85 Binary files /dev/null and b/docx_report/img_8.png differ diff --git a/docx_report/img_9.png b/docx_report/img_9.png new file mode 100644 index 00000000..1b11f5b0 Binary files /dev/null and b/docx_report/img_9.png differ diff --git a/docx_report/models/__init__.py b/docx_report/models/__init__.py new file mode 100644 index 00000000..bcb49838 --- /dev/null +++ b/docx_report/models/__init__.py @@ -0,0 +1,6 @@ +from . import docx_template +from . import ir_model +from . import ir_actions_report +from . import docx_custom_field +from . import ir_model_fields +from . import docx_template_mixin \ No newline at end of file diff --git a/docx_report/models/docx_custom_field.py b/docx_report/models/docx_custom_field.py new file mode 100644 index 00000000..c79b2b36 --- /dev/null +++ b/docx_report/models/docx_custom_field.py @@ -0,0 +1,41 @@ +from odoo import api, fields, models, _ + + +class DocxCustomField(models.Model): + _name = "docx.custom.field" + _description = "Кастомная переменная для DOCX-шаблона" + + report_id = fields.Many2one( + "ir.actions.report", + string="DOCX-отчёт", + required=True, + ondelete="cascade", + ) + + technical_name = fields.Char( + string="Техническое имя", + required=True, + help="Имя переменной, используемое в шаблоне", + ) + + name = fields.Char( + string="Название", + required=True, + help="Имя для интерфейса.", + ) + + value_python = fields.Text( + string="Значение (Python)", + required=True, + help=( + "Python-выражение, которое будет вычислено в контексте отчёта.\n" + ), + ) + + _sql_constraints = [ + ( + "uniq_report_technical_name", + "unique(report_id, technical_name)", + "Техническое имя кастомной переменной должно быть уникально в рамках одного отчёта.", + ) + ] diff --git a/docx_report/models/docx_template.py b/docx_report/models/docx_template.py new file mode 100644 index 00000000..9a2c4b2a --- /dev/null +++ b/docx_report/models/docx_template.py @@ -0,0 +1,341 @@ +import re +import zipfile +from io import BytesIO +from base64 import b64decode + +from logging import getLogger + +_logger = getLogger(__name__) + + +from odoo import _, api, fields, models +from odoo.exceptions import UserError + +class DocxTemplate(models.Model): + """ + Высокоуровневый DOCX-шаблон договора. + + Все технические поля (name, report_type, model, + report_docx_template, print_report_name и т.д.) + берём напрямую из ir.actions.report через _inherits. + """ + _name = "docx.template" + _description = "DOCX-шаблон договора" + _inherits = {"ir.actions.report": "report_id"} + + report_id = fields.Many2one( + "ir.actions.report", + string="Действие отчёта", + required=True, + ondelete="cascade", + ) + + filename_pattern = fields.Char( + string="Шаблон имени файла", + help=( + "Python-выражение, вычисляемое при скачивании DOCX.\n" + "Должно вернуть строку БЕЗ расширения.\n" + "Доступные переменные:\n" + " - object: запись, для которой печатается отчёт\n" + " - time: модуль time из Python" + ), + ) + + docx_output_type = fields.Selection( + selection=[ + ("docx", "DOCX"), + ], + string="Формат вывода", + default="docx", + required=True, + ) + + docx_model_id = fields.Many2one( + "ir.model", + string="Модель документа", + ondelete="set null" + ) + + available_field_ids = fields.Many2many( + "ir.model.fields", + string="Доступные поля (подсказка)", + compute="_compute_available_field_ids", + readonly=True, + ) + + global_template = fields.Boolean( + string="Глобальный", + default=True, + help="Если включено, шаблон доступен глобально", + ) + + report_docx_template_filename = fields.Char( + string="Имя файла шаблона", + help="Имя загруженного DOCX-шаблона. Не влияет на имя выводимого файла.", + ) + + hint_model_id = fields.Many2one( + "ir.model", + string="Модель для подсказки полей", + help=( + "Используется только как подсказка при создании шаблона.\n" + "На реальную модель отчёта не влияет." + ), + ) + + def action_bind_to_actions(self): + """Создать contextual action (binding) для каждого шаблона.""" + for template in self: + template.report_id.create_action() + return True + + def action_bind_all_to_actions(self): + """Добавить в печать действия все шаблоны сразу.""" + templates = self.search([]) + for template in templates: + template.report_id.create_action() + return { + "type": "ir.actions.client", + "tag": "display_notification", + "params": { + "title": _("Готово"), + "message": _("Все шаблоны (%d) добавлены в действия печати.") % len(templates), + "type": "success", + "sticky": False, + }, + } + + def action_unbind_from_actions(self): + """Удалить contextual action (binding) для каждого шаблона.""" + for template in self: + template.report_id.unlink_action() + return True + + + @api.depends("hint_model_id", "docx_model_id") + def _compute_available_field_ids(self): + """ + Это всего лишь подсказка для конструктора шаблонов. + + Берём поля: + - в первую очередь для hint_model_id + - если hint_model_id не задана — для docx_model_id + """ + Fields = self.env["ir.model.fields"] + for rec in self: + model_rec = rec.hint_model_id or rec.docx_model_id + if model_rec: + rec.available_field_ids = Fields.search( + [("model_id", "=", model_rec.id)], + order="name", + ) + else: + rec.available_field_ids = Fields.browse() + + @api.model_create_multi + def create(self, vals_list): + for vals in vals_list: + output_type = vals.get("docx_output_type") + if output_type and not vals.get("report_type"): + if output_type == "docx": + vals["report_type"] = "docx-docx" + elif output_type == "pdf": + vals["report_type"] = "docx-pdf" + elif output_type == "docx_pdf": + vals["report_type"] = "docx-docx" + + model_id = vals.get("docx_model_id") + if model_id and not vals.get("model"): + model_rec = self.env["ir.model"].browse(model_id) + vals["model"] = model_rec.model or False + + return super().create(vals_list) + + def write(self, vals): + if "docx_output_type" in vals and "report_type" not in vals: + out = vals["docx_output_type"] + if out == "docx": + vals["report_type"] = "docx-docx" + elif out == "pdf": + vals["report_type"] = "docx-pdf" + elif out == "docx_pdf": + vals["report_type"] = "docx-docx" + + if "docx_model_id" in vals and "model" not in vals: + model_rec = self.env["ir.model"].browse(vals["docx_model_id"]) + vals["model"] = model_rec.model or False + return super().write(vals) + + def action_validate_docx_template(self): + self.ensure_one() + _logger.info("[DOCX VALIDATION] --- START ---") + + if not self.report_docx_template: + raise UserError(_("Не загружен DOCX-шаблон.")) + if not self.docx_model_id: + raise UserError(_("Заполните поле 'Модель документа'.")) + + try: + raw = b64decode(self.report_docx_template) + zf = zipfile.ZipFile(BytesIO(raw)) + except Exception as e: + raise UserError(_("Файл шаблона повреждён или не является DOCX: %s") % e) + + pattern = re.compile(r"{{\s*(.*?)\s*}}", re.DOTALL) + tag_pattern = re.compile(r"<[^>]+>") + loop_pattern = re.compile( + r"{%\s*for\s+([a-zA-Z_][a-zA-Z0-9_]*)\s+in\s+.*?%}", re.DOTALL + ) + + expressions = set() + loop_var_names = set() + + for name in zf.namelist(): + if not name.startswith("word/") or not name.endswith(".xml"): + continue + xml = zf.read(name).decode("utf-8", errors="ignore") + + for match in pattern.finditer(xml): + expr = match.group(1) + expr = tag_pattern.sub("", expr) + expr = expr.strip() + if expr: + expressions.add(expr) + + for m in loop_pattern.finditer(xml): + var_name = m.group(1) + loop_var_names.add(var_name) + + if not expressions: + return self._validation_notification( + _("В шаблоне не найдено ни одной переменной {{ }}."), "info" + ) + + allowed_roots = { + "env", "model", "record", "records", "docs", "user", + "res_company", "website", "web_base_url", "time", + "context_timestamp", "UserError", "Warning", "format_number", + } + + root_model_map = { + "record": self.docx_model_id.model, + "records": self.docx_model_id.model, + "docs": self.docx_model_id.model, + "user": "res.users", + "res_company": "res.company", + } + + custom_var_names = ( + set(self.docx_custom_field_ids.mapped("technical_name")) + if hasattr(self, "docx_custom_field_ids") + else set() + ) + + relational_types = {"many2one", "one2many", "many2many"} + missing = set() + + + func_stop_patterns = ("mapped", "filtered", "sorted", "search") + + for expr in expressions: + core = expr.split("|", 1)[0] + for sep in (" if ", " or ", " and ", " else "): + core = core.split(sep, 1)[0] + core = core.strip() + + for func in func_stop_patterns: + core = re.split(rf"\.{func}\s*\(", core)[0] + + if not core: + continue + + match = re.search(r'[a-zA-Z_][a-zA-Z0-9_.\[\]\'\"]*', core) + if not match: + continue + + token = match.group(0) + + token = re.sub(r"\['([^']+)']", r".\1", token) + token = re.sub(r'\["([^"]+)"]', r".\1", token) + + parts = token.split(".") + root = parts[0] + + if root in custom_var_names and root not in allowed_roots: + continue + if root in loop_var_names and root not in allowed_roots and root not in custom_var_names: + continue + if root not in allowed_roots: + missing.add(root) + continue + + model_name = root_model_map.get(root) + + if not model_name: + continue + + current_model = self.env[model_name] + + path = root + + for name in parts[1:]: + name_stripped = name.strip() + + if any( + name_stripped.startswith(f"{func}(") or name_stripped == func + for func in func_stop_patterns + ): + break + + if current_model is None: + break + + field = current_model._fields.get(name_stripped) + if not field: + _logger.warning( + "[DOCX VALIDATION] MISSING field: %s.%s (model=%s). " + "Available fields: %s", + path, + name_stripped, + current_model._name, + ", ".join(sorted(current_model._fields.keys())), + ) + missing.add(f"{path}.{name_stripped}") + break + + path = f"{path}.{name_stripped}" + + if field.type in relational_types and field.comodel_name: + _logger.info( + "[DOCX VALIDATION] Following relation → %s", field.comodel_name + ) + current_model = self.env[field.comodel_name] + else: + current_model = None + + _logger.info("[DOCX VALIDATION] ----- END CHECK -----") + + if missing: + _logger.warning("[DOCX VALIDATION] Missing vars: %s", missing) + text = "\n".join(sorted(missing)) + raise UserError( + _("Обнаружены неизвестные переменные или поля в шаблоне для модели '%s':\n%s") + % (self.docx_model_id.model, text) + ) + + return self._validation_notification( + _("Все переменные в шаблоне валидны для модели %s.") % self.docx_model_id.model, + "success", + ) + + def _validation_notification(self, message, type="success"): + return { + "type": "ir.actions.client", + "tag": "display_notification", + "params": { + "title": _("Валидация DOCX-шаблона"), + "message": message, + "type": type, + "sticky": False, + }, + } diff --git a/docx_report/models/docx_template_mixin.py b/docx_report/models/docx_template_mixin.py new file mode 100644 index 00000000..78945e0c --- /dev/null +++ b/docx_report/models/docx_template_mixin.py @@ -0,0 +1,13 @@ +from odoo import models, fields, _ + + +class DocxTemplateMixin(models.AbstractModel): + _name = "docx.template.mixin" + _description = "Mixin: DOCX template link" + + docx_template_id = fields.Many2one( + "docx.template", + string=_("DOCX шаблон"), + domain=[("global_template", "=", False)], + help="DOCX-шаблон, используемый по умолчанию для данного объекта.", + ) diff --git a/docx_report/models/ir_actions_report.py b/docx_report/models/ir_actions_report.py new file mode 100644 index 00000000..dd8346ab --- /dev/null +++ b/docx_report/models/ir_actions_report.py @@ -0,0 +1,348 @@ +from base64 import b64decode +from bs4 import BeautifulSoup +from collections import OrderedDict +from io import BytesIO +from logging import getLogger +from markupsafe import Markup + + +from docx import Document +from docxcompose.composer import Composer +from docxtpl import DocxTemplate + +from odoo import _, api, fields, models +from odoo.exceptions import AccessError, UserError +from odoo.http import request +from odoo.tools.safe_eval import safe_eval, time + +_logger = getLogger(__name__) + +class IrActionsReport(models.Model): + _inherit = "ir.actions.report" + + docx_custom_field_ids = fields.One2many( + "docx.custom.field", + "report_id", + string="Кастомные переменные DOCX", + ) + + report_name = fields.Char( + compute="_compute_report_name", + inverse="_inverse_report_name", + store=True, + required=False, + ) + report_type = fields.Selection( + selection_add=[("docx-docx", "DOCX")], + ondelete={"docx-docx": "cascade"}, + ) + report_docx_template = fields.Binary( + string="Файл шаблона", + ) + + @api.depends("report_type", "model") + def _compute_report_name(self): + for record in self: + if ( + record.report_type in ["docx-docx"] + and record.model + and record.id + ): + record.report_name = "%s-docx_report+%s" % (record.model, record.id) + else: + record.report_name = False + + def _inverse_report_name(self): + """TODO: write this method""" + pass + + def retrieve_attachment(self, record): + """ + Searc for existing report file in record's attachments by fields: + 1. name + 2. res_model + 3. res_id + """ + result = super().retrieve_attachment(record) + if result: + if self.report_type == "docx-docx": + result = ( + result.filtered( + lambda r: r.mimetype + == "application/vnd.openxmlformats-officedocument.wordprocessingml.document" + ) + or None + ) + return result + + @api.model + def _render_docx_docx(self, res_ids=None, data=None): + """ + Prepares the data for report file rendering, calls for the render method + and handle rendering result. + """ + if not data: + data = {} + data.setdefault("report_type", "docx") + + # access the report details with sudo() but evaluation context as current user + self_sudo = self.sudo() + + save_in_attachment = OrderedDict() + # Maps the streams in `save_in_attachment` back to the records they came from + stream_record = dict() + if res_ids: + Model = self.env[self_sudo.model] + record_ids = Model.browse(res_ids) + docx_record_ids = Model + if self_sudo.attachment: + for record_id in record_ids: + attachment = self_sudo.retrieve_attachment(record_id) + if attachment: + # stream = self_sudo._retrieve_stream_from_attachment(attachment) + stream = BytesIO(attachment.raw) + save_in_attachment[record_id.id] = stream + stream_record[stream] = record_id + if not self_sudo.attachment_use or not attachment: + docx_record_ids += record_id + else: + docx_record_ids = record_ids + res_ids = docx_record_ids.ids + + if save_in_attachment and not res_ids: + _logger.info("The DOCS report has been generated from attachment.") + return self_sudo._post_docx(save_in_attachment), "docx" + + docx_contents = [] + for record_id in res_ids: + docx_content = self._render_docx([record_id], data=data) + docx_contents.append(docx_content) + + if res_ids: + _logger.info( + "The DOCS report has been generated for model: %s, records %s." + % (self_sudo.model, str(res_ids)) + ) + return ( + self_sudo._post_docx( + save_in_attachment, docx_contents=docx_contents, res_ids=res_ids + ), + "docx", + ) + return docx_contents, "docx" + + def _post_docx(self, save_in_attachment, docx_contents=None, res_ids=None): + """ + Adds generated file in attachments. + """ + + def close_streams(streams): + for stream in streams: + try: + stream.close() + except Exception: + pass + + if len(save_in_attachment) == 1 and not docx_contents: + return list(save_in_attachment.values())[0].getvalue() + + streams = [] + if docx_contents: + record_map = { + r.id: r + for r in self.env[self.model].browse( + [res_id for res_id in res_ids if res_id] + ) + } + if not record_map or not self.attachment: + streams.extend(docx_contents) + else: + for res_id, docx_content in zip(res_ids, docx_contents): + if res_id in record_map and not res_id in save_in_attachment: + new_stream = self._postprocess_docx_report( + record_map[res_id], docx_content + ) + if new_stream and new_stream != docx_content: + close_streams([docx_content]) + docx_content = new_stream + streams.append(docx_content) + if self.attachment_use: + for stream in save_in_attachment.values(): + streams.append(stream) + if len(streams) == 1: + result = streams[0].getvalue() + else: + try: + merged_stream = self._merge_docx(streams) + result = merged_stream.getvalue() + except Exception as e: + _logger.exception(e) + raise UserError( + _("One of the documents you try to merge caused failure.") + ) + + close_streams(streams) + return result + + def _postprocess_docx_report(self, record, buffer): + """ + Creates the record in the "ir.attachment" model. + """ + attachment_name = safe_eval(self.attachment, {"object": record, "time": time}) + if not attachment_name: + return None + attachment_vals = { + "name": attachment_name, + "raw": buffer.getvalue(), + "res_model": self.model, + "res_id": record.id, + "type": "binary", + } + try: + self.env["ir.attachment"].create(attachment_vals) + except AccessError: + _logger.info( + "Cannot save DOCX report %r as attachment", attachment_vals["name"] + ) + else: + _logger.info( + "The DOCX document %s is now saved in the database", + attachment_vals["name"], + ) + return buffer + + @staticmethod + def _merge_docx(streams): + """ + Joins several docx files into one with page breaks between them. + """ + if not streams: + return None + + merged_document = Document() + composer = Composer(merged_document) + + for stream in streams: + document = Document(stream) + + if composer.doc.paragraphs: + composer.doc.add_page_break() + + composer.append(document) + + merged_stream = BytesIO() + merged_document.save(merged_stream) + merged_stream.seek(0) + + return merged_stream + + def _render_docx(self, docids: list, data: dict = None): + """ + Receive the data for rendering and calls for it. + + docids: list of record's ids for which report is generated. + data: dict, conains "context", "report_type". + """ + if not data: + data = {} + data.setdefault("report_type", "docx") + data = self._get_rendering_context( + self, docids, data + ) # self contains current record of ir.actions.report model. + return self._render_docx_template(self.report_docx_template, values=data) + + def _render_docx_template(self, template: bytes, values: dict = None): + """ + docx file rendering itself. + """ + self.ensure_one() + + if values is None: + values = {} + + context = dict(self.env.context, inherit_branding=False) + # Browse the user instead of using the sudo self.env.user + user = self.env["res.users"].browse(self.env.uid) + website = None + if request and hasattr(request, "website"): + if request.website is not None: + website = request.website + context = dict( + context, + translatable=context.get("lang") + != request.env["ir.http"]._get_default_lang().code, + ) + + # базовый контекст, который и так шёл в шаблон + values.update( + record=values["docs"], + time=time, + context_timestamp=lambda t: fields.Datetime.context_timestamp( + self.with_context(tz=user.tz), t + ), + user=user, + res_company=user.company_id, + website=website, + web_base_url=self.env["ir.config_parameter"] + .sudo() + .get_param("web.base.url", default=""), + ) + + # --------- КАСТОМНЫЕ ПЕРЕМЕННЫЕ --------- + # record = текущая запись модели отчёта (partner.contract.customer, docx.test.contract и т.д.) + record = values.get("record") + # контекст для safe_eval кастомных выражений + eval_context = { + "env": self.env, + "user": user, + "record": record, + "docs": record, # чтобы можно было писать record.* или docs.* + "time": time, + "context": self.env.context, + "mode": "python", # как ты и просил + } + + custom_values = {} + for custom in self.docx_custom_field_ids: + tech = (custom.technical_name or "").strip() + if not tech: + continue + try: + result = safe_eval(custom.value_python or "", eval_context) + except Exception as e: + # Явная ошибка в кастомной переменной — не молчим + raise UserError( + _("Ошибка при вычислении кастомной переменной '%s': %s") + % (tech, e) + ) + custom_values[tech] = result + _logger.info( + "[DOCX CUSTOM] %s = %r (report id %s)", + tech, + result, + self.id, + ) + + # кладём их в общий контекст рендера: + # в шаблоне можно писать {{ our_company }} и т.п. + values.update(custom_values) + # --------- / КАСТОМНЫЕ ПЕРЕМЕННЫЕ --------- + + # Собственно рендер DOCX + docx_content = BytesIO() + with BytesIO(b64decode(template)) as template_file: + doc = DocxTemplate(template_file) + doc.render(values) + doc.save(docx_content) + docx_content.seek(0) + return docx_content + + @staticmethod + def _parse_markup(markup_data: Markup): + """ + Extracts data from field of Html type and returns them in text format, + without html tags. + """ + soup = BeautifulSoup(markup_data.__str__(), "html.parser") + data_arr = list(soup.strings) + return "\n".join(data_arr) diff --git a/docx_report/models/ir_model.py b/docx_report/models/ir_model.py new file mode 100644 index 00000000..7927242d --- /dev/null +++ b/docx_report/models/ir_model.py @@ -0,0 +1,13 @@ +from odoo import models, api + + +class IrModel(models.Model): + _inherit = "ir.model" + + @api.depends('model', 'name') + def _compute_display_name(self): + super()._compute_display_name() + + if self.env.context.get('from_docx_template'): + for record in self: + record.display_name = record.model or record.name \ No newline at end of file diff --git a/docx_report/models/ir_model_fields.py b/docx_report/models/ir_model_fields.py new file mode 100644 index 00000000..887b7c64 --- /dev/null +++ b/docx_report/models/ir_model_fields.py @@ -0,0 +1,26 @@ +from odoo import api, fields, models + + +class IrModelFields(models.Model): + _inherit = "ir.model.fields" + + docx_type_label = fields.Char( + string="Тип для DOCX", + compute="_compute_docx_type_label", + readonly=True, + ) + + @api.depends("ttype", "relation", "selection_ids.value") + def _compute_docx_type_label(self): + for field in self: + t = field.ttype or "" + if field.relation and field.ttype in ("many2one", "one2many", "many2many"): + t = f"{field.ttype} ({field.relation})" + + elif field.ttype == "selection": + values = field.selection_ids.mapped("value") + if values: + t = f"selection ({', '.join(values)})" + else: + t = "selection" + field.docx_type_label = t diff --git a/docx_report/security/ir.model.access.csv b/docx_report/security/ir.model.access.csv new file mode 100644 index 00000000..ccc469b9 --- /dev/null +++ b/docx_report/security/ir.model.access.csv @@ -0,0 +1,4 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_docx_template_user,docx.template user,model_docx_template,base.group_user,1,0,0,0 +access_docx_template_manager,docx.template manager,model_docx_template,base.group_system,1,1,1,1 +access_docx_custom_field_admin,access_docx_custom_field_admin,model_docx_custom_field,base.group_system,1,1,1,1 \ No newline at end of file diff --git a/docx_report/static/src/docx/contract.docx b/docx_report/static/src/docx/contract.docx new file mode 100644 index 00000000..13fa035e Binary files /dev/null and b/docx_report/static/src/docx/contract.docx differ diff --git a/docx_report/static/src/docx/report_account_invoice_upd_new_templates.docx b/docx_report/static/src/docx/report_account_invoice_upd_new_templates.docx new file mode 100644 index 00000000..e10546c9 Binary files /dev/null and b/docx_report/static/src/docx/report_account_invoice_upd_new_templates.docx differ diff --git a/docx_report/static/src/docx/report_account_invoice_updn_templates.docx b/docx_report/static/src/docx/report_account_invoice_updn_templates.docx new file mode 100644 index 00000000..4f57a564 Binary files /dev/null and b/docx_report/static/src/docx/report_account_invoice_updn_templates.docx differ diff --git a/docx_report/static/src/docx/report_saleorder_new_template.docx b/docx_report/static/src/docx/report_saleorder_new_template.docx new file mode 100644 index 00000000..71baf147 Binary files /dev/null and b/docx_report/static/src/docx/report_saleorder_new_template.docx differ diff --git a/docx_report/static/src/js/action_manager_report.js b/docx_report/static/src/js/action_manager_report.js new file mode 100644 index 00000000..a71e0e49 --- /dev/null +++ b/docx_report/static/src/js/action_manager_report.js @@ -0,0 +1,52 @@ +/** @odoo-module **/ + +import { registry } from "@web/core/registry"; +import { download } from "@web/core/network/download"; + +async function docxHandler(action, options, env) { + let reportType = null; + if (action.report_type === "docx-docx") { + reportType = "docx"; + } else if (action.report_type === "docx-pdf") { + reportType = "pdf"; + } + if (reportType) { + let url = `/report/${reportType}/${action.report_name}`; + const actionContext = action.context || {}; + if (action.data && JSON.stringify(action.data) !== "{}") { + const options = encodeURIComponent(JSON.stringify(action.data)); + const context = encodeURIComponent(JSON.stringify(actionContext)); + url += `?options=${options}&context=${context}`; + } else { + if (actionContext.active_ids) { + url += `/${actionContext.active_ids.join(",")}`; + } + } + + env?.services?.ui?.block?.(); + try { + const template_type = (action.report_type && action.report_type.split("-")[0]) || "docx"; + const type = template_type + "-" + url.split("/")[2]; + await download({ + url: "/report/download", + data: { + data: JSON.stringify([url, type]), + context: JSON.stringify(Object.assign({}, actionContext, env?.services?.user?.context || {})), + }, + }); + } finally { + env?.services?.ui?.unblock?.(); + } + + const onClose = options?.onClose; + if (action.close_on_report_download) { + return env?.services?.action?.doAction({ type: "ir.actions.act_window_close" }, { onClose }); + } else if (onClose) { + onClose(); + } + return Promise.resolve(true); + } + return Promise.resolve(false); +} + +registry.category("ir.actions.report handlers").add("docx_handler", docxHandler); diff --git a/docx_report/static/src/js/contract_docx_print_menu.js b/docx_report/static/src/js/contract_docx_print_menu.js new file mode 100644 index 00000000..e532d83d --- /dev/null +++ b/docx_report/static/src/js/contract_docx_print_menu.js @@ -0,0 +1,90 @@ +/** @odoo-module **/ + +import {FormController} from "@web/views/form/form_controller"; +import {patch} from "@web/core/utils/patch"; + +let docxReportMap = null; +let docxReportMapLoading = false; + +async function loadDocxReportMap(env) { + const orm = env.services.orm; + const templates = await orm.searchRead("docx.template", [], [ + "id", + "report_id", + "global_template", + "docx_model_id", + ]); + + const byReportId = {}; + for (const t of templates) { + const reportId = t.report_id && t.report_id[0]; + if (!reportId) continue; + + byReportId[reportId] = { + templateId: t.id, + globalTemplate: !!t.global_template, + isDocxBased: !!t.docx_model_id, + }; + } + + return { byReportId }; +} + +patch(FormController.prototype, { + get actionMenuItems() { + const items = super.actionMenuItems; + const record = this.model?.root; + + if (!record || !("docx_template_id" in (record.data || {}))) { + return items; + } + + if (!docxReportMap && !docxReportMapLoading) { + docxReportMapLoading = true; + + loadDocxReportMap(this.env) + .then((map) => { + docxReportMap = map; + docxReportMapLoading = false; + }) + .catch((e) => { + docxReportMapLoading = false; + }); + + return items; + } + + if (!docxReportMap) { + return items; + } + + const tplVal = record.data.docx_template_id; + const currentTemplateId = tplVal && tplVal[0]; + const hasTemplate = !!currentTemplateId; + + if (!items.print?.length) { + return items; + } + + items.print = items.print.filter((entry) => { + const reportId = entry.id; + const info = docxReportMap.byReportId[reportId]; + + if (!info || !info.isDocxBased) { + return true; + } + + if (info.globalTemplate) { + return true; + } + + if (!hasTemplate) { + return false; + } + + return info.templateId === currentTemplateId; + }); + + return items; + }, +}); diff --git a/docx_report/tests/__init__.py b/docx_report/tests/__init__.py new file mode 100644 index 00000000..0a8ef833 --- /dev/null +++ b/docx_report/tests/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import test_docx diff --git a/docx_report/tests/test_docx.py b/docx_report/tests/test_docx.py new file mode 100644 index 00000000..a8d1df9d --- /dev/null +++ b/docx_report/tests/test_docx.py @@ -0,0 +1,153 @@ +# -*- coding: utf-8 -*- +""" +Tests for docx_report — DOCX template loading. + +Validates: Requirement 13.1 +""" +import base64 +import io +import zipfile + +from odoo.tests.common import TransactionCase +from odoo.tests import tagged + + +def _make_minimal_docx(): + """ + Build a minimal valid DOCX (ZIP) file in memory and return it as base64. + + A DOCX is a ZIP archive containing at minimum: + - [Content_Types].xml + - word/document.xml + - _rels/.rels + """ + buf = io.BytesIO() + with zipfile.ZipFile(buf, "w", zipfile.ZIP_DEFLATED) as zf: + zf.writestr( + "[Content_Types].xml", + '' + '' + '' + '' + '' + "", + ) + zf.writestr( + "_rels/.rels", + '' + '' + '' + "", + ) + zf.writestr( + "word/document.xml", + '' + '' + "Test" + "", + ) + zf.writestr( + "word/_rels/document.xml.rels", + '' + '' + "", + ) + buf.seek(0) + return base64.b64encode(buf.read()).decode("ascii") + + +@tagged("post_install", "-at_install") +class TestDocxReport(TransactionCase): + """ + Tests for docx.template — DOCX template loading. + + Validates: Requirement 13.1 + """ + + def setUp(self): + super().setUp() + # Resolve the ir.model record for res.partner (a simple, always-present model) + self.ir_model = self.env["ir.model"].search( + [("model", "=", "res.partner")], limit=1 + ) + self.docx_b64 = _make_minimal_docx() + + # ------------------------------------------------------------------ + # Requirement 13.1 — loading a DOCX template saves without errors + # ------------------------------------------------------------------ + + def test_create_docx_template_without_file_saves_ok(self): + """ + Req 13.1 — creating a docx.template record without a template file + (file uploaded later by the user) saves without errors. + """ + template = self.env["docx.template"].create( + { + "name": "Test DOCX Template (no file)", + "report_type": "docx-docx", + "model": "res.partner", + "docx_output_type": "docx", + "docx_model_id": self.ir_model.id, + "global_template": True, + } + ) + self.assertTrue(template.id, "docx.template record should be created with a valid id") + self.assertEqual(template.name, "Test DOCX Template (no file)") + self.assertEqual(template.model, "res.partner") + + def test_load_docx_template_file_saves_ok(self): + """ + Req 13.1 — uploading a DOCX binary into report_docx_template and saving + the docx.template record completes without errors. + """ + template = self.env["docx.template"].create( + { + "name": "Test DOCX Template (with file)", + "report_type": "docx-docx", + "model": "res.partner", + "docx_output_type": "docx", + "docx_model_id": self.ir_model.id, + "global_template": True, + "report_docx_template": self.docx_b64, + "report_docx_template_filename": "test_template.docx", + } + ) + self.assertTrue(template.id, "docx.template record should be created with a valid id") + self.assertTrue( + template.report_docx_template, + "report_docx_template field should contain the uploaded binary", + ) + self.assertEqual( + template.report_docx_template_filename, + "test_template.docx", + "Filename should be stored correctly", + ) + + def test_write_docx_template_file_saves_ok(self): + """ + Req 13.1 — writing a DOCX binary to an existing docx.template record + via write() completes without errors. + """ + template = self.env["docx.template"].create( + { + "name": "Test DOCX Template (write)", + "report_type": "docx-docx", + "model": "res.partner", + "docx_output_type": "docx", + "docx_model_id": self.ir_model.id, + } + ) + # Now upload the template file via write + template.write( + { + "report_docx_template": self.docx_b64, + "report_docx_template_filename": "updated_template.docx", + } + ) + self.assertTrue( + template.report_docx_template, + "report_docx_template should be set after write()", + ) diff --git a/docx_report/views/docx_report.xml b/docx_report/views/docx_report.xml new file mode 100644 index 00000000..22aeec54 --- /dev/null +++ b/docx_report/views/docx_report.xml @@ -0,0 +1,76 @@ + + + + + A4 + + A4 + 0 + 0 + Portrait + 7 + 7 + 7 + 7 + + 35 + 75 + + + A4 Landscape + + A4 + 0 + 0 + Landscape + 7 + 7 + 7 + 7 + + 75 + 60 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docx_report/views/docx_template_views.xml b/docx_report/views/docx_template_views.xml new file mode 100644 index 00000000..f67ff177 --- /dev/null +++ b/docx_report/views/docx_template_views.xml @@ -0,0 +1,127 @@ + + + + + docx.template.tree + docx.template + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ + + Шаблоны + docx.template + list,form + + + + + Добавить все шаблоны в печать + + + action + code + action = model.action_bind_all_to_actions() + + + + +
diff --git a/docx_report_generation/README.md b/docx_report_generation/README.md new file mode 100644 index 00000000..93ff078a --- /dev/null +++ b/docx_report_generation/README.md @@ -0,0 +1,48 @@ +# DOCX report +Functionality + +Allows you to add docx files to the report model as a source template. +You can get reports based on such a template in docx or pdf format. +Currently, the simultaneous creation of multiple reports is not supported. + +To convert docx -> pdf, an available gutenberg service is required on localhost:8808. +An example of launching a service in docker-compose next to Odoo: + +```yaml +gotenberg: + image: thecodingmachine/gotenberg:6 + restart: unless-stopped + environment: + LOG_LEVEL: INFO + DEFAULT_LISTEN_PORT: 8808 + DISABLE_GOOGLE_CHROME: 1 + DEFAULT_WAIT_TIMEOUT: 30 + MAXIMUM_WAIT_TIMEOUT: 60 +``` + +Creating a report + +The report creates in the same way as the standard Odoo procedure: +1. In Settings -> Technical -> Reports, you need to create a new record. In the record of the report + choose one of the new types: "DOCX" or "DOCX(PDF)". + You do not need to fill in the "Template name" field, but instead download the docx file of the report. + All other fields are filled in the same as in standard Odoo reports. +2. If custom fields are applied in the report template, then you need to create them on the tab + "Custom fields". +3. In the entry of the specified model, an additional item with the name of the created report will appear in the print menu. + Clicking on it will display a wizard in which you can check the values of custom fields before generating the report file. +4. When generating a report from the portal, the file is generated without displaying the wizard. + + +Templates creating + +1. Templates can be created in any text editor that supports the docx format. +2. All formatting of the template is saved in the generated report. +3. Double curly braces are used to insert variables. +4. Access to the Odoo record for which the report generation is called is performed through the "docs" variable, + accessing attributes and methods as in Odoo: {{docs.attribute_name }} +5. It is possible to call the methods available for the entry in "docs", or passed to the context of the report. +6. By default, the report context contains methods of the "report_monetary_helper" module, which can be called directly by name. +7. Custom fields may also be present in the context of the report. + Such fields must be created in the report record. + In the template, custom fields are available by the name specified in the "tech_name" field of the custom field entry. diff --git a/docx_report_generation/__init__.py b/docx_report_generation/__init__.py new file mode 100644 index 00000000..91c5580f --- /dev/null +++ b/docx_report_generation/__init__.py @@ -0,0 +1,2 @@ +from . import controllers +from . import models diff --git a/docx_report_generation/__manifest__.py b/docx_report_generation/__manifest__.py new file mode 100644 index 00000000..3ce85e38 --- /dev/null +++ b/docx_report_generation/__manifest__.py @@ -0,0 +1,31 @@ +{ + "name": "DOCX report generation", + "summary": """Printing reports in docx format from docx templates.""", + "description": """ + Adds generation reports from .docx templates like standard Odoo reports + with qweb templates. Standard Odoo reports also available. + For generating .pdf from .docx external service the "Gotenberg" is used, + and it required module for integration with this service: "gotenberg". + If integration module "gotenberg" is absent, or service itself unreachable + there will be only reports in docx format. + + This is the beta version, bugs may be present. + """, + "author": "RYDLAB", + "website": "https://rydlab.ru", + "category": "Technical", + "version": "19.0.2025.11.11", + "license": "LGPL-3", + "depends": ["base", "web", "custom_report_field"], + "external_dependencies": {"python": ["docxcompose", "docxtpl", "bs4"]}, + "data": [ + "views/ir_actions_report_views.xml", + ], + "assets": { + "web.assets_backend": [ + "docx_report_generation/static/src/css/mimetypes.css", + "docx_report_generation/static/src/js/action_manager_report.js", + ], + }, + "images": ["static/description/banner.jpg"], +} diff --git a/docx_report_generation/controllers/__init__.py b/docx_report_generation/controllers/__init__.py new file mode 100644 index 00000000..12a7e529 --- /dev/null +++ b/docx_report_generation/controllers/__init__.py @@ -0,0 +1 @@ +from . import main diff --git a/docx_report_generation/controllers/main.py b/docx_report_generation/controllers/main.py new file mode 100644 index 00000000..07ed204b --- /dev/null +++ b/docx_report_generation/controllers/main.py @@ -0,0 +1,128 @@ +from json import dumps as json_dumps, loads as json_loads +from werkzeug.urls import url_decode + +from odoo.http import ( + content_disposition, + request, + route, + serialize_exception as _serialize_exception, +) +from odoo.tools import html_escape +from odoo.tools.safe_eval import safe_eval, time + +from odoo.addons.web.controllers.report import ReportController + + +class DocxReportController(ReportController): + @route() + def report_routes(self, reportname, docids=None, converter=None, **data): + """ + Запускает генерацию файла отчета и возвращает его + """ + report = request.env["ir.actions.report"]._get_report_from_name(reportname) + context = dict(request.env.context) + _data = dict() + _docids = [int(i) for i in docids.split(",")] if docids else [] + if data.get("options"): + _data.update(json_loads(data.pop("options"))) + if data.get("context"): + # Ignore 'lang' here, because the context in data is the one from the webclient *but* if + # the user explicitely wants to change the lang, this mechanism overwrites it. + _data["context"] = json_loads(data["context"]) + if _data["context"].get("lang") and not _data.get("force_context_lang"): + del _data["context"]["lang"] + context.update(_data["context"]) + if converter == "docx": + docx = report.with_context(context)._render_docx_docx(_docids, data=_data) + docxhttpheaders = [ + ( + "Content-Type", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + ), + ] + return request.make_response(docx, headers=docxhttpheaders) + elif converter == "pdf" and report.report_type == "docx": + pdf = report.with_context(context)._render_docx_pdf(_docids, data=_data) + pdfhttpheaders = [ + ( + "Content-Type", + "application/pdf", + ), + ("Content-Length", len(pdf[0])), + ] + return request.make_response(pdf, headers=pdfhttpheaders) + else: + return super(DocxReportController, self).report_routes( + reportname, docids, converter, **data + ) + + @route() + def report_download(self, data, context=None, token=None, readonly=True): + """ + Обрабатывает запрос на скачивание файла отчета + """ + requestcontent = json_loads(data) + url, type = requestcontent[0], requestcontent[1] + try: + if type in ["docx-docx", "docx-pdf"]: + converter = "docx" if type == "docx-docx" else "pdf" + extension = "docx" if type == "docx-docx" else "pdf" + + pattern = "/report/%s/" % ("docx" if type == "docx-docx" else "pdf") + reportname = url.split(pattern)[1].split("?")[0] + + docids = None + if "/" in reportname: + reportname, docids = reportname.split("/") + + if docids: + # Generic report: + response = self.report_routes( + reportname, docids=docids, converter=converter, context=context + ) + else: + # Particular report: + data = dict( + url_decode(url.split("?")[1]).items() + ) # decoding the args represented in JSON + if "context" in data: + context, data_context = json_loads(context or "{}"), json_loads( + data.pop("context") + ) + context = json_dumps({**context, **data_context}) + response = self.report_routes( + reportname, converter=converter, context=context, **data + ) + + report = request.env["ir.actions.report"]._get_report_from_name( + reportname + ) + filename = "%s.%s" % (report.name, extension) + + if docids: + ids = [int(x) for x in docids.split(",")] + obj = request.env[report.model].browse(ids) + if report.print_report_name and not len(obj) > 1: + try: + report_name = safe_eval( + report.print_report_name, {"object": obj, "time": time} + ) + except Exception: + # print_report_name может быть просто именем файла, а не Python-выражением + import re as _re + report_name = _re.sub(r'\.(docx?|pdf)$', '', report.print_report_name, flags=_re.IGNORECASE) + filename = "%s.%s" % (report_name, extension) + response.headers.add( + "Content-Disposition", content_disposition(filename) + ) + # token is dummy in 15 version + # response.set_cookie("fileToken", token) + return response + else: + return super(DocxReportController, self).report_download( + data, context=context, token=token, readonly=readonly + ) + except Exception as e: + se = _serialize_exception(e) + error = {"code": 200, "message": "Odoo Server Error", "data": se} + return request.make_response(html_escape(json_dumps(error))) diff --git a/docx_report_generation/i18n/docx_report.pot b/docx_report_generation/i18n/docx_report.pot new file mode 100644 index 00000000..2912961e --- /dev/null +++ b/docx_report_generation/i18n/docx_report.pot @@ -0,0 +1,70 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * docx_report +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-12-29 08:24+0000\n" +"PO-Revision-Date: 2022-12-29 08:24+0000\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: docx_report +#: model:ir.model.fields.selection,name:docx_report.selection__ir_actions_report__report_type__docx-docx +msgid "DOCX" +msgstr "" + +#. module: docx_report +#: model:ir.model.fields.selection,name:docx_report.selection__ir_actions_report__report_type__docx-pdf +msgid "DOCX(PDF)" +msgstr "" + +#. module: docx_report +#. odoo-python +#: code:addons/docx_report/models/ir_actions_report.py:0 +#, python-format +msgid "" +"Gotenberg converting service not available. The PDF can not be created." +msgstr "" + +#. module: docx_report +#. odoo-python +#: code:addons/docx_report/models/ir_actions_report.py:0 +#, python-format +msgid "One of the documents you try to merge caused failure." +msgstr "" + +#. module: docx_report +#: model:ir.model,name:docx_report.model_ir_actions_report +msgid "Report Action" +msgstr "" + +#. module: docx_report +#: model:ir.model.fields,field_description:docx_report.field_ir_actions_report__report_type +msgid "Report Type" +msgstr "" + +#. module: docx_report +#: model:ir.model.fields,field_description:docx_report.field_ir_actions_report__report_docx_template +msgid "Report docx template" +msgstr "" + +#. module: docx_report +#: model:ir.model.fields,field_description:docx_report.field_ir_actions_report__report_name +msgid "Template Name" +msgstr "" + +#. module: docx_report +#: model:ir.model.fields,help:docx_report.field_ir_actions_report__report_type +msgid "" +"The type of the report that will be rendered, each one having its own " +"rendering method. HTML means the report will be opened directly in your " +"browser PDF means the report will be rendered using Wkhtmltopdf and " +"downloaded by the user." +msgstr "" diff --git a/docx_report_generation/i18n/ru.po b/docx_report_generation/i18n/ru.po new file mode 100644 index 00000000..3007c1f1 --- /dev/null +++ b/docx_report_generation/i18n/ru.po @@ -0,0 +1,75 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * docx_report +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-12-29 08:24+0000\n" +"PO-Revision-Date: 2022-12-29 08:24+0000\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: docx_report +#: model:ir.model.fields.selection,name:docx_report.selection__ir_actions_report__report_type__docx-docx +msgid "DOCX" +msgstr "DOCX" + +#. module: docx_report +#: model:ir.model.fields.selection,name:docx_report.selection__ir_actions_report__report_type__docx-pdf +msgid "DOCX(PDF)" +msgstr "DOCX(PDF)" + +#. module: docx_report +#. odoo-python +#: code:addons/docx_report/models/ir_actions_report.py:0 +#, python-format +msgid "" +"Gotenberg converting service not available. The PDF can not be created." +msgstr "" +"Файл PDF не может быть создан, так как сервис конвертации Gotenberg не доступен." + +#. module: docx_report +#. odoo-python +#: code:addons/docx_report/models/ir_actions_report.py:0 +#, python-format +msgid "One of the documents you try to merge caused failure." +msgstr "Один из документов, которые вы пытаетесь соединить, вызывает ошибку." + +#. module: docx_report +#: model:ir.model,name:docx_report.model_ir_actions_report +msgid "Report Action" +msgstr "Действие для отчета." + +#. module: docx_report +#: model:ir.model.fields,field_description:docx_report.field_ir_actions_report__report_type +msgid "Report Type" +msgstr "Тип отчета" + +#. module: docx_report +#: model:ir.model.fields,field_description:docx_report.field_ir_actions_report__report_docx_template +msgid "Report docx template" +msgstr "Шаблон для отчета docx" + +#. module: docx_report +#: model:ir.model.fields,field_description:docx_report.field_ir_actions_report__report_name +msgid "Template Name" +msgstr "Имя шаблона" + +#. module: docx_report +#: model:ir.model.fields,help:docx_report.field_ir_actions_report__report_type +msgid "" +"The type of the report that will be rendered, each one having its own " +"rendering method. HTML means the report will be opened directly in your " +"browser PDF means the report will be rendered using Wkhtmltopdf and " +"downloaded by the user." +msgstr "" +"Тип генерируемого отчета. Каждый тип имеет свой собственный" +" метод генерации. HTML означает, что отчет будет открыт непосредственно в" +" вашем браузере, PDF означает, что отчет будет сгенерирован с помощью " +"Wkhtmltopdf и загружен пользователем." diff --git a/docx_report_generation/models/__init__.py b/docx_report_generation/models/__init__.py new file mode 100644 index 00000000..a248cf21 --- /dev/null +++ b/docx_report_generation/models/__init__.py @@ -0,0 +1 @@ +from . import ir_actions_report diff --git a/docx_report_generation/models/ir_actions_report.py b/docx_report_generation/models/ir_actions_report.py new file mode 100644 index 00000000..f54f0e3c --- /dev/null +++ b/docx_report_generation/models/ir_actions_report.py @@ -0,0 +1,478 @@ +from base64 import b64decode +from bs4 import BeautifulSoup +from collections import OrderedDict +from io import BytesIO +from logging import getLogger + +from docx import Document +from docxcompose.composer import Composer +from docxtpl import DocxTemplate +from requests import codes as codes_request, post as post_request +from requests.exceptions import RequestException + +from odoo import _, api, fields, models +from odoo.exceptions import AccessError, UserError +from odoo.http import request +from odoo.tools.safe_eval import safe_eval, time + +try: + from odoo.addons.gotenberg.service.utils import ( + get_auth, # noqa + convert_pdf_from_office_url, # noqa + check_gotenberg_installed, # noqa + ) + + gotenberg_imported = True +except ImportError: + gotenberg_imported = False + +_logger = getLogger(__name__) + + +class IrActionsReport(models.Model): + _inherit = "ir.actions.report" + + report_name = fields.Char( + compute="_compute_report_name", + inverse="_inverse_report_name", + store=True, + required=False, + ) + report_type = fields.Selection( + selection_add=[("docx-docx", "DOCX"), ("docx-pdf", "DOCX(PDF)")], + ondelete={"docx-docx": "cascade", "docx-pdf": "cascade"}, + ) + report_docx_template = fields.Binary( + string="Report docx template", + ) + + @api.depends("report_type", "model") + def _compute_report_name(self): + for record in self: + if ( + record.report_type in ["docx-docx", "docx-pdf"] + and record.model + and record.id + ): + record.report_name = "%s-docx_report+%s" % (record.model, record.id) + else: + record.report_name = False + + def _inverse_report_name(self): + """TODO: write this method""" + pass + + def retrieve_attachment(self, record): + """ + Searc for existing report file in record's attachments by fields: + 1. name + 2. res_model + 3. res_id + """ + result = super().retrieve_attachment(record) + if result: + if self.report_type == "docx-docx": + result = ( + result.filtered( + lambda r: r.mimetype + == "application/vnd.openxmlformats-officedocument.wordprocessingml.document" + ) + or None + ) + elif self.report_type == "docx-pdf": + result = ( + result.filtered(lambda r: r.mimetype == "application/pdf") or None + ) + return result + + @api.model + def _render_docx_pdf(self, res_ids=None, data=None): + """ + Prepares the data for report file rendering, calls for the render method + and handle rendering result. + """ + if not data: + data = {} + data.setdefault("report_type", "pdf") + + # access the report details with sudo() but evaluation context as current user + self_sudo = self.sudo() + + save_in_attachment = OrderedDict() + # Maps the streams in `save_in_attachment` back to the records they came from + # stream_record = dict() + if res_ids: + Model = self.env[self_sudo.model] + record_ids = Model.browse(res_ids) + docx_record_ids = Model + if self_sudo.attachment: + for record_id in record_ids: + attachment = self_sudo.retrieve_attachment(record_id) + if attachment and self_sudo.attachment_use: + # stream = self_sudo._retrieve_stream_from_attachment(attachment) + stream = BytesIO(attachment.raw) + save_in_attachment[record_id.id] = stream + # stream_record[stream] = record_id + if not self_sudo.attachment_use or not attachment: + docx_record_ids += record_id + else: + docx_record_ids = record_ids + res_ids = docx_record_ids.ids + + if save_in_attachment: # and not res_ids: + _logger.info("The PDF report has been generated from attachment.") + # self._raise_on_unreadable_pdfs(save_in_attachment.values(), stream_record) + return self_sudo._post_pdf(save_in_attachment), "pdf" + + docx_content = self._render_docx(res_ids, data=data) + + pdf_content = ( + self._get_pdf_from_office(docx_content) + if gotenberg_imported and check_gotenberg_installed() + else None + ) + + if not pdf_content: + raise UserError( + _( + "Gotenberg converting service not available. The PDF can not be created." + ) + ) + + if res_ids: + # self._raise_on_unreadable_pdfs(save_in_attachment.values(), stream_record) + # saving pdf in attachment. + return ( + self_sudo._post_pdf( + save_in_attachment, pdf_content=pdf_content, res_ids=res_ids + ), + "pdf", + ) + + return pdf_content, "pdf" + + @api.model + def _render_docx_docx(self, res_ids=None, data=None): + """ + Prepares the data for report file rendering, calls for the render method + and handle rendering result. + """ + if not data: + data = {} + data.setdefault("report_type", "docx") + + # access the report details with sudo() but evaluation context as current user + self_sudo = self.sudo() + + save_in_attachment = OrderedDict() + # Maps the streams in `save_in_attachment` back to the records they came from + stream_record = dict() + if res_ids: + Model = self.env[self_sudo.model] + record_ids = Model.browse(res_ids) + docx_record_ids = Model + if self_sudo.attachment: + for record_id in record_ids: + attachment = self_sudo.retrieve_attachment(record_id) + if attachment: + # stream = self_sudo._retrieve_stream_from_attachment(attachment) + stream = BytesIO(attachment.raw) + save_in_attachment[record_id.id] = stream + stream_record[stream] = record_id + if not self_sudo.attachment_use or not attachment: + docx_record_ids += record_id + else: + docx_record_ids = record_ids + res_ids = docx_record_ids.ids + + if save_in_attachment and not res_ids: + _logger.info("The DOCS report has been generated from attachment.") + return self_sudo._post_docx(save_in_attachment), "docx" + + docx_contents = [] + for record_id in res_ids: + docx_content = self._render_docx([record_id], data=data) + docx_contents.append(docx_content) + + if res_ids: + _logger.info( + "The DOCS report has been generated for model: %s, records %s." + % (self_sudo.model, str(res_ids)) + ) + return ( + self_sudo._post_docx( + save_in_attachment, docx_contents=docx_contents, res_ids=res_ids + ), + "docx", + ) + return docx_contents, "docx" + + def _post_pdf(self, save_in_attachment, pdf_content=None, res_ids=None): + """ + Adds pdf file in record's attachments. + TODO: For now bunch generation is not supported. + 2 execution ways: + - save_in_attachment and not res_ids - when get reports from attachments + - res_ids and not save_in_attachment - when generate report. + """ + self_sudo = self.sudo() + attachment_vals_list = [] + if save_in_attachment: + # here get streams from save_in_attachment, make pdf file and return it + # bunch generation here is already realized. + reports_data = list(save_in_attachment.values()) + if len(reports_data) == 1: + # If only one report, no need to merge files. Returns as is. + return reports_data[0].getvalue() + else: + return self._merge_pdfs(reports_data) + for res_id in res_ids: + record = self.env[self_sudo.model].browse(res_id) + if not self_sudo.attachment: + attachment_name = False + else: + attachment_name = safe_eval( + self_sudo.attachment, {"object": record, "time": time} + ) + # Unable to compute a name for the attachment. + if not attachment_name: + continue + attachment_vals_list.append( + { + "name": attachment_name, + "raw": pdf_content, # stream_data['stream'].getvalue(), + "res_model": self_sudo.model, + "res_id": record.id, + "type": "binary", + } + ) + if attachment_vals_list: + attachment_names = ", ".join(x["name"] for x in attachment_vals_list) + try: + self.env["ir.attachment"].create(attachment_vals_list) + except AccessError: + _logger.info( + "Cannot save PDF report %r attachments for user %r", + attachment_names, + self.env.user.display_name, + ) + else: + _logger.info( + "The PDF documents %r are now saved in the database", + attachment_names, + ) + return pdf_content + + def _post_docx(self, save_in_attachment, docx_contents=None, res_ids=None): + """ + Adds generated file in attachments. + """ + + def close_streams(streams): + for stream in streams: + try: + stream.close() + except Exception: + pass + + if len(save_in_attachment) == 1 and not docx_contents: + return list(save_in_attachment.values())[0].getvalue() + + streams = [] + if docx_contents: + # Build a record_map mapping id -> record + record_map = { + r.id: r + for r in self.env[self.model].browse( + [res_id for res_id in res_ids if res_id] + ) + } + # If no value in attachment or no record specified, only append the whole docx. + if not record_map or not self.attachment: + streams.extend(docx_contents) + else: + for res_id, docx_content in zip(res_ids, docx_contents): + if res_id in record_map and not res_id in save_in_attachment: + new_stream = self._postprocess_docx_report( + record_map[res_id], docx_content + ) + # If the buffer has been modified, mark the old buffer to be closed as well. + if new_stream and new_stream != docx_content: + close_streams([docx_content]) + docx_content = new_stream + streams.append(docx_content) + if self.attachment_use: + for stream in save_in_attachment.values(): + streams.append(stream) + if len(streams) == 1: + result = streams[0].getvalue() + else: + try: + merged_stream = self._merge_docx(streams) + result = merged_stream.getvalue() + except Exception as e: + _logger.exception(e) + raise UserError( + _("One of the documents you try to merge caused failure.") + ) + + close_streams(streams) + return result + + def _postprocess_docx_report(self, record, buffer): + """ + Creates the record in the "ir.attachment" model. + """ + attachment_name = safe_eval(self.attachment, {"object": record, "time": time}) + if not attachment_name: + return None + attachment_vals = { + "name": attachment_name, + "raw": buffer.getvalue(), + "res_model": self.model, + "res_id": record.id, + "type": "binary", + } + try: + self.env["ir.attachment"].create(attachment_vals) + except AccessError: + _logger.info( + "Cannot save DOCX report %r as attachment", attachment_vals["name"] + ) + else: + _logger.info( + "The DOCX document %s is now saved in the database", + attachment_vals["name"], + ) + return buffer + + @staticmethod + def _merge_docx(streams): + """ + Joins several docx files into one with page breaks between them. + """ + if not streams: + return None + + merged_document = Document() + composer = Composer(merged_document) + + for stream in streams: + document = Document(stream) + + if composer.doc.paragraphs: + composer.doc.add_page_break() + + composer.append(document) + + merged_stream = BytesIO() + merged_document.save(merged_stream) + merged_stream.seek(0) + + return merged_stream + + def _render_docx(self, docids: list, data: dict = None): + """ + Receive the data for rendering and calls for it. + + docids: list of record's ids for which report is generated. + data: dict, conains "context", "report_type". + """ + if not data: + data = {} + data.setdefault("report_type", "docx") + data = self._get_rendering_context( + self, docids, data + ) # self contains current record of ir.actions.report model. + return self._render_docx_template(self.report_docx_template, values=data) + + def _render_docx_template(self, template: bytes, values: dict = None): + """ + docx file rendering itself. + """ + if values is None: + values = {} + context = dict(self.env.context, inherit_branding=False) + # Browse the user instead of using the sudo self.env.user + user = self.env["res.users"].browse(self.env.uid) + website = None + if request and hasattr(request, "website"): + if request.website is not None: + website = request.website + context = dict( + context, + translatable=context.get("lang") + != request.env["ir.http"]._get_default_lang().code, + ) + values.update( + record=values["docs"], + time=time, + context_timestamp=lambda t: fields.Datetime.context_timestamp( + self.with_context(tz=user.tz), t + ), + user=user, + res_company=user.company_id, + website=website, + web_base_url=self.env["ir.config_parameter"] + .sudo() + .get_param("web.base.url", default=""), + ) + + record_to_render = values["docs"] + docs = { + key: record_to_render[key] + for key in record_to_render._fields.keys() + if not isinstance(record_to_render[key], str) + } + docs.update( + { + key: self._parse_markup(record_to_render[key]) + for key in record_to_render._fields.keys() + if isinstance(record_to_render[key], str) + } + ) + values["docs"] = docs + + docx_content = BytesIO() + with BytesIO(b64decode(template)) as template_file: + doc = DocxTemplate(template_file) + doc.render(values) + doc.save(docx_content) + docx_content.seek(0) + return docx_content + + @staticmethod + def _parse_markup(markup_data: str): + """ + Extracts data from field of Html type and returns them in text format, + without html tags. + """ + soup = BeautifulSoup(markup_data) + data_arr = list(soup.strings) + return "\n".join(data_arr) + + @staticmethod + def _get_pdf_from_office(content_stream): + """ + Converting docx into pdf with Gotenberg service. + """ + result = None + url = convert_pdf_from_office_url() + auth = get_auth() + try: + response = post_request( + url, + files={"file": ("converted_file.docx", content_stream.read())}, + auth=auth, + ) + if response.status_code == codes_request.ok: + result = response.content + else: + _logger.warning( + "Gotenberg response: %s - %s" + % (response.status_code, response.content) + ) + except RequestException as e: + _logger.exception(e) + finally: + return result diff --git a/docx_report_generation/static/description/banner.jpg b/docx_report_generation/static/description/banner.jpg new file mode 100644 index 00000000..7d73349e Binary files /dev/null and b/docx_report_generation/static/description/banner.jpg differ diff --git a/docx_report_generation/static/description/company_logo.jpg b/docx_report_generation/static/description/company_logo.jpg new file mode 100644 index 00000000..4e826eb4 Binary files /dev/null and b/docx_report_generation/static/description/company_logo.jpg differ diff --git a/docx_report_generation/static/description/divider.png b/docx_report_generation/static/description/divider.png new file mode 100644 index 00000000..b5269ea8 Binary files /dev/null and b/docx_report_generation/static/description/divider.png differ diff --git a/docx_report_generation/static/description/icon.png b/docx_report_generation/static/description/icon.png new file mode 100644 index 00000000..f4f4df08 Binary files /dev/null and b/docx_report_generation/static/description/icon.png differ diff --git a/docx_report_generation/static/description/index.html b/docx_report_generation/static/description/index.html new file mode 100644 index 00000000..17b37898 --- /dev/null +++ b/docx_report_generation/static/description/index.html @@ -0,0 +1,790 @@ + + + + + + + + + +
+ +
+

DOCX REPORT

+
+

+ The DOCX REPORT module is a tool for creating templates using the Jinja + template engine. The module allows you to add docx files to the report model as a source template. + Thanks to this, you can create automatically filled-out documents in docx and pdf formats. +

+
+
+ +
+
+
+
+ + Rydlab company logo + +
+ +
+ +
+
+
+
+
+

Features

+
+
+
Easy creation of auto-filled documents
+

+ There is no need to create a complex HTML template that is difficult to edit + and customize. It is enough to take a template in Docx format and insert the necessary values in + the right places. +

+
+
+
Access to all attributes of the model
+

+ During the creation of the report, the model to which this report belongs is + specified. When creating a report template, we can refer to any attribute of the specified + model. +

+
+
+
Easy template maintenance
+

+ There is no need to change the template in the Odoo code; it is enough to + upload a new template through the user interface. +

+
+
+
The amount-to-words methods are available
+

+ Thanks to these methods, we can insert numbers and sums with currencies in + words and round the numbers to the desired accuracy. +

+
+
+
+ +
+
+
+

How to use

+
+
Step 1: Install the module
+
+ +
+
+

+ Open the Apps menu in your Odoo and install the module "DOCX report". +

+
+
+ +
+
+
+
Step 2: Activate the Developer Mode
+
+ +
+
+

+ To create a new report in the user interface, we need to activate the + developer mode. +

+
+
+ +
+
+
+
Step 3: Open Reports
+
+ +
+
+

+ Now you should go back to the settings. Click "Technical", scroll down the + list, and click "Reports". +

+
+
+ +
+
+
+
Step 4: Create Docx template
+
+ +
+
+

+ 1. To get model attributes like model field values, use the word "docs" + + (dot) + model field name. +

+

+ 2. To call a model method that returns a value, use the word "record" + . + (dot) + model method name + () to call it. +

+

3. Use double curly braces "{{ }}" to call methods and attributes.

+

+ 4. Use curly braces with the percentage sign "{% %}" to create local + variables and use loops and if conditions. +

+
+
+ +
+
+
+
Step 5: Reports list view
+
+ +
+
+

+ When the Reports list view will be opened, click the "New" button to create a + new report. +

+
+
+ +
+
+
+
Step 6: Create a Report
+
+ +
+
+

1. To create a new report, you should fill out the form.

+

+ 2. "Action name" is the name that will be shown in the Print menu of the + model. +

+

3. "Report Type" should be DOCS or DOCX (PDF). The gotenberg service is used + to create pdf files. To use it, you need to install the Odoo module to communicate with the + service and enter the access details.

+

+ 4. "Model name" is the name of the model. Fields and methods will be derived + from this model. +

+

+ 5. "Report docx template" is the template file that was created at step 4. +

+

+ 6. "Printed report name" is the name of the file after generation. +

+

+ 7. To add this report to the Print menu, you should click on the button "Add + in the Print". +

+
+
+ +
+
+
+
Step 7: Create a custom field
+
+ +
+
+

+ 1. Custom fields are needed to get data that is not in the fields of the model associated with + the + report. Thanks to them, you can get data from other models, for example, through the reference + fields of the current model. +

+ 2. To create a custom field you should click "Custom Fields" menu on the form + and then click "Add a line" +

+

3. After that, write your Python code for the new variable.

+

4. In the template, custom fields are available by the name specified in the + "tech_name" field of the custom field entry. For exapmle: {{ contract_date }}.

+
+
+ +
+
+
+
Step 8: Print the Report
+
+ +
+
+

+ After printing the report the file will be saved. The information from the + model will complete the template. +

+
+
+ +
+
+
+
+
Step 9: Make a report from the Python code
+
+ +
+
+

If you want to make the report from the Python code, you should make an + ir.action.report record and an ir.attachment record that is connected to the first one. Add the + path to the Docx template from step 4.

+
+
+ +
+
+
+
Example of use for tables
+
+ +
+
+

The templates use Jinja2 syntax and support table generation.

+
+
+ +
+
+ + +
+
+ + Rydlab company logo + +
+
+

Need any help for this module?

+

Contact us for your queries

+

Email: apps@rydlab.ru

+
+
+ +
+
+ + + \ No newline at end of file diff --git a/docx_report_generation/static/description/screenshots/10_quotation_example.png b/docx_report_generation/static/description/screenshots/10_quotation_example.png new file mode 100644 index 00000000..2c0e4317 Binary files /dev/null and b/docx_report_generation/static/description/screenshots/10_quotation_example.png differ diff --git a/docx_report_generation/static/description/screenshots/1_intall_app.jpg b/docx_report_generation/static/description/screenshots/1_intall_app.jpg new file mode 100644 index 00000000..0c534876 Binary files /dev/null and b/docx_report_generation/static/description/screenshots/1_intall_app.jpg differ diff --git a/docx_report_generation/static/description/screenshots/2_activate_developer_mode.jpg b/docx_report_generation/static/description/screenshots/2_activate_developer_mode.jpg new file mode 100644 index 00000000..48fc97e8 Binary files /dev/null and b/docx_report_generation/static/description/screenshots/2_activate_developer_mode.jpg differ diff --git a/docx_report_generation/static/description/screenshots/3_open_reports.jpg b/docx_report_generation/static/description/screenshots/3_open_reports.jpg new file mode 100644 index 00000000..e0ee81d2 Binary files /dev/null and b/docx_report_generation/static/description/screenshots/3_open_reports.jpg differ diff --git a/docx_report_generation/static/description/screenshots/4_docx_template.jpg b/docx_report_generation/static/description/screenshots/4_docx_template.jpg new file mode 100644 index 00000000..317495f0 Binary files /dev/null and b/docx_report_generation/static/description/screenshots/4_docx_template.jpg differ diff --git a/docx_report_generation/static/description/screenshots/5_reporst_list.jpg b/docx_report_generation/static/description/screenshots/5_reporst_list.jpg new file mode 100644 index 00000000..b8320c7c Binary files /dev/null and b/docx_report_generation/static/description/screenshots/5_reporst_list.jpg differ diff --git a/docx_report_generation/static/description/screenshots/6_report_form.jpg b/docx_report_generation/static/description/screenshots/6_report_form.jpg new file mode 100644 index 00000000..bca5d51b Binary files /dev/null and b/docx_report_generation/static/description/screenshots/6_report_form.jpg differ diff --git a/docx_report_generation/static/description/screenshots/7_cutom_fields.jpg b/docx_report_generation/static/description/screenshots/7_cutom_fields.jpg new file mode 100644 index 00000000..0ff23c3b Binary files /dev/null and b/docx_report_generation/static/description/screenshots/7_cutom_fields.jpg differ diff --git a/docx_report_generation/static/description/screenshots/8_result.jpg b/docx_report_generation/static/description/screenshots/8_result.jpg new file mode 100644 index 00000000..b1cde03a Binary files /dev/null and b/docx_report_generation/static/description/screenshots/8_result.jpg differ diff --git a/docx_report_generation/static/description/screenshots/9_report_code.jpg b/docx_report_generation/static/description/screenshots/9_report_code.jpg new file mode 100644 index 00000000..ffe90527 Binary files /dev/null and b/docx_report_generation/static/description/screenshots/9_report_code.jpg differ diff --git a/docx_report_generation/static/src/css/mimetypes.css b/docx_report_generation/static/src/css/mimetypes.css new file mode 100644 index 00000000..e7b01859 --- /dev/null +++ b/docx_report_generation/static/src/css/mimetypes.css @@ -0,0 +1,4 @@ +.o_image[data-mimetype$='msword'], +.o_image[data-mimetype$='application/vnd.openxmlformats-officedocument.wordprocessingml.document'] { + background-image: url('/docx_report/static/src/img/msword.png'); +} diff --git a/docx_report_generation/static/src/img/msword.png b/docx_report_generation/static/src/img/msword.png new file mode 100644 index 00000000..5ac980ff Binary files /dev/null and b/docx_report_generation/static/src/img/msword.png differ diff --git a/docx_report_generation/static/src/js/action_manager_report.js b/docx_report_generation/static/src/js/action_manager_report.js new file mode 100644 index 00000000..4a78349b --- /dev/null +++ b/docx_report_generation/static/src/js/action_manager_report.js @@ -0,0 +1,55 @@ +/** @odoo-module **/ + +import { registry } from "@web/core/registry"; +import { download } from "@web/core/network/download"; + +async function docxHandler(action, options, env) { + let reportType = null; + if (action.report_type === "docx-docx") { + reportType = "docx"; + } else if (action.report_type === "docx-pdf") { + reportType = "pdf"; + } + if (reportType) { + // Make URL + let url = `/report/${reportType}/${action.report_name}`; + const actionContext = action.context || {}; + if (action.data && JSON.stringify(action.data) !== "{}") { + // build a query string with `action.data` (it's the place where reports + // using a wizard to customize the output traditionally put their options) + const options = encodeURIComponent(JSON.stringify(action.data)); + const context = encodeURIComponent(JSON.stringify(actionContext)); + url += `?options=${options}&context=${context}`; + } else { + if (actionContext.active_ids) { + url += `/${actionContext.active_ids.join(",")}`; + } + } + + env?.services?.ui?.block?.(); + try { + const template_type = (action.report_type && action.report_type.split("-")[0]) || "docx"; + const type = template_type + "-" + url.split("/")[2]; + await download({ + url: "/report/download", + data: { + data: JSON.stringify([url, type]), + context: JSON.stringify(Object.assign({}, actionContext, env?.services?.user?.context || {})), + }, + }); + } finally { + env?.services?.ui?.unblock?.(); + } + + const onClose = options?.onClose; + if (action.close_on_report_download) { + return env?.services?.action?.doAction({ type: "ir.actions.act_window_close" }, { onClose }); + } else if (onClose) { + onClose(); + } + return Promise.resolve(true); + } + return Promise.resolve(false); +} + +registry.category("ir.actions.report handlers").add("docx_handler_gen", docxHandler); diff --git a/docx_report_generation/tests/__init__.py b/docx_report_generation/tests/__init__.py new file mode 100644 index 00000000..14b95eee --- /dev/null +++ b/docx_report_generation/tests/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import test_docx_gen diff --git a/docx_report_generation/tests/test_docx_gen.py b/docx_report_generation/tests/test_docx_gen.py new file mode 100644 index 00000000..bf7c1942 --- /dev/null +++ b/docx_report_generation/tests/test_docx_gen.py @@ -0,0 +1,143 @@ +# -*- coding: utf-8 -*- +""" +Tests for docx_report_generation — DOCX report generation from templates. + +Validates: Requirements 13.2, 13.3 +""" +import base64 +import io +import zipfile + +from odoo.tests.common import TransactionCase +from odoo.tests import tagged + + +def _make_docx_with_template(body_text="Hello World"): + """ + Build a minimal valid DOCX file with the given body text and return it as base64 bytes. + """ + buf = io.BytesIO() + with zipfile.ZipFile(buf, "w", zipfile.ZIP_DEFLATED) as zf: + zf.writestr( + "[Content_Types].xml", + '' + '' + '' + '' + '' + "", + ) + zf.writestr( + "_rels/.rels", + '' + '' + '' + "", + ) + zf.writestr( + "word/document.xml", + '' + '' + "" + + body_text + + "" + "", + ) + zf.writestr( + "word/_rels/document.xml.rels", + '' + '' + "", + ) + buf.seek(0) + return base64.b64encode(buf.read()) + + +@tagged("post_install", "-at_install") +class TestDocxGeneration(TransactionCase): + """ + Tests for docx_report_generation — generating DOCX reports from templates. + + Validates: Requirements 13.2, 13.3 + """ + + def setUp(self): + super().setUp() + # Create a minimal ir.actions.report record of type docx-docx + self.ir_model = self.env["ir.model"].search( + [("model", "=", "res.partner")], limit=1 + ) + self.partner = self.env["res.partner"].create({"name": "Test Partner"}) + + # Template with a simple static body (no Jinja2 variables) + self.valid_template_b64 = _make_docx_with_template("Hello World") + + # Template with an invalid/undefined Jinja2 variable reference + # docxtpl uses {{ variable }} syntax; an undefined variable with strict mode raises + self.invalid_template_b64 = _make_docx_with_template( + "{{ undefined_variable_xyz | raise_exception }}" + ) + + self.report = self.env["ir.actions.report"].create( + { + "name": "Test DOCX Generation Report", + "model": "res.partner", + "report_type": "docx-docx", + "report_docx_template": self.valid_template_b64, + } + ) + + # ------------------------------------------------------------------ + # Requirement 13.2 — generation returns non-empty binary content + # ------------------------------------------------------------------ + + def test_render_docx_template_returns_nonempty_binary(self): + """ + Req 13.2 — _render_docx_template with a valid DOCX template and a + res.partner record returns non-empty binary content (BytesIO with data). + """ + values = { + "docs": self.partner, + "report_type": "docx", + } + result = self.report._render_docx_template( + self.valid_template_b64, values=values + ) + content = result.getvalue() + self.assertTrue( + content, + "_render_docx_template should return non-empty binary content", + ) + self.assertGreater( + len(content), + 0, + "Generated DOCX content must have non-zero length", + ) + + # ------------------------------------------------------------------ + # Requirement 13.3 — invalid Jinja2 variables raise an exception + # ------------------------------------------------------------------ + + def test_render_docx_template_invalid_jinja2_raises(self): + """ + Req 13.3 — _render_docx_template with a DOCX template containing an + invalid/undefined Jinja2 expression raises an exception describing the + template error. + """ + # Build a template that uses an invalid Jinja2 filter which does not exist + invalid_b64 = _make_docx_with_template("{{ partner.nonexistent_method() }}") + values = { + "docs": self.partner, + "report_type": "docx", + } + with self.assertRaises(Exception) as ctx: + self.report._render_docx_template(invalid_b64, values=values) + # The exception message should contain some description of the error + error_msg = str(ctx.exception) + self.assertTrue( + error_msg, + "Exception raised for invalid Jinja2 template should have a non-empty message", + ) diff --git a/docx_report_generation/views/ir_actions_report_views.xml b/docx_report_generation/views/ir_actions_report_views.xml new file mode 100644 index 00000000..baff6e3e --- /dev/null +++ b/docx_report_generation/views/ir_actions_report_views.xml @@ -0,0 +1,17 @@ + + + + ir.actions.report.inherit.view.form + ir.actions.report + + + + report_type in ['docx-docx', 'docx-pdf'] + report_type not in ['docx-docx', 'docx-pdf'] + + + + + + + diff --git a/ir_rule_protected/README.rst b/ir_rule_protected/README.rst new file mode 100644 index 00000000..8b192a31 --- /dev/null +++ b/ir_rule_protected/README.rst @@ -0,0 +1,20 @@ +.. image:: https://itpp.dev/images/infinity-readme.png + :alt: Tested and maintained by IT Projects Labs + :target: https://itpp.dev + +Protect ir.rule records +======================= + +The module allows protect ir.rule from modifying and deleting. Once a rule is marked as protected only superuser is able to control this rule. + +Also, the module protect itself from uninstalling by non-superuser. + +Roadmap +======= + +* The module should allow specifying which admins can switch to superuser mode (set True to all existing admins and False for any new users) + +Further information +=================== + +Tested on `Odoo 17.0 `_ diff --git a/ir_rule_protected/__init__.py b/ir_rule_protected/__init__.py new file mode 100644 index 00000000..0650744f --- /dev/null +++ b/ir_rule_protected/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/ir_rule_protected/__manifest__.py b/ir_rule_protected/__manifest__.py new file mode 100644 index 00000000..2af76255 --- /dev/null +++ b/ir_rule_protected/__manifest__.py @@ -0,0 +1,14 @@ +{ + "name": "Protect ir.rule records", + "summary": "Non-superuser admins cannot change protected ir.rule or uninstall this module", + "version": "19.0.1.0.0", + "author": "IT-Projects LLC, Ivan Yelizariev", + "category": "Extra Tools", + "images": ["images/banner.jpg"], + "support": "apps@itpp.dev", + "website": "https://www.odoo.com/apps/modules/14.0/ir_rule_protected/", + "license": "Other OSI approved licence", # MIT + "depends": [], + "data": ["views.xml"], + "installable": True, +} diff --git a/ir_rule_protected/doc/changelog.rst b/ir_rule_protected/doc/changelog.rst new file mode 100644 index 00000000..5583eb32 --- /dev/null +++ b/ir_rule_protected/doc/changelog.rst @@ -0,0 +1,4 @@ +`1.0.0` +------- + +- **Init version** diff --git a/ir_rule_protected/doc/index.rst b/ir_rule_protected/doc/index.rst new file mode 100644 index 00000000..14658a19 --- /dev/null +++ b/ir_rule_protected/doc/index.rst @@ -0,0 +1,19 @@ +========================= + Protect ir.rule records +========================= + +Installation +============ + +* `Install `__ this module in a usual way + +Usage +===== + +* `Log in as SUPERUSER `__ +* `Activate Developer Mode `__ +* Open menu ``[[ Settings ]]>> Technical >> Security >> Record Rules`` +* Select or create some record +* Click ``[Edit]`` +* Set "Protected" checkbox and click ``[Save]`` button. +* RESULT: the record is protected from modifying and deleting by non-superuser. diff --git a/ir_rule_protected/i18n/de.po b/ir_rule_protected/i18n/de.po new file mode 100644 index 00000000..43fdebf7 --- /dev/null +++ b/ir_rule_protected/i18n/de.po @@ -0,0 +1,53 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * ir_rule_protected +# +# Translators: +# Dawid Runowski , 2019 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-04-26 19:17+0000\n" +"PO-Revision-Date: 2017-12-05 05:26+0000\n" +"Last-Translator: Dawid Runowski , 2019\n" +"Language-Team: German (https://www.transifex.com/it-projects-llc/teams/76080/" +"de/)\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: ir_rule_protected +#: model:ir.model.fields,help:ir_rule_protected.field_ir_rule_protected +msgid "Make rule editable only for superuser" +msgstr "" + +#. module: ir_rule_protected +#: model:ir.model,name:ir_rule_protected.model_ir_module_module +msgid "Module" +msgstr "" + +#. module: ir_rule_protected +#: code:addons/ir_rule_protected/models.py:39 +#, python-format +msgid "Only admin can uninstall the module" +msgstr "" + +#. module: ir_rule_protected +#: model:ir.model.fields,field_description:ir_rule_protected.field_ir_rule_protected +msgid "Protected" +msgstr "Geschützt" + +#. module: ir_rule_protected +#: code:addons/ir_rule_protected/models.py:19 +#, python-format +msgid "The Rule is protected. You don't have access for this operation" +msgstr "" + +#. module: ir_rule_protected +#: model:ir.model,name:ir_rule_protected.model_ir_rule +msgid "ir.rule" +msgstr "" diff --git a/ir_rule_protected/i18n/es_CR.po b/ir_rule_protected/i18n/es_CR.po new file mode 100644 index 00000000..ca571db3 --- /dev/null +++ b/ir_rule_protected/i18n/es_CR.po @@ -0,0 +1,56 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * ir_rule_protected +# +# Translators: +# Randall , 2018 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-04-21 00:17+0000\n" +"PO-Revision-Date: 2017-11-28 13:02+0000\n" +"Last-Translator: Randall , 2018\n" +"Language-Team: Spanish (Costa Rica) (https://www.transifex.com/it-projects-" +"llc/teams/76080/es_CR/)\n" +"Language: es_CR\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" + +#. module: ir_rule_protected +#: model:ir.model.fields,help:ir_rule_protected.field_ir_rule__protected +msgid "Make rule editable only for superuser" +msgstr "Hacer que la regla sea editable sólo para Superusuario" + +#. module: ir_rule_protected +#: model:ir.model,name:ir_rule_protected.model_ir_module_module +msgid "Module" +msgstr "Módulo" + +#. module: ir_rule_protected +#: code:addons/ir_rule_protected/models.py:38 +#, python-format +msgid "Only admin can uninstall the module" +msgstr "Sólo admin puede desinstalar el módulo" + +#. module: ir_rule_protected +#: model:ir.model.fields,field_description:ir_rule_protected.field_ir_rule__protected +msgid "Protected" +msgstr "Protegido" + +#. module: ir_rule_protected +#: model:ir.model,name:ir_rule_protected.model_ir_rule +msgid "Record Rule" +msgstr "" + +#. module: ir_rule_protected +#: code:addons/ir_rule_protected/models.py:18 +#, python-format +msgid "The Rule is protected. You don't have access for this operation" +msgstr "La regla está protegida. No tiene acceso para esta operación" + +#~ msgid "ir.rule" +#~ msgstr "ir.rule" diff --git a/ir_rule_protected/i18n/ir_rule_protected.pot b/ir_rule_protected/i18n/ir_rule_protected.pot new file mode 100644 index 00000000..2e6afdbd --- /dev/null +++ b/ir_rule_protected/i18n/ir_rule_protected.pot @@ -0,0 +1,46 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * ir_rule_protected +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.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: ir_rule_protected +#: model:ir.model.fields,help:ir_rule_protected.field_ir_rule__protected +msgid "Make rule editable only for superuser" +msgstr "" + +#. module: ir_rule_protected +#: model:ir.model,name:ir_rule_protected.model_ir_module_module +msgid "Module" +msgstr "" + +#. module: ir_rule_protected +#: code:addons/ir_rule_protected/models.py:0 +#, python-format +msgid "Only admin can uninstall the module" +msgstr "" + +#. module: ir_rule_protected +#: model:ir.model.fields,field_description:ir_rule_protected.field_ir_rule__protected +msgid "Protected" +msgstr "" + +#. module: ir_rule_protected +#: model:ir.model,name:ir_rule_protected.model_ir_rule +msgid "Record Rule" +msgstr "" + +#. module: ir_rule_protected +#: code:addons/ir_rule_protected/models.py:0 +#, python-format +msgid "The Rule is protected. You don't have access for this operation" +msgstr "" diff --git a/ir_rule_protected/images/banner.jpg b/ir_rule_protected/images/banner.jpg new file mode 100644 index 00000000..717fbb84 Binary files /dev/null and b/ir_rule_protected/images/banner.jpg differ diff --git a/ir_rule_protected/models.py b/ir_rule_protected/models.py new file mode 100644 index 00000000..14b832c7 --- /dev/null +++ b/ir_rule_protected/models.py @@ -0,0 +1,39 @@ +from odoo import SUPERUSER_ID, exceptions, fields, models +from odoo.tools.translate import _ + +MODULE_NAME = "ir_rule_protected" + + +class IRRule(models.Model): + _inherit = "ir.rule" + + protected = fields.Boolean( + "Protected", help="Make rule editable only for superuser" + ) + + def check_restricted(self): + if self.env.user.id == SUPERUSER_ID: + return + for r in self: + if r.protected: + raise exceptions.UserError( + _("The Rule is protected. You don't have access for this operation") + ) + + def write(self, vals): + self.check_restricted() + return super(IRRule, self).write(vals) + + def unlink(self): + self.check_restricted() + return super(IRRule, self).unlink() + + +class Module(models.Model): + _inherit = "ir.module.module" + + def button_uninstall(self): + for r in self: + if r.name == MODULE_NAME and self.env.uid != SUPERUSER_ID: + raise exceptions.UserError(_("Only admin can uninstall the module")) + return super(Module, self).button_uninstall() diff --git a/ir_rule_protected/static/description/icon.png b/ir_rule_protected/static/description/icon.png new file mode 100644 index 00000000..85f5fe74 Binary files /dev/null and b/ir_rule_protected/static/description/icon.png differ diff --git a/ir_rule_protected/tests/__init__.py b/ir_rule_protected/tests/__init__.py new file mode 100644 index 00000000..172011b5 --- /dev/null +++ b/ir_rule_protected/tests/__init__.py @@ -0,0 +1 @@ +from . import test_ir_rule diff --git a/ir_rule_protected/tests/test_ir_rule.py b/ir_rule_protected/tests/test_ir_rule.py new file mode 100644 index 00000000..c51ac11b --- /dev/null +++ b/ir_rule_protected/tests/test_ir_rule.py @@ -0,0 +1,81 @@ +# Copyright 2024 DOB +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo import SUPERUSER_ID +from odoo.exceptions import UserError +from odoo.tests import new_test_user +from odoo.tests.common import TransactionCase + + +class TestIrRuleProtected(TransactionCase): + """Tests for ir_rule_protected: non-superuser cannot modify protected ir.rule. + + Validates: Requirement 6.2 + """ + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env( + context=dict(cls.env.context, tracking_disable=True, no_reset_password=True) + ) + # Create a regular admin user (not superuser) + cls.regular_user = new_test_user( + cls.env, + name="Regular Admin", + login="test_regular_admin_ir_rule", + groups="base.group_user,base.group_system", + ) + # Create a protected ir.rule + cls.protected_rule = cls.env["ir.rule"].with_user(SUPERUSER_ID).create({ + "name": "Test Protected Rule", + "model_id": cls.env.ref("base.model_res_partner").id, + "protected": True, + }) + + def test_non_superuser_cannot_write_protected_rule(self): + """WHEN a user without is_superuser tries to modify a protected ir.rule, + ir_rule_protected SHALL deny the modification with UserError. + + Validates: Requirement 6.2 + """ + with self.assertRaises(UserError): + self.protected_rule.with_user(self.regular_user).write( + {"name": "Attempted Rename"} + ) + + def test_non_superuser_cannot_unlink_protected_rule(self): + """WHEN a user without is_superuser tries to delete a protected ir.rule, + ir_rule_protected SHALL deny the deletion with UserError. + + Validates: Requirement 6.2 + """ + with self.assertRaises(UserError): + self.protected_rule.with_user(self.regular_user).unlink() + + def test_superuser_can_write_protected_rule(self): + """WHEN the superuser modifies a protected ir.rule, + ir_rule_protected SHALL allow the modification. + + Validates: Requirement 6.2 (positive case) + """ + original_name = self.protected_rule.name + self.protected_rule.with_user(SUPERUSER_ID).write({"name": "Superuser Rename"}) + self.assertEqual(self.protected_rule.name, "Superuser Rename") + # Restore original name + self.protected_rule.with_user(SUPERUSER_ID).write({"name": original_name}) + + def test_non_superuser_can_write_unprotected_rule(self): + """WHEN a user without is_superuser modifies an unprotected ir.rule, + ir_rule_protected SHALL allow the modification. + + Validates: Requirement 6.2 (negative case — unprotected rule) + """ + unprotected_rule = self.env["ir.rule"].with_user(SUPERUSER_ID).create({ + "name": "Unprotected Rule", + "model_id": self.env.ref("base.model_res_partner").id, + "protected": False, + }) + # Should not raise + unprotected_rule.with_user(self.regular_user).write({"name": "Renamed OK"}) + self.assertEqual(unprotected_rule.name, "Renamed OK") diff --git a/ir_rule_protected/views.xml b/ir_rule_protected/views.xml new file mode 100644 index 00000000..a82ce50f --- /dev/null +++ b/ir_rule_protected/views.xml @@ -0,0 +1,11 @@ + + + ir.rule + + + + + + + + diff --git a/l10n_ru_act_rev/README.md b/l10n_ru_act_rev/README.md new file mode 100644 index 00000000..101fe21f --- /dev/null +++ b/l10n_ru_act_rev/README.md @@ -0,0 +1,14 @@ +# Российская локализация - Акт сверки +name: l10n_ru_act_rev + + +## Описание +Добавление печатной формы акт сверки из контактов, с помощью которой можно легко отслеживать дебеторские и кредиторские проводки с клиентами. + +### Для печати: +1. Выбираем меню Контакты - карточку конкретного партнера - Действия - "Печать акт сверки"; +2. В визарде выбираем: + 2.1. Компанию (для которой нужна сверка с выбранным контактом); + 2.2. Период сверки; + 2.3. Цель (один из режимом: все проведенные проводки или все проводки, включая черновики); +3. Кнопка "Печать" \ No newline at end of file diff --git a/l10n_ru_act_rev/__init__.py b/l10n_ru_act_rev/__init__.py new file mode 100644 index 00000000..778f6478 --- /dev/null +++ b/l10n_ru_act_rev/__init__.py @@ -0,0 +1,4 @@ +from . import models +from . import report +from . import wizard +from . import controllers diff --git a/l10n_ru_act_rev/__manifest__.py b/l10n_ru_act_rev/__manifest__.py new file mode 100644 index 00000000..840b9e8a --- /dev/null +++ b/l10n_ru_act_rev/__manifest__.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +{ + 'name': "Российская локализация - Акт сверки", + + 'summary': """ + Добавление отчета акт сверки""", + + 'description': """ + Добавление формы акт сверки, находящегося в контактах, с помощью которого можно легко отслеживать дебеторские и кредиторские проводки с клиентами. + + Для печати: + 1. Выбираем меню Контакты - конкретного партнера - Действия - "Печать акт сверки"; + 2. В визарде выбираем: + 2.1. Компанию (для которой нужна сверка с выбранным контактом); + 2.2. Период сверки; + 2.3. Цель (один из режимом: все проведенные проводки или все проводки, включая черновики); + 3. Кнопка "Печать" + + """, + + 'author': "MK.Lab", + 'website': "https://www.inf-centre.ru/", + + 'category': 'Uncategorized', + 'version': '0.1', + + # any module necessary for this one to work correctly + "depends": ["account", "portal", "website", 'contacts', "l10n_ru_doc", 'l10n_ru_contract', 'l10n_ru_base'], + "data": [ + "security/ir.model.access.csv", + "wizard/general_ledger_wizard_view.xml", + "report/layouts.xml", + "report/general_ledger.xml", + "views/account_account_views.xml", + "views/report_general_ledger.xml", + "views/portal_templates.xml", + ], + "installable": True, + "application": True, + "auto_install": False, + # only loaded in demonstration mode + 'demo': [ + 'demo/demo.xml', + ], +} diff --git a/l10n_ru_act_rev/controllers/__init__.py b/l10n_ru_act_rev/controllers/__init__.py new file mode 100644 index 00000000..457bae27 --- /dev/null +++ b/l10n_ru_act_rev/controllers/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import controllers \ No newline at end of file diff --git a/l10n_ru_act_rev/controllers/controllers.py b/l10n_ru_act_rev/controllers/controllers.py new file mode 100644 index 00000000..86e717eb --- /dev/null +++ b/l10n_ru_act_rev/controllers/controllers.py @@ -0,0 +1,89 @@ +from odoo import http +from odoo.http import request +from datetime import datetime, date + + +class ActRevise(http.Controller): + + @http.route(['/my/act_revise/'], type='http', auth="public", website=True) + def print_report(self): + partner = request.env.user.partner_id.parent_id.id + partner_name = request.env.user.partner_id.parent_id.name + if not partner: + partner = request.env.user.partner_id.id + partner_name = request.env.user.partner_id.name + company = request.env.user.company_id.id + company_name = request.env.user.company_id.name + today = date.today() + d1 = today.strftime("%d.%m.%y") + + wizard_data = { + "target_move": "posted", + "hide_account_at_0": True, + "foreign_currency": True, + "company_id": company, + "partner_ids": [partner], + "show_cost_center": True, + "centralize": True + } + wizard_record = request.env['general.ledger.act_revise.wizard'].sudo().create(wizard_data) + + action = request.env.ref('l10n_ru_act_rev.action_general_ledger_wizard').read()[0] + action['res_id'] = wizard_record.id + action['context'] = dict(request.env.context) + return request.redirect('/web#action=' + str(action['id']) + '&id=' + str(wizard_record.id) + '&view_type=form') + + # @http.route(['/my/act_revise/'], type='http', auth="public", website=True) + # def print_report(self): + # partner = request.env.user.partner_id.parent_id.id + # partner_name = request.env.user.partner_id.parent_id.name + # if not partner: + # partner = request.env.user.partner_id.id + # partner_name = request.env.user.partner_id.name + # company = request.env.user.company_id.id + # company_name = request.env.user.company_id.name + # today = date.today() + # d1 = today.strftime("%d.%m.%y") + # # new_url = str('Акт Сверки ' + d1 + ' ' + company_name + '_' + partner_name) + # # new_url=str('AC ' + company +' - ' + partner + ' ' + d1) + # # if request.httprequest.full_path == '/my/act_revise/a?': + # # return werkzeug.utils.redirect('/my/act_revise/%s' % new_url) + # wizard_data = {"target_move": "posted", + # "hide_account_at_0": True, + # "foreign_currency": True, + # #"show_analytic_tags": True, + # "company_id": company, + # "partner_ids": [partner], + # #"show_partner_details": True, + # "show_cost_center": True, + # "centralize": True} + # t = request.env['general.ledger.act_revise.wizard'].sudo().create(wizard_data) + # data = t._prepare_report_general_ledger() + # name = t.get_report_filename() + # report_name = name.encode('cp1251') + # pdf, _ = request.env['ir.actions.report']._render_qweb_pdf( + # 'act_revise.action_print_report_general_ledger_qweb', res_ids=t.id, data=data) + # pdfhttpheaders = [('Content-Type', 'application/pdf'), ('Content-Length', len(pdf)), ] + # return request.make_response(pdf, headers=pdfhttpheaders) + + @http.route(['/my/act_revise_contact/'], type='http', auth="public", website=True) + def print_report_contact(self, date_to, date_from, target_move, company, partner): + partner_id = int(partner) or 'default_partner_value' + company_id = int(company) + wizard_data = {"date_to": date_to, + "date_from": date_from, + "target_move": target_move, + "hide_account_at_0": True, + "foreign_currency": True, + #"show_analytic_tags": True, + "company_id": company_id, + "partner_ids": [partner_id], + #"show_partner_details": True, + "show_cost_center": True, + "centralize": True} + t = request.env['general.ledger.act_revise.wizard'].sudo().create(wizard_data) + data = t._prepare_report_general_ledger() + pdf, _ = request.env['ir.actions.report']._render_qweb_pdf( + 'l10n_ru_act_rev.action_print_report_general_ledger_qweb', res_ids=t.id, data=data) + pdfhttpheaders = [('Content-Type', 'application/pdf'), ('Content-Length', len(pdf)), ] + return request.make_response(pdf, headers=pdfhttpheaders) \ No newline at end of file diff --git a/l10n_ru_act_rev/demo/demo.xml b/l10n_ru_act_rev/demo/demo.xml new file mode 100644 index 00000000..340fdd0c --- /dev/null +++ b/l10n_ru_act_rev/demo/demo.xml @@ -0,0 +1,30 @@ + + + + + \ No newline at end of file diff --git a/l10n_ru_act_rev/models/__init__.py b/l10n_ru_act_rev/models/__init__.py new file mode 100644 index 00000000..f75a8039 --- /dev/null +++ b/l10n_ru_act_rev/models/__init__.py @@ -0,0 +1,2 @@ +from . import account_account +from . import ir_actions_report \ No newline at end of file diff --git a/l10n_ru_act_rev/models/account_account.py b/l10n_ru_act_rev/models/account_account.py new file mode 100644 index 00000000..3e251fe1 --- /dev/null +++ b/l10n_ru_act_rev/models/account_account.py @@ -0,0 +1,7 @@ +from odoo import fields, models, _ + + +class AccountAccount(models.Model): + _inherit = "account.account" + + centralized = fields.Boolean(_("Централизованно")) diff --git a/l10n_ru_act_rev/models/ir_actions_report.py b/l10n_ru_act_rev/models/ir_actions_report.py new file mode 100644 index 00000000..b0f8377a --- /dev/null +++ b/l10n_ru_act_rev/models/ir_actions_report.py @@ -0,0 +1,10 @@ +from odoo import api, models + + +class IrActionsReport(models.Model): + _inherit = "ir.actions.report" + + @api.model + def _prepare_account_financial_report_context(self, data): + lang = data and data.get("account_financial_report_lang") or "" + return dict(self.env.context or {}, lang=lang) if lang else False diff --git a/l10n_ru_act_rev/report/__init__.py b/l10n_ru_act_rev/report/__init__.py new file mode 100644 index 00000000..f7ccab0f --- /dev/null +++ b/l10n_ru_act_rev/report/__init__.py @@ -0,0 +1,2 @@ +from . import general_ledger + diff --git a/l10n_ru_act_rev/report/general_ledger.py b/l10n_ru_act_rev/report/general_ledger.py new file mode 100644 index 00000000..6e54de70 --- /dev/null +++ b/l10n_ru_act_rev/report/general_ledger.py @@ -0,0 +1,1060 @@ +import calendar +import datetime +import operator + +from odoo.exceptions import UserError +from odoo import _, api, models +from odoo.tools import float_is_zero +import logging + +class GeneralLedgerReport(models.AbstractModel): + _name = "report.l10n_ru_act_rev.general_ledger" + _description = "General Ledger Report" + + COMMON_ML_FIELDS = [ + "account_id", + "partner_id", + "journal_id", + "move_type", + "date", + "ref", + "id", + "move_id", + "name", + ] + + @api.model + def _get_move_lines_domain_not_reconciled( + self, company_id, account_ids, partner_ids, only_posted_moves, date_from + ): + domain = [ + ("account_id", "in", account_ids), + ("company_id", "=", company_id), + ("reconciled", "=", False), + ] + if partner_ids: + domain += [("partner_id", "in", partner_ids)] + if only_posted_moves: + domain += [("move_id.state", "=", "posted")] + else: + domain += [("move_id.state", "in", ["posted", "draft"])] + if date_from: + domain += [("date", ">", date_from)] + return domain + + @api.model + def _get_new_move_lines_domain( + self, new_ml_ids, account_ids, company_id, partner_ids, only_posted_moves + ): + domain = [ + ("account_id", "in", account_ids), + ("company_id", "=", company_id), + ("id", "in", new_ml_ids), + ] + if partner_ids: + domain += [("partner_id", "in", partner_ids)] + if only_posted_moves: + domain += [("move_id.state", "=", "posted")] + else: + domain += [("move_id.state", "in", ["posted", "draft"])] + return domain + + def _recalculate_move_lines( + self, + move_lines, + move_type, + debit_ids, + credit_ids, + debit_amount, + credit_amount, + ml_ids, + account_ids, + company_id, + partner_ids, + only_posted_moves, + debit_amount_currency, + credit_amount_currency, + ): + debit_ids = set(debit_ids) + credit_ids = set(credit_ids) + in_credit_but_not_in_debit = credit_ids - debit_ids + reconciled_ids = list(debit_ids) + list(in_credit_but_not_in_debit) + reconciled_ids = set(reconciled_ids) + ml_ids = set(ml_ids) + new_ml_ids = reconciled_ids - ml_ids + new_ml_ids = list(new_ml_ids) + new_domain = self._get_new_move_lines_domain( + new_ml_ids, account_ids, company_id, partner_ids, only_posted_moves + ) + company_currency = self.env["res.company"].browse(company_id).currency_id + ml_fields = self._get_ml_fields() + new_move_lines = self.env["account.move.line"].search_read( + domain=new_domain, fields=ml_fields + ) + move_lines = move_lines + new_move_lines + for move_line in move_lines: + ml_id = move_line["id"] + if ml_id in debit_ids: + if move_line.get("amount_residual", False): + move_line["amount_residual"] += debit_amount[ml_id] + else: + move_line["amount_residual"] = debit_amount[ml_id] + if move_line.get("amount_residual_currency", False): + move_line["amount_residual_currency"] += debit_amount_currency[ + ml_id + ] + else: + move_line["amount_residual_currency"] = debit_amount_currency[ml_id] + if ml_id in credit_ids: + if move_line.get("amount_residual", False): + move_line["amount_residual"] -= credit_amount[ml_id] + else: + move_line["amount_residual"] = -credit_amount[ml_id] + if move_line.get("amount_residual_currency", False): + move_line["amount_residual_currency"] -= credit_amount_currency[ + ml_id + ] + else: + move_line["amount_residual_currency"] = -credit_amount_currency[ + ml_id + ] + # Set amount_currency=0 to keep the same behaviour as in v13 + # Conditions: if there is no curency_id defined or it is equal + # to the company's curency_id + if "amount_currency" in move_line and ( + "currency_id" not in move_line + or move_line["currency_id"] == company_currency.id + ): + move_line["amount_currency"] = 0 + return move_lines + + def _get_accounts_data(self, accounts_ids): + accounts = self.env["account.account"].browse(accounts_ids) + accounts_data = {} + for account in accounts: + accounts_data.update( + { + account.id: { + "id": account.id, + "code": account.code, + "name": account.name, + "hide_account": False, + "group_id": account.group_id.id, + "currency_id": account.currency_id.id, + "currency_name": account.currency_id.name, + "centralized": account.centralized, + } + } + ) + return accounts_data + + def _get_journals_data(self, journals_ids): + journals = self.env["account.journal"].browse(journals_ids) + journals_data = {} + for journal in journals: + journals_data.update({journal.id: {"id": journal.id, "code": journal.code}}) + return journals_data + + def _get_analytic_data(self, account_ids): + analytic_accounts = self.env["account.analytic.account"].browse(account_ids) + analytic_data = {} + for account in analytic_accounts: + analytic_data.update({account.id: {"name": account.name}}) + return analytic_data + + def _get_taxes_data(self, taxes_ids): + taxes = self.env["account.tax"].browse(taxes_ids) + taxes_data = {} + for tax in taxes: + taxes_data.update( + { + tax.id: { + "id": tax.id, + "amount": tax.amount, + "amount_type": tax.amount_type, + "display_name": tax.display_name, + } + } + ) + if tax.amount_type == "percent" or tax.amount_type == "division": + taxes_data[tax.id]["string"] = "%" + else: + taxes_data[tax.id]["string"] = "" + taxes_data[tax.id]["tax_name"] = ( + tax.display_name + + " (" + + str(tax.amount) + + taxes_data[tax.id]["string"] + + ")" + ) + return taxes_data + + def _get_account_type_domain(self, grouped_by): + """To avoid set all possible types, set in or not in as operator of the types + we are interested in. In v15 we used the internal_type field (type of + account.account.type).""" + at_op = "in" if grouped_by != "taxes" else "not in" + return [ + ("account_type", at_op, ["asset_receivable", "liability_payable"]), + ] + + def _get_acc_prt_accounts_ids(self, company_id, grouped_by): + accounts_domain = [ + ("company_ids", "=", company_id), + ] + self._get_account_type_domain(grouped_by) + acc_prt_accounts = self.env["account.account"].search(accounts_domain) + return acc_prt_accounts.ids + + def _get_initial_balances_bs_ml_domain( + self, account_ids, company_id, date_from, base_domain, grouped_by, acc_prt=False + ): + accounts_domain = [ + ("company_ids", "=", company_id), + ("include_initial_balance", "=", True), + ] + if account_ids: + accounts_domain += [("id", "in", account_ids)] + domain = [] + domain += base_domain + domain += [("date", "<", date_from)] + accounts = self.env["account.account"].search(accounts_domain) + domain += [("account_id", "in", accounts.ids)] + if acc_prt: + domain += self._get_account_type_domain(grouped_by) + return domain + + def _get_initial_balances_pl_ml_domain( + self, account_ids, company_id, date_from, fy_start_date, base_domain + ): + accounts_domain = [ + ("company_ids", "=", company_id), + ("include_initial_balance", "=", False), + ] + if account_ids: + accounts_domain += [("id", "in", account_ids)] + domain = [] + domain += base_domain + domain += [("date", "<", date_from), ("date", ">=", fy_start_date)] + accounts = self.env["account.account"].search(accounts_domain) + domain += [("account_id", "in", accounts.ids)] + return domain + + def _get_accounts_initial_balance(self, initial_domain_bs, initial_domain_pl): + gl_initial_acc_bs = self.env["account.move.line"].read_group( + domain=initial_domain_bs, + fields=["account_id", "debit", "credit", "balance", "amount_currency:sum"], + groupby=["account_id"], + ) + gl_initial_acc_pl = self.env["account.move.line"].read_group( + domain=initial_domain_pl, + fields=["account_id", "debit", "credit", "balance", "amount_currency:sum"], + groupby=["account_id"], + ) + gl_initial_acc = gl_initial_acc_bs + gl_initial_acc_pl + return gl_initial_acc + + def _get_initial_balance_fy_pl_ml_domain( + self, account_ids, company_id, fy_start_date, base_domain + ): + accounts_domain = [ + ("company_ids", "=", company_id), + ("include_initial_balance", "=", False), + ] + if account_ids: + accounts_domain += [("id", "in", account_ids)] + domain = [] + domain += base_domain + domain += [("date", "<", fy_start_date)] + accounts = self.env["account.account"].search(accounts_domain) + domain += [("account_id", "in", accounts.ids)] + return domain + + def _get_pl_initial_balance( + self, account_ids, company_id, fy_start_date, foreign_currency, base_domain + ): + domain = self._get_initial_balance_fy_pl_ml_domain( + account_ids, company_id, fy_start_date, base_domain + ) + initial_balances = self.env["account.move.line"].read_group( + domain=domain, + fields=["account_id", "debit", "credit", "balance", "amount_currency:sum"], + groupby=["account_id"], + ) + pl_initial_balance = { + "debit": 0.0, + "credit": 0.0, + "balance": 0.0, + "bal_curr": 0.0, + } + for initial_balance in initial_balances: + pl_initial_balance["debit"] += initial_balance["debit"] + pl_initial_balance["credit"] += initial_balance["credit"] + pl_initial_balance["balance"] += initial_balance["balance"] + pl_initial_balance["bal_curr"] += initial_balance["amount_currency"] + return pl_initial_balance + + def _get_gl_initial_acc( + self, account_ids, company_id, date_from, fy_start_date, base_domain, grouped_by + ): + initial_domain_bs = self._get_initial_balances_bs_ml_domain( + account_ids, company_id, date_from, base_domain, grouped_by + ) + initial_domain_pl = self._get_initial_balances_pl_ml_domain( + account_ids, company_id, date_from, fy_start_date, base_domain + ) + return self._get_accounts_initial_balance(initial_domain_bs, initial_domain_pl) + + def _prepare_gen_ld_data_item(self, gl): + res = {} + for key_bal in ["init_bal", "fin_bal"]: + res[key_bal] = {} + for key_field in ["credit", "debit", "balance", "bal_curr"]: + field_name = key_field if key_field != "bal_curr" else "amount_currency" + res[key_bal][key_field] = gl[field_name] + return res + + def _prepare_gen_ld_data(self, gl_initial_acc, domain, grouped_by): + data = {} + for gl in gl_initial_acc: + acc_id = gl["account_id"][0] + data[acc_id] = self._prepare_gen_ld_data_item(gl) + data[acc_id]["id"] = acc_id + if grouped_by: + data[acc_id][grouped_by] = False + method = "_prepare_gen_ld_data_group_%s" % grouped_by + if not hasattr(self, method): + return data + return getattr(self, method)(data, domain, grouped_by) + + def _prepare_gen_ld_data_group_partners(self, data, domain, grouped_by): + gl_initial_acc_prt = self.env["account.move.line"].read_group( + domain=domain, + fields=[ + "account_id", + "partner_id", + "debit", + "credit", + "balance", + "amount_currency:sum", + ], + groupby=["account_id", "partner_id"], + lazy=False, + ) + if gl_initial_acc_prt: + for gl in gl_initial_acc_prt: + if not gl["partner_id"]: + prt_id = 0 + prt_name = _("Missing Partner") + else: + prt_id = gl["partner_id"][0] + prt_name = gl["partner_id"][1] + prt_name = prt_name._value + acc_id = gl["account_id"][0] + data[acc_id][prt_id] = self._prepare_gen_ld_data_item(gl) + data[acc_id][prt_id]["id"] = prt_id + data[acc_id][prt_id]["name"] = prt_name + data[acc_id][grouped_by] = True + return data + + def _prepare_gen_ld_data_group_taxes(self, data, domain, grouped_by): + gl_initial_acc_prt = self.env["account.move.line"].read_group( + domain=domain, + fields=[ + "account_id", + "debit", + "credit", + "balance", + "amount_currency:sum", + "tax_line_id", + ], + groupby=["account_id"], + lazy=False, + ) + if gl_initial_acc_prt: + for gl in gl_initial_acc_prt: + if "tax_line_id" in gl and gl["tax_line_id"]: + tax_id = gl["tax_line_id"][0] + tax_name = gl["tax_line_id"][1] + tax_name = tax_name._value + else: + tax_id = 0 + tax_name = "Missing Tax" + acc_id = gl["account_id"][0] + data[acc_id][tax_id] = self._prepare_gen_ld_data_item(gl) + data[acc_id][tax_id]["id"] = tax_id + data[acc_id][tax_id]["name"] = tax_name + data[acc_id][grouped_by] = True + return data + + def _get_initial_balance_data( + self, + account_ids, + partner_ids, + company_id, + date_from, + foreign_currency, + only_posted_moves, + unaffected_earnings_account, + fy_start_date, + cost_center_ids, + extra_domain, + grouped_by, + ): + # If explicit list of accounts is provided, + # don't include unaffected earnings account + if account_ids: + unaffected_earnings_account = False + base_domain = [] + if company_id: + base_domain += [("company_id", "=", company_id)] + if partner_ids: + base_domain += [("partner_id", "in", partner_ids)] + if only_posted_moves: + base_domain += [("move_id.state", "=", "posted")] + else: + base_domain += [("move_id.state", "in", ["posted", "draft"])] + if cost_center_ids: + base_domain += [("analytic_account_ids", "in", cost_center_ids)] + if extra_domain: + base_domain += extra_domain + gl_initial_acc = self._get_gl_initial_acc( + account_ids, company_id, date_from, fy_start_date, base_domain, grouped_by + ) + domain = self._get_initial_balances_bs_ml_domain( + account_ids, company_id, date_from, base_domain, grouped_by, acc_prt=True + ) + data = self._prepare_gen_ld_data(gl_initial_acc, domain, grouped_by) + accounts_ids = list(data.keys()) + unaffected_id = unaffected_earnings_account + if unaffected_id: + if unaffected_id not in accounts_ids: + accounts_ids.append(unaffected_id) + data[unaffected_id] = self._initialize_data(foreign_currency) + data[unaffected_id]["id"] = unaffected_id + data[unaffected_id]["mame"] = "" + data[unaffected_id][grouped_by] = False + pl_initial_balance = self._get_pl_initial_balance( + account_ids, company_id, fy_start_date, foreign_currency, base_domain + ) + for key_bal in ["init_bal", "fin_bal"]: + fields_balance = ["credit", "debit", "balance"] + if foreign_currency: + fields_balance.append("bal_curr") + for field_name in fields_balance: + data[unaffected_id][key_bal][field_name] += pl_initial_balance[ + field_name + ] + return data + + @api.model + def _get_move_line_data(self, move_line): + move_type = move_line.get("move_type", "") + inscription = "" + account = self.env['account.account'].browse(move_line['account_id'][0]) + accounttype = account.account_type + if move_type == "entry": + if accounttype == "liability_payable": + inscription = "Платеж поставщику" + elif accounttype == "asset_receivable": + inscription = "Оплата покупателя" + # elif accounttype == "asset_current": + # inscription = "Оплата покупателя" + # else: + # inscription = "" + elif move_type == "out_invoice": + inscription = "Продажа товаров и услуг" + # elif move_type == "out_refund": + # inscription = "Сторно клиента " + elif move_type == "in_invoice": + inscription = "Покупка товаров и услуг " + # elif move_type == "in_refund": + # inscription = "Кредитное обязательство поставщика " + # elif move_type == "out_receipt": + # inscription = "Квитанция продаж" + # elif move_type == "in_receipt": + # inscription = "Квитанция покупки" + + transformed_move_name = f"{inscription} No. {move_line['move_name']}" + move_line_data = { + "id": move_line["id"], + "date": move_line["date"], + "entry": transformed_move_name, + # "entry": move_line["move_name"], + "entry_id": move_line["move_id"][0], + "journal_id": move_line["journal_id"][0], + "account_id": move_line["account_id"][0], + "partner_id": move_line["partner_id"][0] + if move_line["partner_id"] + else False, + "partner_name": move_line["partner_id"][1] + if move_line["partner_id"] + else "", + "ref": "" if not move_line["ref"] else move_line["ref"], + "name": "" if not move_line["name"] else move_line["name"], + "tax_ids": move_line["tax_ids"], + "tax_line_id": move_line["tax_line_id"], + "debit": move_line["debit"], + "credit": move_line["credit"], + "balance": move_line["balance"], + "bal_curr": move_line["amount_currency"], + "rec_id": move_line["full_reconcile_id"][0] + if move_line["full_reconcile_id"] + else False, + "rec_name": move_line["full_reconcile_id"][1] + if move_line["full_reconcile_id"] + else "", + "currency_id": move_line["currency_id"], + "analytic_distribution": move_line["analytic_distribution"] or {}, + } + if ( + move_line_data["ref"] == move_line_data["name"] + or move_line_data["ref"] == "" + ): + ref_label = move_line_data["name"] + elif move_line_data["name"] == "": + ref_label = move_line_data["ref"] + else: + ref_label = move_line_data["ref"] + str(" - ") + move_line_data["name"] + move_line_data.update({"ref_label": ref_label}) + return move_line_data + + @api.model + def _get_period_domain( + self, + account_ids, + partner_ids, + company_id, + only_posted_moves, + date_to, + date_from, + cost_center_ids, + ): + domain = [ + ("display_type", "not in", ["line_note", "line_section"]), + ("date", ">=", date_from), + ("date", "<=", date_to), + ] + if account_ids: + domain += [("account_id", "in", account_ids)] + if company_id: + domain += [("company_id", "=", company_id)] + if partner_ids: + domain += [("partner_id", "in", partner_ids)] + if only_posted_moves: + domain += [("move_id.state", "=", "posted")] + else: + domain += [("move_id.state", "in", ["posted", "draft"])] + + if cost_center_ids: + domain += [("analytic_account_ids", "in", cost_center_ids)] + return domain + + def _initialize_data(self, foreign_currency): + res = {} + for key_bal in ["init_bal", "fin_bal"]: + res[key_bal] = {} + for key_field in ["balance", "credit", "debit"]: + res[key_bal][key_field] = 0.0 + if foreign_currency: + res[key_bal]["bal_curr"] = 0.0 + return res + + def _get_reconciled_after_date_to_ids(self, full_reconcile_ids, date_to): + full_reconcile_ids = list(full_reconcile_ids) + domain = [ + ("max_date", ">", date_to), + ("full_reconcile_id", "in", full_reconcile_ids), + ] + fields = ["full_reconcile_id"] + reconciled_after_date_to = self.env["account.partial.reconcile"].search_read( + domain=domain, fields=fields + ) + rec_after_date_to_ids = list( + map(operator.itemgetter("full_reconcile_id"), reconciled_after_date_to) + ) + rec_after_date_to_ids = [i[0] for i in rec_after_date_to_ids] + return rec_after_date_to_ids + + def _prepare_ml_items(self, move_line, grouped_by): + res = [] + if grouped_by == "partners": + item_id = move_line["partner_id"][0] if move_line["partner_id"] else 0 + item_name = ( + move_line["partner_id"][1] + if move_line["partner_id"] + else _("Missing Partner") + ) + res.append({"id": item_id, "name": item_name}) + elif grouped_by == "taxes": + if move_line["tax_line_id"]: + item_id = move_line["tax_line_id"][0] + item_name = move_line["tax_line_id"][1] + res.append({"id": item_id, "name": item_name}) + elif move_line["tax_ids"]: + for tax_id in move_line["tax_ids"]: + tax_item = self.env["account.tax"].browse(tax_id) + res.append({"id": tax_item.id, "name": tax_item.name}) + else: + res.append({"id": 0, "name": "Missing Tax"}) + else: + res.append({"id": 0, "name": ""}) + return res + + def _get_period_ml_data( + self, + account_ids, + partner_ids, + company_id, + foreign_currency, + only_posted_moves, + date_from, + date_to, + gen_ld_data, + cost_center_ids, + extra_domain, + grouped_by, + ): + domain = self._get_period_domain( + account_ids, + partner_ids, + company_id, + only_posted_moves, + date_to, + date_from, + cost_center_ids, + ) + if extra_domain: + domain += extra_domain + ml_fields = self._get_ml_fields() + move_lines = self.env["account.move.line"].search_read( + domain=domain, fields=ml_fields, order="date,move_name" + ) + journal_ids = set() + full_reconcile_ids = set() + taxes_ids = set() + analytic_ids = set() + full_reconcile_data = {} + acc_prt_account_ids = self._get_acc_prt_accounts_ids(company_id, grouped_by) + for move_line in move_lines: + journal_ids.add(move_line["journal_id"][0]) + for tax_id in move_line["tax_ids"]: + taxes_ids.add(tax_id) + for analytic_account in move_line["analytic_distribution"] or {}: + analytic_ids.add(int(analytic_account)) + if move_line["full_reconcile_id"]: + rec_id = move_line["full_reconcile_id"][0] + if rec_id not in full_reconcile_ids: + full_reconcile_data.update( + { + rec_id: { + "id": rec_id, + "name": move_line["full_reconcile_id"][1], + } + } + ) + full_reconcile_ids.add(rec_id) + acc_id = move_line["account_id"][0] + ml_id = move_line["id"] + if acc_id not in gen_ld_data.keys(): + gen_ld_data[acc_id] = self._initialize_data(foreign_currency) + gen_ld_data[acc_id]["id"] = acc_id + gen_ld_data[acc_id]["mame"] = move_line["account_id"][1] + if grouped_by: + gen_ld_data[acc_id][grouped_by] = False + if acc_id in acc_prt_account_ids: + item_ids = self._prepare_ml_items(move_line, grouped_by) + for item in item_ids: + item_id = item["id"] + if item_id not in gen_ld_data[acc_id]: + if grouped_by: + gen_ld_data[acc_id][grouped_by] = True + gen_ld_data[acc_id][item_id] = self._initialize_data( + foreign_currency + ) + gen_ld_data[acc_id][item_id]["id"] = item_id + gen_ld_data[acc_id][item_id]["name"] = item["name"] + gen_ld_data[acc_id][item_id][ml_id] = self._get_move_line_data( + move_line + ) + gen_ld_data[acc_id][item_id]["fin_bal"]["credit"] += move_line[ + "credit" + ] + gen_ld_data[acc_id][item_id]["fin_bal"]["debit"] += move_line[ + "debit" + ] + gen_ld_data[acc_id][item_id]["fin_bal"]["balance"] += move_line[ + "balance" + ] + if foreign_currency: + gen_ld_data[acc_id][item_id]["fin_bal"][ + "bal_curr" + ] += move_line["amount_currency"] + else: + gen_ld_data[acc_id][ml_id] = self._get_move_line_data(move_line) + gen_ld_data[acc_id]["fin_bal"]["credit"] += move_line["credit"] + gen_ld_data[acc_id]["fin_bal"]["debit"] += move_line["debit"] + gen_ld_data[acc_id]["fin_bal"]["balance"] += move_line["balance"] + if foreign_currency: + gen_ld_data[acc_id]["fin_bal"]["bal_curr"] += move_line[ + "amount_currency" + ] + journals_data = self._get_journals_data(list(journal_ids)) + accounts_data = self._get_accounts_data(gen_ld_data.keys()) + taxes_data = self._get_taxes_data(list(taxes_ids)) + analytic_data = self._get_analytic_data(list(analytic_ids)) + rec_after_date_to_ids = self._get_reconciled_after_date_to_ids( + full_reconcile_data.keys(), date_to + ) + return ( + gen_ld_data, + accounts_data, + journals_data, + full_reconcile_data, + taxes_data, + analytic_data, + rec_after_date_to_ids, + ) + + @api.model + def _recalculate_cumul_balance( + self, move_lines, last_cumul_balance, rec_after_date_to_ids + ): + for move_line in move_lines: + move_line["balance"] += last_cumul_balance + last_cumul_balance = move_line["balance"] + if move_line["rec_id"] in rec_after_date_to_ids: + move_line["rec_name"] = "(" + _("future") + ") " + move_line["rec_name"] + return move_lines + + def _create_account(self, account, acc_id, gen_led_data, rec_after_date_to_ids): + move_lines = [] + for ml_id in gen_led_data[acc_id].keys(): + if not isinstance(ml_id, int): + account.update({ml_id: gen_led_data[acc_id][ml_id]}) + else: + move_lines += [gen_led_data[acc_id][ml_id]] + move_lines = sorted(move_lines, key=lambda k: (k["date"])) + move_lines = self._recalculate_cumul_balance( + move_lines, + gen_led_data[acc_id]["init_bal"]["balance"], + rec_after_date_to_ids, + ) + account.update({"move_lines": move_lines}) + return account + + def _create_account_not_show_item( + self, account, acc_id, gen_led_data, rec_after_date_to_ids, grouped_by + ): + move_lines = [] + for prt_id in gen_led_data[acc_id].keys(): + if not isinstance(prt_id, int): + account.update({prt_id: gen_led_data[acc_id][prt_id]}) + elif isinstance(gen_led_data[acc_id][prt_id], dict): + for ml_id in gen_led_data[acc_id][prt_id].keys(): + if isinstance(ml_id, int): + move_lines += [gen_led_data[acc_id][prt_id][ml_id]] + move_lines = sorted(move_lines, key=lambda k: (k["date"])) + move_lines = self._recalculate_cumul_balance( + move_lines, + gen_led_data[acc_id]["init_bal"]["balance"], + rec_after_date_to_ids, + ) + account.update({"move_lines": move_lines, grouped_by: False}) + return account + + def _get_list_grouped_item( + self, data, account, rec_after_date_to_ids, hide_account_at_0, rounding + ): + list_grouped = [] + for data_id in data.keys(): + group_item = {} + move_lines = [] + if not isinstance(data_id, int): + account.update({data_id: data[data_id]}) + else: + for ml_id in data[data_id].keys(): + if not isinstance(ml_id, int): + group_item.update({ml_id: data[data_id][ml_id]}) + else: + move_lines += [data[data_id][ml_id]] + move_lines = sorted(move_lines, key=lambda k: (k["date"])) + move_lines = self._recalculate_cumul_balance( + move_lines, + data[data_id]["init_bal"]["balance"], + rec_after_date_to_ids, + ) + group_item.update({"move_lines": move_lines}) + if ( + hide_account_at_0 + and float_is_zero( + data[data_id]["init_bal"]["balance"], + precision_rounding=rounding, + ) + and group_item["move_lines"] == [] + ): + continue + list_grouped += [group_item] + return account, list_grouped + + def _create_general_ledger( + self, + gen_led_data, + accounts_data, + grouped_by, + rec_after_date_to_ids, + hide_account_at_0, + ): + general_ledger = [] + rounding = self.env.company.currency_id.rounding + for acc_id in gen_led_data.keys(): + account = {} + account.update( + { + "code": accounts_data[acc_id]["code"], + "name": accounts_data[acc_id]["name"], + "type": "account", + "currency_id": accounts_data[acc_id]["currency_id"], + "centralized": accounts_data[acc_id]["centralized"], + "grouped_by": grouped_by, + } + ) + if grouped_by and not gen_led_data[acc_id][grouped_by]: + account = self._create_account( + account, acc_id, gen_led_data, rec_after_date_to_ids + ) + if ( + hide_account_at_0 + and float_is_zero( + gen_led_data[acc_id]["init_bal"]["balance"], + precision_rounding=rounding, + ) + and account["move_lines"] == [] + ): + continue + else: + if grouped_by: + account, list_grouped = self._get_list_grouped_item( + gen_led_data[acc_id], + account, + rec_after_date_to_ids, + hide_account_at_0, + rounding, + ) + account.update({"list_grouped": list_grouped}) + if ( + hide_account_at_0 + and float_is_zero( + gen_led_data[acc_id]["init_bal"]["balance"], + precision_rounding=rounding, + ) + and account["list_grouped"] == [] + ): + continue + else: + account = self._create_account_not_show_item( + account, acc_id, gen_led_data, rec_after_date_to_ids, grouped_by + ) + if ( + hide_account_at_0 + and float_is_zero( + gen_led_data[acc_id]["init_bal"]["balance"], + precision_rounding=rounding, + ) + and account["move_lines"] == [] + ): + continue + general_ledger += [account] + return general_ledger + + @api.model + def _calculate_centralization(self, centralized_ml, move_line, date_to): + jnl_id = move_line["journal_id"] + month = move_line["date"].month + if jnl_id not in centralized_ml.keys(): + centralized_ml[jnl_id] = {} + if month not in centralized_ml[jnl_id].keys(): + centralized_ml[jnl_id][month] = {} + last_day_month = calendar.monthrange(move_line["date"].year, month) + date = datetime.date(move_line["date"].year, month, last_day_month[1]) + if date > date_to: + date = date_to + centralized_ml[jnl_id][month].update( + { + "journal_id": jnl_id, + "ref_label": "Centralized entries", + "date": date, + "debit": 0.0, + "credit": 0.0, + "balance": 0.0, + "bal_curr": 0.0, + "partner_id": False, + "rec_id": 0, + "entry_id": False, + "tax_ids": [], + "tax_line_id": False, + "full_reconcile_id": False, + "id": False, + "currency_id": False, + "analytic_distribution": {}, + } + ) + centralized_ml[jnl_id][month]["debit"] += move_line["debit"] + centralized_ml[jnl_id][month]["credit"] += move_line["credit"] + centralized_ml[jnl_id][month]["balance"] += ( + move_line["debit"] - move_line["credit"] + ) + centralized_ml[jnl_id][month]["bal_curr"] += move_line["bal_curr"] + return centralized_ml + + @api.model + def _get_centralized_ml(self, account, date_to, grouped_by): + centralized_ml = {} + if isinstance(date_to, str): + date_to = datetime.datetime.strptime(date_to, "%Y-%m-%d").date() + if grouped_by and account[grouped_by]: + for item in account["list_grouped"]: + for move_line in item["move_lines"]: + centralized_ml = self._calculate_centralization( + centralized_ml, + move_line, + date_to, + ) + else: + for move_line in account["move_lines"]: + centralized_ml = self._calculate_centralization( + centralized_ml, + move_line, + date_to, + ) + list_centralized_ml = [] + for jnl_id in centralized_ml.keys(): + list_centralized_ml += list(centralized_ml[jnl_id].values()) + return list_centralized_ml + + @api.model + def _get_report_values(self, docids, data): + logging.info(f'@@@@ general_ledger ') + logging.info(f'@@@@---------------------------------------------------------------------------------------------- _get_report_values ') + logging.info(f'@@@@----------------------------------------------------------------------------------------------' ) + logging.info(f'@@@@---------------------------------------------------------------------------------------------- ') + logging.info(f'@@@@----------------------------------------------------------------------------------------------' ) + logging.info(f'@@@@---------------------------------------------------------------------------------------------- ') + logging.info(f'@@@@---------------------------------------------------------------------------------------------- ') + + wizard_id = data["wizard_id"] + company = self.env["res.company"].browse(data["company_id"]) + company_id = data["company_id"] + date_to = data["date_to"] + date_from = data["date_from"] + partner_ids = data["partner_ids"] + account_ids = data["account_ids"] + cost_center_ids = data["cost_center_ids"] + grouped_by = data["grouped_by"] + hide_account_at_0 = data["hide_account_at_0"] + foreign_currency = data["foreign_currency"] + only_posted_moves = data["only_posted_moves"] + unaffected_earnings_account = data["unaffected_earnings_account"] + fy_start_date = data["fy_start_date"] + extra_domain = data["domain"] + gen_ld_data = self._get_initial_balance_data( + account_ids, + partner_ids, + company_id, + date_from, + foreign_currency, + only_posted_moves, + unaffected_earnings_account, + fy_start_date, + cost_center_ids, + extra_domain, + grouped_by, + ) + centralize = data["centralize"] + ( + gen_ld_data, + accounts_data, + journals_data, + full_reconcile_data, + taxes_data, + analytic_data, + rec_after_date_to_ids, + ) = self._get_period_ml_data( + account_ids, + partner_ids, + company_id, + foreign_currency, + only_posted_moves, + date_from, + date_to, + gen_ld_data, + cost_center_ids, + extra_domain, + grouped_by, + ) + general_ledger = self._create_general_ledger( + gen_ld_data, + accounts_data, + grouped_by, + rec_after_date_to_ids, + hide_account_at_0, + ) + if centralize: + for account in general_ledger: + if account["centralized"]: + centralized_ml = self._get_centralized_ml( + account, date_to, grouped_by + ) + account["move_lines"] = centralized_ml + account["move_lines"] = self._recalculate_cumul_balance( + account["move_lines"], + gen_ld_data[account["id"]]["init_bal"]["balance"], + rec_after_date_to_ids, + ) + if grouped_by and account[grouped_by]: + account[grouped_by] = False + del account["list_grouped"] + general_ledger = sorted(general_ledger, key=lambda k: k["code"]) + logging.info(f'@@@@ general_ledger ') + logging.info(f'@@@@ general_ledger ') + logging.info(f'@@@@ general_ledger {general_ledger}') + logging.info(f'@@@@ general_ledger ') + logging.info(f'@@@@ general_ledger ') + if not general_ledger: + raise UserError(f'Проводок для формирования акта по введенным условиям не найдено.') + return { + "doc_ids": [wizard_id], + "doc_model": "general.ledger.act_revise.wizard", + "docs": self.env["general.ledger.act_revise.wizard"].browse(wizard_id), + "foreign_currency": data["foreign_currency"], + "company_name": company.display_name, + "company_currency": company.currency_id, + "currency_name": company.currency_id.name, + "date_from": data["date_from"], + "date_to": data["date_to"], + "only_posted_moves": data["only_posted_moves"], + "hide_account_at_0": data["hide_account_at_0"], + "show_cost_center": data["show_cost_center"], + "general_ledger": general_ledger, + "accounts_data": accounts_data, + "journals_data": journals_data, + "full_reconcile_data": full_reconcile_data, + "taxes_data": taxes_data, + "centralize": centralize, + "analytic_data": analytic_data, + "filter_partner_ids": True if partner_ids else False, + "currency_model": self.env["res.currency"], + } + + def _get_ml_fields(self): + return self.COMMON_ML_FIELDS + [ + "analytic_distribution", + "full_reconcile_id", + "tax_line_id", + "currency_id", + "credit", + "debit", + "amount_currency", + "balance", + "tax_ids", + "move_name", + ] diff --git a/l10n_ru_act_rev/report/general_ledger.xml b/l10n_ru_act_rev/report/general_ledger.xml new file mode 100644 index 00000000..25f17b56 --- /dev/null +++ b/l10n_ru_act_rev/report/general_ledger.xml @@ -0,0 +1,286 @@ + + + + + + + + + + + + + + + + + Акт сверки + general.ledger.act_revise.wizard + qweb-pdf + l10n_ru_act_rev.general_ledger + l10n_ru_act_rev.general_ledger + 'Акт сверки - %s' % (object.get_report_filename() or '') + + + + + Account financial report qweb paperformat + + custom + 297 + 210 + Landscape + 12 + 8 + 5 + 5 + + 10 + 110 + + + + + \ No newline at end of file diff --git a/l10n_ru_act_rev/report/layouts.xml b/l10n_ru_act_rev/report/layouts.xml new file mode 100644 index 00000000..e77d9c7b --- /dev/null +++ b/l10n_ru_act_rev/report/layouts.xml @@ -0,0 +1,34 @@ + + + + + diff --git a/l10n_ru_act_rev/security/ir.model.access.csv b/l10n_ru_act_rev/security/ir.model.access.csv new file mode 100644 index 00000000..96c02320 --- /dev/null +++ b/l10n_ru_act_rev/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_general_ledger_act_revise_wizard,general.ledger.act_revise.wizard,model_general_ledger_act_revise_wizard,base.group_user,1,1,1,1 diff --git a/l10n_ru_act_rev/views/account_account_views.xml b/l10n_ru_act_rev/views/account_account_views.xml new file mode 100644 index 00000000..b2523dff --- /dev/null +++ b/l10n_ru_act_rev/views/account_account_views.xml @@ -0,0 +1,13 @@ + + + + account.account.form.inherit + + account.account + form + + + + + + diff --git a/l10n_ru_act_rev/views/portal_templates.xml b/l10n_ru_act_rev/views/portal_templates.xml new file mode 100644 index 00000000..b7a1ff2e --- /dev/null +++ b/l10n_ru_act_rev/views/portal_templates.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/l10n_ru_act_rev/views/report_general_ledger.xml b/l10n_ru_act_rev/views/report_general_ledger.xml new file mode 100644 index 00000000..9e6945e7 --- /dev/null +++ b/l10n_ru_act_rev/views/report_general_ledger.xml @@ -0,0 +1,9 @@ + + + + diff --git a/l10n_ru_act_rev/wizard/__init__.py b/l10n_ru_act_rev/wizard/__init__.py new file mode 100644 index 00000000..c0d813c0 --- /dev/null +++ b/l10n_ru_act_rev/wizard/__init__.py @@ -0,0 +1,2 @@ +from . import abstract_wizard +from . import general_ledger_wizard diff --git a/l10n_ru_act_rev/wizard/abstract_wizard.py b/l10n_ru_act_rev/wizard/abstract_wizard.py new file mode 100644 index 00000000..216bae78 --- /dev/null +++ b/l10n_ru_act_rev/wizard/abstract_wizard.py @@ -0,0 +1,38 @@ +from odoo import models, fields + + +class AbstractWizard(models.AbstractModel): + _name = "act_revise.abstract_wizard" + _description = "Abstract Wizard" + + def _get_partner_ids_domain(self): + return [ + "&", + "|", + ("company_id", "=", self.company_id.id), + ("company_id", "=", False), + "|", + ("parent_id", "=", False), + ("is_company", "=", True), + ] + + def _default_partners(self): + context = self.env.context + if context.get("active_ids") and context.get("active_model") == "res.partner": + partners = self.env["res.partner"].browse(context["active_ids"]) + corp_partners = partners.filtered("parent_id") + partners -= corp_partners + partners |= corp_partners.mapped("commercial_partner_id") + return partners.ids + + company_id = fields.Many2one( + comodel_name="res.company", + default=lambda self: self.env.company.id, + required=False, + string="Компания", + ) + + def button_export_pdf(self): + self.ensure_one() + report_type = "qweb-pdf" + return self._export(report_type) \ No newline at end of file diff --git a/l10n_ru_act_rev/wizard/general_ledger_wizard.py b/l10n_ru_act_rev/wizard/general_ledger_wizard.py new file mode 100644 index 00000000..dd1f7168 --- /dev/null +++ b/l10n_ru_act_rev/wizard/general_ledger_wizard.py @@ -0,0 +1,897 @@ +import logging +import time +from ast import literal_eval +from odoo import _, api, fields, models +from odoo.tools import date_utils,pycompat +from pytils import dt,numeral +from datetime import datetime, date +import re +import urllib +from odoo.exceptions import UserError + +class GeneralLedgerReportWizard(models.TransientModel): + """General ledger report wizard.""" + + _name = "general.ledger.act_revise.wizard" + _description = "General Ledger Report Wizard" + _inherit = "act_revise.abstract_wizard" + + # date_range_id = fields.Many2one(comodel_name="date.range", string="Date range") + date_from = fields.Date(string="Начало даты", required=True, default=lambda self: self._init_date_from()) + date_to = fields.Date(string="Конец даты", required=True, default=fields.Date.context_today) + fy_start_date = fields.Date(compute="_compute_fy_start_date") + target_move = fields.Selection( + [("posted", "Все проведенные проводки"), ("all", "Все проводки")], + string="Цель операции", + required=True, + default="posted", + ) + account_ids = fields.Many2many( + comodel_name="account.account", string=_("Filter accounts") + ) + centralize = fields.Boolean(string=_("Activate centralization"), default=True) + hide_account_at_0 = fields.Boolean( + string=_("Hide account ending balance at 0"), + help=_("Use this filter to hide an account or a partner " + "with an ending balance at 0. " + "If partners are filtered, " + "debits and credits totals will not match the trial balance."), + ) + receivable_accounts_only = fields.Boolean() + payable_accounts_only = fields.Boolean() + partner_ids = fields.Many2many( + comodel_name="res.partner", + string=_("Filter partners"), + default=lambda self: self._default_partners(), + ) + account_journal_ids = fields.Many2many( + comodel_name="account.journal", string=_("Filter journals") + ) + cost_center_ids = fields.Many2many( + comodel_name="account.analytic.account", string=_("Filter cost centers") + ) + + not_only_one_unaffected_earnings_account = fields.Boolean(readonly=True) + foreign_currency = fields.Boolean( + string=_("Show foreign currency"), + help=_("Display foreign currency for move lines, unless " + "account currency is not setup through chart of accounts " + "will display initial and final balance in that currency."), + default=lambda self: self._default_foreign_currency(), + ) + account_code_from = fields.Many2one( + comodel_name="account.account", + help="Starting account in a range", + ) + account_code_to = fields.Many2one( + comodel_name="account.account", + help="Ending account in a range", + ) + grouped_by = fields.Selection( + selection=[("", "None"), ("partners", "Partners"), ("taxes", "Taxes")], + default="partners", + ) + show_cost_center = fields.Boolean( + string="Show Analytic Account", + default=True, + ) + domain = fields.Char( + string="Journal Items Domain", + default=[], + help="This domain will be used to select specific domain for Journal " "Items", + ) + + # def _print_report(self, report_type): + # self.ensure_one() + # data = self._prepare_report_general_ledger() + # report = self.env["ir.actions.report"].search( + # [("report_name", "=", "act_revise.general_ledger"), ("report_type", "=", report_type)], limit=1, ) + # if self.partner_ids[0].parent_id: + # partner = int(self.partner_ids[0].parent_id.id) + # else: + # partner = int(self.partner_ids[0].id) + # return { + # 'type': 'ir.actions.act_url', + # 'url': '/my/act_revise_contact/%s?date_to=%s&date_from=%s&target_move=%s&company=%s&partner=%s' % ( + # urllib.parse.quote(self.get_report_filename()), self.date_to, self.date_from, self.target_move, + # self.company_id.id, partner), + # 'target': 'new', + # } + + def _get_account_move_lines_domain(self): + domain = literal_eval(self.domain) if self.domain else [] + return domain + + @api.onchange("account_code_from", "account_code_to") + def on_change_account_range(self): + if ( + self.account_code_from + and self.account_code_from.code.isdigit() + and self.account_code_to + and self.account_code_to.code.isdigit() + ): + start_range = self.account_code_from.code + end_range = self.account_code_to.code + self.account_ids = self.env["account.account"].search( + [("code", ">=", start_range), ("code", "<=", end_range)] + ) + if self.company_id: + self.account_ids = self.account_ids.filtered( + lambda a: a.company_ids == self.company_id + ) + + def _init_date_from(self): + """set start date to begin of current year if fiscal year running""" + today = fields.Date.context_today(self) + company = self.company_id or self.env.company + last_fsc_month = company.fiscalyear_last_month + last_fsc_day = company.fiscalyear_last_day + + if ( + today.month < int(last_fsc_month) + or today.month == int(last_fsc_month) + and today.day <= last_fsc_day + ): + return time.strftime("%Y-01-01") + else: + return False + + def _default_foreign_currency(self): + return self.env.user.has_group("base.group_multi_currency") + + @api.depends("date_from") + def _compute_fy_start_date(self): + for wiz in self: + if wiz.date_from: + date_from, date_to = date_utils.get_fiscal_year( + wiz.date_from, + day=self.company_id.fiscalyear_last_day, + month=int(self.company_id.fiscalyear_last_month), + ) + wiz.fy_start_date = date_from + else: + wiz.fy_start_date = False + + @api.onchange("company_id") + def onchange_company_id(self): + """Handle company change.""" + count = self.env["account.account"].search_count( + [ + ("account_type", "=", "equity_unaffected"), + ("company_ids", "=", self.company_id.id), + ] + ) + self.not_only_one_unaffected_earnings_account = count != 1 + # if ( + # self.company_id + # and self.date_range_id.company_id + # and self.date_range_id.company_id != self.company_id + # ): + # self.date_range_id = False + if self.company_id and self.account_journal_ids: + self.account_journal_ids = self.account_journal_ids.filtered( + lambda p: p.company_id == self.company_id or not p.company_id + ) + if self.company_id and self.partner_ids: + self.partner_ids = self.partner_ids.filtered( + lambda p: p.company_id == self.company_id or not p.company_id + ) + if self.company_id and self.account_ids: + if self.receivable_accounts_only or self.payable_accounts_only: + self.onchange_type_accounts_only() + else: + self.account_ids = self.account_ids.filtered( + lambda a: a.company_ids == self.company_id + ) + if self.company_id and self.cost_center_ids: + self.cost_center_ids = self.cost_center_ids.filtered( + lambda c: c.company_id == self.company_id + ) + res = { + "domain": { + "account_ids": [], + "partner_ids": [], + "account_journal_ids": [], + "cost_center_ids": [], + # "date_range_id": [], + } + } + if not self.company_id: + return res + else: + res["domain"]["account_ids"] += [("company_ids", "=", self.company_id.id)] + res["domain"]["account_journal_ids"] += [ + ("company_ids", "=", self.company_id.id) + ] + res["domain"]["partner_ids"] += self._get_partner_ids_domain() + res["domain"]["cost_center_ids"] += [ + ("company_id", "=", self.company_id.id) + ] + # res["domain"]["date_range_id"] += [ + # "|", + # ("company_id", "=", self.company_id.id), + # ("company_id", "=", False), + # ] + return res + + # @api.onchange("date_range_id") + # def onchange_date_range_id(self): + # """Handle date range change.""" + # if self.date_range_id: + # self.date_from = self.date_range_id.date_start + # self.date_to = self.date_range_id.date_end + + # @api.constrains("company_id", "date_range_id") + # def _check_company_id_date_range_id(self): + # for rec in self.sudo(): + # if ( + # rec.company_id + # and rec.date_range_id.company_id + # and rec.company_id != rec.date_range_id.company_id + # ): + # raise ValidationError( + # _( + # "The Company in the General Ledger Report Wizard and in " + # "Date Range must be the same." + # ) + # ) + + @api.onchange("receivable_accounts_only", "payable_accounts_only") + def onchange_type_accounts_only(self): + """Handle receivable/payable accounts only change.""" + if self.receivable_accounts_only or self.payable_accounts_only: + domain = [("company_ids", "=", self.company_id.id)] + if self.receivable_accounts_only and self.payable_accounts_only: + domain += [ + ("account_type", "in", ("asset_receivable", "liability_payable")) + ] + elif self.receivable_accounts_only: + domain += [("account_type", "=", "asset_receivable")] + elif self.payable_accounts_only: + domain += [("account_type", "=", "liability_payable")] + self.account_ids = self.env["account.account"].search(domain) + else: + self.account_ids = None + + @api.onchange("partner_ids") + def onchange_partner_ids(self): + """Handle partners change.""" + if self.partner_ids: + self.receivable_accounts_only = self.payable_accounts_only = True + else: + self.receivable_accounts_only = self.payable_accounts_only = False + + @api.depends("company_id") + def _compute_unaffected_earnings_account(self): + for record in self: + record.unaffected_earnings_account = self.env["account.account"].search( + [ + ("account_type", "=", "equity_unaffected"), + ("company_ids", "=", record.company_id.id), + ] + ) + + unaffected_earnings_account = fields.Many2one( + comodel_name="account.account", + compute="_compute_unaffected_earnings_account", + store=True, + ) + + # def _print_report(self, report_type): + # self.ensure_one() + # data = self._prepare_report_general_ledger() + # report_name = "act_revise.general_ledger" + # return ( + # self.env["ir.actions.report"] + # .search( + # [("report_name", "=", report_name), ("report_type", "=", report_type)], + # limit=1, + # ) + # .report_action(self, data=data) + # ) + def _print_report(self, report_type): + self.ensure_one() + data = self._prepare_report_general_ledger() + report = self.env["ir.actions.report"].search( + [("report_name", "=", "l10n_ru_act_rev.general_ledger"), ("report_type", "=", report_type)], limit=1, ) + + if self.partner_ids[0].parent_id: + partner = int(self.partner_ids[0].parent_id.id) + else: + partner = int(self.partner_ids[0].id) + account_data = self.env['account.move.line'].sudo().search([ + ('partner_id', '=', partner), + ('account_id.account_type', 'in', ('liability_payable', 'asset_receivable')), + ('account_id.non_trade', '=', False), + ('date', '<=', self.date_to), + ('date', '>=', self.date_from) + ]) + if self.target_move == 'posted' and not account_data.filtered(lambda p: p.parent_state == 'posted') or not account_data: + raise UserError(f'Проводок для формирования акта по введенным условиям не найдено.') + return { + 'type': 'ir.actions.act_url', + 'url': '/my/act_revise_contact/%s?date_to=%s&date_from=%s&target_move=%s&company=%s&partner=%s' % ( + urllib.parse.quote(self.get_report_filename()), self.date_to, self.date_from, self.target_move, + self.company_id.id, partner), + 'target': 'new', + } + + def _prepare_report_general_ledger(self): + self.ensure_one() + return { + "wizard_id": self.id, + "date_from": self.date_from, + "date_to": self.date_to, + "only_posted_moves": self.target_move == "posted", + "hide_account_at_0": self.hide_account_at_0, + "foreign_currency": self.foreign_currency, + "company_id": self.company_id.id, + "account_ids": self.account_ids.ids, + "partner_ids": self.partner_ids.ids, + "grouped_by": self.grouped_by, + "cost_center_ids": self.cost_center_ids.ids, + "show_cost_center": self.show_cost_center, + "journal_ids": self.account_journal_ids.ids, + "centralize": self.centralize, + "fy_start_date": self.fy_start_date, + "unaffected_earnings_account": self.unaffected_earnings_account.id, + "account_financial_report_lang": self.env.lang, + "domain": self._get_account_move_lines_domain(), + } + + def _export(self, report_type): + """Default export is PDF.""" + return self._print_report(report_type) + + def _get_atr_from_dict(self, obj_id, data, key): + try: + return data[obj_id][key] + except KeyError: + return data[str(obj_id)][key] + + def numer(self, name): + if name: + numeration = re.findall('\d+$', name) + if numeration: return numeration[0] + return name + + def get_data_format(self, date): + if date and date != 'False': + return dt.ru_strftime(u'%d.%m.%Y г.', date=datetime.strptime(str(date), "%Y-%m-%d"), inflected=True) + return '' + + def initials(self, fio): + if fio: + return (fio.split()[0] + ' ' + ''.join([fio[0:1] + '.' for fio in fio.split()[1:]])).strip() + return '' + + def rubles(self, sum): + "Transform sum number in rubles to text" + text_rubles = numeral.rubles(int(sum)) + copeck = round((sum - int(sum)) * 100) + text_copeck = numeral.choose_plural(int(copeck), (u"копейка", u"копейки", u"копеек")) + return ("%s %02d %s") % (text_rubles, copeck, text_copeck) + + def img(self, img, type='png', width=0, height=0): + if width: + width = "width='%spx'" % (width) + else: + width = " " + if height: + height = "height='%spx'" % (height) + else: + height = " " + toreturn = "" % ( + width, + height, + type, + str(pycompat.to_text(img))) + return toreturn + + def get_contract(self): + partner = int(self.partner_ids[0].id) + contract = self.env['partner.contract.customer'].search( + [('partner_id', '=', partner), ('state', '=', 'signed')], limit=1) + if contract: + return contract + + def get_function_partner(self, partner): + director = self.env['res.partner'].search([('parent_id', '=', partner), ('type', '=', 'director')], limit=1) + if director: + if director.function: + return director.function or 'отсутствует' + + def get_name_partner(self, partner): + director = self.env['res.partner'].search([('parent_id', '=', partner), ('type', '=', 'director')], limit=1) + if director: + return director.name or 'отсутствует' + + def get_report_filename(self): + today = date.today() + d1 = today.strftime("%d-%m-%Y") + if self.partner_ids[0].parent_id: + p = ''.join(self.partner_ids[0].parent_id.name) + else: + p = ''.join(self.partner_ids[0].name) + # return 'Акт Сверки '+ d1 + ' ' + self.company_id.name+'_'+p + return str(self.company_id.id) + ' - ' + ' ' + d1 + + def sorted_lines(self, list): + list = sorted(list, key=lambda k: k.get('date'), reverse=False) + return list + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# +# import time +# from ast import literal_eval +# from odoo import _, api, fields, models +# from odoo.tools import date_utils,pycompat +# from pytils import dt,numeral +# from datetime import datetime, date +# import re +# import urllib +# +# class GeneralLedgerReportWizard(models.TransientModel): +# """General ledger report wizard.""" +# +# _name = "general.ledger.act_revise.wizard" +# _description = "General Ledger Report Wizard" +# _inherit = "act_revise.abstract_wizard" +# +# # date_range_id = fields.Many2one(comodel_name="date.range", string="Date range") +# date_from = fields.Date(string="Начало даты", required=True, default=lambda self: self._init_date_from()) +# date_to = fields.Date(string="Конец даты", required=True, default=fields.Date.context_today) +# fy_start_date = fields.Date(compute="_compute_fy_start_date") +# target_move = fields.Selection( +# [("posted", "Р’СЃРµ проведенные РїСЂРѕРІРѕРґРєРё"), ("all", "Р’СЃРµ РїСЂРѕРІРѕРґРєРё")], +# string="Цель операции", +# required=True, +# default="posted", +# ) +# account_ids = fields.Many2many( +# comodel_name="account.account", string=_("Filter accounts") +# ) +# centralize = fields.Boolean(string=_("Activate centralization"), default=True) +# hide_account_at_0 = fields.Boolean( +# string=_("Hide account ending balance at 0"), +# help=_("Use this filter to hide an account or a partner " +# "with an ending balance at 0. " +# "If partners are filtered, " +# "debits and credits totals will not match the trial balance."), +# ) +# receivable_accounts_only = fields.Boolean() +# payable_accounts_only = fields.Boolean() +# partner_ids = fields.Many2many( +# comodel_name="res.partner", +# string=_("Filter partners"), +# default=lambda self: self._default_partners(), +# ) +# account_journal_ids = fields.Many2many( +# comodel_name="account.journal", string=_("Filter journals") +# ) +# cost_center_ids = fields.Many2many( +# comodel_name="account.analytic.account", string=_("Filter cost centers") +# ) +# +# not_only_one_unaffected_earnings_account = fields.Boolean(readonly=True) +# foreign_currency = fields.Boolean( +# string=_("Show foreign currency"), +# help=_("Display foreign currency for move lines, unless " +# "account currency is not setup through chart of accounts " +# "will display initial and final balance in that currency."), +# default=lambda self: self._default_foreign_currency(), +# ) +# account_code_from = fields.Many2one( +# comodel_name="account.account", +# help="Starting account in a range", +# ) +# account_code_to = fields.Many2one( +# comodel_name="account.account", +# help="Ending account in a range", +# ) +# grouped_by = fields.Selection( +# selection=[("", "None"), ("partners", "Partners"), ("taxes", "Taxes")], +# default="partners", +# ) +# show_cost_center = fields.Boolean( +# string="Show Analytic Account", +# default=True, +# ) +# domain = fields.Char( +# string="Journal Items Domain", +# default=[], +# help="This domain will be used to select specific domain for Journal " "Items", +# ) +# +# # def _print_report(self, report_type): +# # self.ensure_one() +# # data = self._prepare_report_general_ledger() +# # report = self.env["ir.actions.report"].search( +# # [("report_name", "=", "act_revise.general_ledger"), ("report_type", "=", report_type)], limit=1, ) +# # if self.partner_ids[0].parent_id: +# # partner = int(self.partner_ids[0].parent_id.id) +# # else: +# # partner = int(self.partner_ids[0].id) +# # return { +# # 'type': 'ir.actions.act_url', +# # 'url': '/my/act_revise_contact/%s?date_to=%s&date_from=%s&target_move=%s&company=%s&partner=%s' % ( +# # urllib.parse.quote(self.get_report_filename()), self.date_to, self.date_from, self.target_move, +# # self.company_id.id, partner), +# # 'target': 'new', +# # } +# +# def _get_account_move_lines_domain(self): +# domain = literal_eval(self.domain) if self.domain else [] +# return domain +# +# @api.onchange("account_code_from", "account_code_to") +# def on_change_account_range(self): +# if ( +# self.account_code_from +# and self.account_code_from.code.isdigit() +# and self.account_code_to +# and self.account_code_to.code.isdigit() +# ): +# start_range = self.account_code_from.code +# end_range = self.account_code_to.code +# self.account_ids = self.env["account.account"].search( +# [("code", ">=", start_range), ("code", "<=", end_range)] +# ) +# if self.company_id: +# self.account_ids = self.account_ids.filtered( +# lambda a: a.company_id == self.company_id +# ) +# +# def _init_date_from(self): +# """set start date to begin of current year if fiscal year running""" +# today = fields.Date.context_today(self) +# company = self.company_id or self.env.company +# last_fsc_month = company.fiscalyear_last_month +# last_fsc_day = company.fiscalyear_last_day +# +# if ( +# today.month < int(last_fsc_month) +# or today.month == int(last_fsc_month) +# and today.day <= last_fsc_day +# ): +# return time.strftime("%Y-01-01") +# else: +# return False +# +# def _default_foreign_currency(self): +# return self.env.user.has_group("base.group_multi_currency") +# +# @api.depends("date_from") +# def _compute_fy_start_date(self): +# for wiz in self: +# if wiz.date_from: +# date_from, date_to = date_utils.get_fiscal_year( +# wiz.date_from, +# day=self.company_id.fiscalyear_last_day, +# month=int(self.company_id.fiscalyear_last_month), +# ) +# wiz.fy_start_date = date_from +# else: +# wiz.fy_start_date = False +# +# @api.onchange("company_id") +# def onchange_company_id(self): +# """Handle company change.""" +# count = self.env["account.account"].search_count( +# [ +# ("account_type", "=", "equity_unaffected"), +# ("company_id", "=", self.company_id.id), +# ] +# ) +# self.not_only_one_unaffected_earnings_account = count != 1 +# # if ( +# # self.company_id +# # and self.date_range_id.company_id +# # and self.date_range_id.company_id != self.company_id +# # ): +# # self.date_range_id = False +# if self.company_id and self.account_journal_ids: +# self.account_journal_ids = self.account_journal_ids.filtered( +# lambda p: p.company_id == self.company_id or not p.company_id +# ) +# if self.company_id and self.partner_ids: +# self.partner_ids = self.partner_ids.filtered( +# lambda p: p.company_id == self.company_id or not p.company_id +# ) +# if self.company_id and self.account_ids: +# if self.receivable_accounts_only or self.payable_accounts_only: +# self.onchange_type_accounts_only() +# else: +# self.account_ids = self.account_ids.filtered( +# lambda a: a.company_id == self.company_id +# ) +# if self.company_id and self.cost_center_ids: +# self.cost_center_ids = self.cost_center_ids.filtered( +# lambda c: c.company_id == self.company_id +# ) +# res = { +# "domain": { +# "account_ids": [], +# "partner_ids": [], +# "account_journal_ids": [], +# "cost_center_ids": [], +# # "date_range_id": [], +# } +# } +# if not self.company_id: +# return res +# else: +# res["domain"]["account_ids"] += [("company_id", "=", self.company_id.id)] +# res["domain"]["account_journal_ids"] += [ +# ("company_id", "=", self.company_id.id) +# ] +# res["domain"]["partner_ids"] += self._get_partner_ids_domain() +# res["domain"]["cost_center_ids"] += [ +# ("company_id", "=", self.company_id.id) +# ] +# # res["domain"]["date_range_id"] += [ +# # "|", +# # ("company_id", "=", self.company_id.id), +# # ("company_id", "=", False), +# # ] +# return res +# +# # @api.onchange("date_range_id") +# # def onchange_date_range_id(self): +# # """Handle date range change.""" +# # if self.date_range_id: +# # self.date_from = self.date_range_id.date_start +# # self.date_to = self.date_range_id.date_end +# +# # @api.constrains("company_id", "date_range_id") +# # def _check_company_id_date_range_id(self): +# # for rec in self.sudo(): +# # if ( +# # rec.company_id +# # and rec.date_range_id.company_id +# # and rec.company_id != rec.date_range_id.company_id +# # ): +# # raise ValidationError( +# # _( +# # "The Company in the General Ledger Report Wizard and in " +# # "Date Range must be the same." +# # ) +# # ) +# +# @api.onchange("receivable_accounts_only", "payable_accounts_only") +# def onchange_type_accounts_only(self): +# """Handle receivable/payable accounts only change.""" +# if self.receivable_accounts_only or self.payable_accounts_only: +# domain = [("company_id", "=", self.company_id.id)] +# if self.receivable_accounts_only and self.payable_accounts_only: +# domain += [ +# ("account_type", "in", ("asset_receivable", "liability_payable")) +# ] +# elif self.receivable_accounts_only: +# domain += [("account_type", "=", "asset_receivable")] +# elif self.payable_accounts_only: +# domain += [("account_type", "=", "liability_payable")] +# self.account_ids = self.env["account.account"].search(domain) +# else: +# self.account_ids = None +# +# @api.onchange("partner_ids") +# def onchange_partner_ids(self): +# """Handle partners change.""" +# if self.partner_ids: +# self.receivable_accounts_only = self.payable_accounts_only = True +# else: +# self.receivable_accounts_only = self.payable_accounts_only = False +# +# @api.depends("company_id") +# def _compute_unaffected_earnings_account(self): +# for record in self: +# record.unaffected_earnings_account = self.env["account.account"].search( +# [ +# ("account_type", "=", "equity_unaffected"), +# ("company_id", "=", record.company_id.id), +# ] +# ) +# +# unaffected_earnings_account = fields.Many2one( +# comodel_name="account.account", +# compute="_compute_unaffected_earnings_account", +# store=True, +# ) +# +# # def _print_report(self, report_type): +# # self.ensure_one() +# # data = self._prepare_report_general_ledger() +# # report_name = "act_revise.general_ledger" +# # return ( +# # self.env["ir.actions.report"] +# # .search( +# # [("report_name", "=", report_name), ("report_type", "=", report_type)], +# # limit=1, +# # ) +# # .report_action(self, data=data) +# # ) +# def _print_report(self, report_type): +# self.ensure_one() +# data = self._prepare_report_general_ledger() +# report = self.env["ir.actions.report"].search( +# [("report_name", "=", "act_revise.general_ledger"), ("report_type", "=", report_type)], limit=1, ) +# # report.report_name='Test' +# # report.headers.add('Content-Disposition', 'attachment; filename="Test.pdf";') +# # pdf, _ = request.env.ref('act_revise.action_print_report_general_ledger_qweb').sudo().render_qweb_pdf(self,data=data) +# # pdfhttpheaders = [('Content-Type', 'application/pdf'), ('Content-Length', len(pdf)),('Content-Disposition', 'attachment; filename="%s";' % report_name),] +# # return request.make_response(pdf, headers=pdfhttpheaders) +# # return ( +# # self.env["ir.actions.report"] +# # .search( +# # [("report_name", "=", "act_revise.general_ledger"), ("report_type", "=", report_type)], +# # limit=1, +# # ) +# # report.report_action(self, data=data) +# # ) +# # name='Test' +# if self.partner_ids[0].parent_id: +# partner = int(self.partner_ids[0].parent_id.id) +# else: +# partner = int(self.partner_ids[0].id) +# account_data = self.env['account.move.line'].sudo().search([ +# ('partner_id', '=', partner.id), +# ('account_id.account_type', 'in', ('liability_payable', 'asset_receivable')), +# ('account_id.non_trade', '=', False), +# ('date', '<=', self.date_to), +# ('date', '>=', self.date_from) +# ]) +# if not account_data: +# raise UserError(f'Проводок для формирования акта по введенным условиям не найдено.') +# return { +# 'type': 'ir.actions.act_url', +# 'url': '/my/act_revise_contact/%s?date_to=%s&date_from=%s&target_move=%s&company=%s&partner=%s' % ( +# urllib.parse.quote(self.get_report_filename()), self.date_to, self.date_from, self.target_move, +# self.company_id.id, partner), +# 'target': 'new', +# } +# +# def _prepare_report_general_ledger(self): +# self.ensure_one() +# return { +# "wizard_id": self.id, +# "date_from": self.date_from, +# "date_to": self.date_to, +# "only_posted_moves": self.target_move == "posted", +# "hide_account_at_0": self.hide_account_at_0, +# "foreign_currency": self.foreign_currency, +# "company_id": self.company_id.id, +# "account_ids": self.account_ids.ids, +# "partner_ids": self.partner_ids.ids, +# "grouped_by": self.grouped_by, +# "cost_center_ids": self.cost_center_ids.ids, +# "show_cost_center": self.show_cost_center, +# "journal_ids": self.account_journal_ids.ids, +# "centralize": self.centralize, +# "fy_start_date": self.fy_start_date, +# "unaffected_earnings_account": self.unaffected_earnings_account.id, +# "account_financial_report_lang": self.env.lang, +# "domain": self._get_account_move_lines_domain(), +# } +# +# def _export(self, report_type): +# """Default export is PDF.""" +# return self._print_report(report_type) +# +# def _get_atr_from_dict(self, obj_id, data, key): +# try: +# return data[obj_id][key] +# except KeyError: +# return data[str(obj_id)][key] +# +# def numer(self, name): +# if name: +# numeration = re.findall('\d+$', name) +# if numeration: return numeration[0] +# return name +# +# def get_data_format(self, date): +# if date and date != 'False': +# return dt.ru_strftime(u'%d.%m.%Y Рі.', date=datetime.strptime(str(date), "%Y-%m-%d"), inflected=True) +# return '' +# +# def initials(self, fio): +# if fio: +# return (fio.split()[0] + ' ' + ''.join([fio[0:1] + '.' for fio in fio.split()[1:]])).strip() +# return '' +# +# def rubles(self, sum): +# "Transform sum number in rubles to text" +# text_rubles = numeral.rubles(int(sum)) +# copeck = round((sum - int(sum)) * 100) +# text_copeck = numeral.choose_plural(int(copeck), (u"копейка", u"копейки", u"копеек")) +# return ("%s %02d %s") % (text_rubles, copeck, text_copeck) +# +# def img(self, img, type='png', width=0, height=0): +# if width: +# width = "width='%spx'" % (width) +# else: +# width = " " +# if height: +# height = "height='%spx'" % (height) +# else: +# height = " " +# toreturn = "" % ( +# width, +# height, +# type, +# str(pycompat.to_text(img))) +# return toreturn +# +# def get_contract(self): +# partner = int(self.partner_ids[0].id) +# contract = self.env['partner.contract.customer'].search( +# [('partner_id', '=', partner), ('state', '=', 'signed')], limit=1) +# if contract: +# return contract +# +# def get_function_partner(self, partner): +# director = self.env['res.partner'].search([('parent_id', '=', partner), ('type', '=', 'director')], limit=1) +# if director: +# if director.function: +# return director.function or 'отсутствует' +# +# def get_name_partner(self, partner): +# director = self.env['res.partner'].search([('parent_id', '=', partner), ('type', '=', 'director')], limit=1) +# if director: +# return director.name or 'отсутствует' +# +# def get_report_filename(self): +# today = date.today() +# d1 = today.strftime("%d-%m-%Y") +# if self.partner_ids[0].parent_id: +# p = ''.join(self.partner_ids[0].parent_id.name) +# else: +# p = ''.join(self.partner_ids[0].name) +# # return 'РђРєС‚ Сверки '+ d1 + ' ' + self.company_id.name+'_'+p +# return str(self.company_id.id) + ' - ' + ' ' + d1 +# +# def sorted_lines(self, list): +# list = sorted(list, key=lambda k: k.get('date'), reverse=False) +# return list diff --git a/l10n_ru_act_rev/wizard/general_ledger_wizard_view.xml b/l10n_ru_act_rev/wizard/general_ledger_wizard_view.xml new file mode 100644 index 00000000..03c513b8 --- /dev/null +++ b/l10n_ru_act_rev/wizard/general_ledger_wizard_view.xml @@ -0,0 +1,167 @@ + + + + + Акт сверки + general.ledger.act_revise.wizard + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +

+ General Ledger can be computed only if selected company have + only one unaffected earnings account. +

+ +
+
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + Акт сверки + general.ledger.act_revise.wizard + form + + new + + + + Печатать акт сверки + general.ledger.act_revise.wizard + + form + {'default_receivable_accounts_only': 1, 'default_payable_accounts_only': 1} + + new + + + + +
diff --git a/l10n_ru_advance_payments/README.md b/l10n_ru_advance_payments/README.md new file mode 100644 index 00000000..c595d9d8 --- /dev/null +++ b/l10n_ru_advance_payments/README.md @@ -0,0 +1,16 @@ +# Российская локализация - Авансовые платежи +name: l10n_ru_advance_payments + +## Описание +Модуль, добавляющий функционал ведения учета авансовых платежей, обеспечивает создание авансового счета на основе заказа продаж и последующее формирование к этому счету авансовых платежей. Он позволяет автоматически связывать авансовые платежи с соответствующими заказами и счетами, обеспечивая прозрачный и удобный учет предоплат в рамках бизнес-процессов. Благодаря этому модулю упрощается контроль за поступлением авансов, их распределением и учетом в финансовой отчетности, что повышает точность и эффективность управления денежными потоками. + + +### Создание авансового платежа: +1. Меню Продажи - выбираем нужный Заказ продаж - кнопка "Авансовый счет"; +2. На форме проверяем информацию (при необходимости корректируем) и подтверждаем его нажатием на кнопку "Подтвердить"; +3. При нажатии на кнопку "Регистрация платежа" откроется визард, где по умолчанию проставляется вся сумма счета. При необходимости редактируется на сумму фактического платежа. Добавленный платеж отображается на вкладке "Доп. информация". Там же отображается остаток долга по счету.; +4. При повторном создании платежа к тому же счету планируемая сумма платежа будет равна остатку долга по счету и так же может быть скорректирована. + + +### Для печати: +1. Открываем созданную запись счета - Действие - "Счет" (или "Счет по форме 1С") \ No newline at end of file diff --git a/l10n_ru_advance_payments/__init__.py b/l10n_ru_advance_payments/__init__.py new file mode 100644 index 00000000..0f777752 --- /dev/null +++ b/l10n_ru_advance_payments/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- + +from . import models +from . import wizard +from . import report diff --git a/l10n_ru_advance_payments/__manifest__.py b/l10n_ru_advance_payments/__manifest__.py new file mode 100644 index 00000000..f61f47e2 --- /dev/null +++ b/l10n_ru_advance_payments/__manifest__.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +{ + 'name': 'Российская локализация - Авансовые счета', + 'version': '19.0.2025.06.06', + 'description': """Модуль создания новой модели - Авансовые счета. Он добавляет функционал построенный на базовых + функциях бухгалтерии.""", + + 'author': "MK.Lab", + 'website': "https://www.inf-centre.ru/", + + 'depends': ['account', + 'sale', + 'l10n_ru_contract', + 'l10n_ru_doc', + 'l10n_latam_check' + ], + + 'data': [ + 'security/ir.model.access.csv', + 'data/data.xml', + 'views/order_prepaid.xml', + 'views/sale_order.xml', + 'report/order_prepaid.xml', + 'report/report_order_prepaid.xml', + 'report/report_invoice.xml', + 'wizard/account_payment_register_prepaid.xml', + 'views/res_config_settings.xml', + ], + + "external_dependencies": { + "python": [ + "pytils" + ] + }, + "demo": [ + "demo/demo.xml", + ], +} diff --git a/l10n_ru_advance_payments/data/data.xml b/l10n_ru_advance_payments/data/data.xml new file mode 100644 index 00000000..55ffdb9d --- /dev/null +++ b/l10n_ru_advance_payments/data/data.xml @@ -0,0 +1,9 @@ + + + Order Prepaid Нумерация + order.prepaid + OP/ + 5 + + + \ No newline at end of file diff --git a/l10n_ru_advance_payments/demo/demo.xml b/l10n_ru_advance_payments/demo/demo.xml new file mode 100644 index 00000000..a9589a5f --- /dev/null +++ b/l10n_ru_advance_payments/demo/demo.xml @@ -0,0 +1,51 @@ + + + + + + + + АС-2026-001 + + 2026-01-15 + 2026-01-30 + + inbound + draft + + + + + + Предоплата за товар + 1.0 + 150000.0 + + + + Предоплата за доставку + 1.0 + 5000.0 + + + + + АС-2026-002 + + 2026-01-20 + 2026-02-05 + + outbound + draft + + + + + Аванс поставщику за сырьё + 10.0 + 8000.0 + + + + diff --git a/l10n_ru_advance_payments/i18n/ru.po b/l10n_ru_advance_payments/i18n/ru.po new file mode 100644 index 00000000..05500e35 --- /dev/null +++ b/l10n_ru_advance_payments/i18n/ru.po @@ -0,0 +1,917 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_ru_advance_payments +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e-20241220\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-06-06 14:28+0000\n" +"PO-Revision-Date: 2025-06-06 14:28+0000\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: l10n_ru_advance_payments +#: model:ir.actions.report,print_report_name:l10n_ru_advance_payments.report_order_prepaid_invoice +msgid "" +"'Счет - %s ' % ((object.name if object.name else '')+' '+(object.partner_id.parent_id.name if\n" +" object.partner_id.parent_id else object.partner_id.name))" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.actions.report,print_report_name:l10n_ru_advance_payments.action_report_orderprepaid +msgid "" +"'Счет - %s ' % (str(object.name)+' '+(str(object.partner_id.parent_id.name) if\n" +" object.partner_id.parent_id else str(object.partner_id.name)))\n" +" " +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.report_order_prepaid +msgid ", на сумму" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.form_order_prepaid_view +msgid "" +"\n" +" Draft\n" +" " +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.template_order_prepaid_invoice_body +msgid "Адрес банка:" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.template_order_prepaid_invoice_body +msgid "Адрес бенефициара:" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.template_order_prepaid_invoice_body +msgid "БИК:" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.template_order_prepaid_invoice_body +msgid "Банк:" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.template_order_prepaid_invoice_body +msgid "Бенефициар:" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.template_order_prepaid_invoice_body +msgid "ИНН:" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.template_order_prepaid_invoice_body +msgid "Номер счета/IBAN:" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.template_order_prepaid_invoice_body +msgid "Количество" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.template_order_prepaid_invoice_body +msgid "Налог" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.template_order_prepaid_invoice_body +msgid "Описание" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.template_order_prepaid_invoice_body +msgid "Сумма" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.template_order_prepaid_invoice_body +msgid "Счет" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.template_order_prepaid_invoice_body +msgid "Цена за ед.изм." +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.template_order_prepaid_invoice_body +msgid "Подытог" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.template_order_prepaid_invoice_body +msgid "Всего" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.template_order_prepaid_invoice_body +msgid "" +"Выдано:\n" +"
" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.template_order_prepaid_invoice_body +msgid "" +"Дата счета:\n" +"
\n" +" Срок оплаты:" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__message_needaction +msgid "Action Needed" +msgstr "Требуется действие" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__activity_ids +msgid "Activities" +msgstr "Действия" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "Оформление исключения активности" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__activity_state +msgid "Activity State" +msgstr "Состояние активности" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__activity_type_icon +msgid "Activity Type Icon" +msgstr "Иконка типа активности" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid_line__analytic_distribution_search +msgid "Analytic Distribution Search" +msgstr "Поиск аналитического распределения" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid_line__analytic_precision +msgid "Analytic Precision" +msgstr "Точность аналитики" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__message_attachment_count +msgid "Attachment Count" +msgstr "Количество вложений" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_sale_order_line__bool_const_bill +msgid "Bool Const Bill" +msgstr "Логическая константа счета" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_sale_order_line__bool_const_bill_bill +msgid "Bool Const Bill Bill" +msgstr "Логическая константа счета счет" + +#. module: l10n_ru_advance_payments +#: model:ir.model,name:l10n_ru_advance_payments.model_res_company +msgid "Companies" +msgstr "Компании" + +#. module: l10n_ru_advance_payments +#: model:ir.model,name:l10n_ru_advance_payments.model_res_config_settings +msgid "Config Settings" +msgstr "Параметры конфигурации" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__create_uid +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid_line__create_uid +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_payment_register_prepaid__create_uid +msgid "Created by" +msgstr "Создано" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__create_date +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid_line__create_date +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_payment_register_prepaid__create_date +msgid "Created on" +msgstr "Создано" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid_line__currency_id +msgid "Currency" +msgstr "Валюта" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__display_name +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid_line__display_name +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_payment_register_prepaid__display_name +msgid "Display Name" +msgstr "Отображаемое имя" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.form_order_prepaid_view +msgid "Draft" +msgstr "Черновик" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__message_follower_ids +msgid "Followers" +msgstr "Подписчики" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__message_partner_ids +msgid "Followers (Partners)" +msgstr "Подписчики (Партнеры)" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,help:l10n_ru_advance_payments.field_order_prepaid__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "Иконка Font Awesome, например fa-tasks" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__has_message +msgid "Has Message" +msgstr "Есть сообщение" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__activity_exception_icon +msgid "Icon" +msgstr "Иконка" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,help:l10n_ru_advance_payments.field_order_prepaid__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "Иконка для обозначения исключительной активности." + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,help:l10n_ru_advance_payments.field_order_prepaid__message_needaction +msgid "If checked, new messages require your attention." +msgstr "Если отмечено, новые сообщения требуют вашего внимания." + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,help:l10n_ru_advance_payments.field_order_prepaid__message_has_error +#: model:ir.model.fields,help:l10n_ru_advance_payments.field_order_prepaid__message_has_sms_error +msgid "If checked, some messages have a delivery error." +msgstr "Если отмечено, некоторые сообщения имеют ошибку доставки." + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__invoice_partner_display_name +msgid "Invoice Partner Display Name" +msgstr "Отображаемое имя партнера по счету" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__message_is_follower +msgid "Is Follower" +msgstr "Является подписчиком" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__write_uid +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid_line__write_uid +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_payment_register_prepaid__write_uid +msgid "Last Updated by" +msgstr "Последнее изменение внесено" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__write_date +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid_line__write_date +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_payment_register_prepaid__write_date +msgid "Last Updated on" +msgstr "Дата последнего изменения" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__message_has_error +msgid "Message Delivery error" +msgstr "Ошибка доставки сообщения" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__message_ids +msgid "Messages" +msgstr "Сообщения" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "Срок выполнения моего действия" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__activity_calendar_event_id +msgid "Next Activity Calendar Event" +msgstr "Следующее событие календаря действий" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "Срок следующего действия" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__activity_summary +msgid "Next Activity Summary" +msgstr "Краткое описание следующего действия" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__activity_type_id +msgid "Next Activity Type" +msgstr "Тип следующего действия" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__message_needaction_counter +msgid "Number of Actions" +msgstr "Количество действий" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__message_has_error_counter +msgid "Number of errors" +msgstr "Количество ошибок" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,help:l10n_ru_advance_payments.field_order_prepaid__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "Количество сообщений, требующих действия" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,help:l10n_ru_advance_payments.field_order_prepaid__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "Количество сообщений с ошибкой доставки" + +#. module: l10n_ru_advance_payments +#: model:ir.model,name:l10n_ru_advance_payments.model_order_prepaid_line +msgid "Order Prepaid line" +msgstr "Строка предоплаты заказа" + +#. module: l10n_ru_advance_payments +#: model:ir.model,name:l10n_ru_advance_payments.model_account_payment +msgid "Payments" +msgstr "Платежи" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__rating_ids +msgid "Ratings" +msgstr "Оценки" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.view_account_payment_register_prepaid_form +msgid "Register Payment" +msgstr "Зарегистрировать платеж" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__activity_user_id +msgid "Responsible User" +msgstr "Ответственный пользователь" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__message_has_sms_error +msgid "SMS Delivery error" +msgstr "Ошибка доставки SMS" + +#. module: l10n_ru_advance_payments +#: model:ir.model,name:l10n_ru_advance_payments.model_sale_order +msgid "Sales Order" +msgstr "Заказ на продажу" + +#. module: l10n_ru_advance_payments +#: model:ir.model,name:l10n_ru_advance_payments.model_sale_order_line +msgid "Sales Order Line" +msgstr "Позиция заказа на продажу" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,help:l10n_ru_advance_payments.field_order_prepaid__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" +"Статус на основе действий\n" +"Просрочено: Срок уже прошёл\n" +"Сегодня: Дата действия — сегодня\n" +"Запланировано: Будущие действия." + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid_line__price_subtotal +msgid "Subtotal" +msgstr "Промежуточный итог" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.template_order_prepaid_invoice_body +msgid "Tax 15%" +msgstr "Налог 15%" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid_line__price_total +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.tree_order_prepaid_view +msgid "Total" +msgstr "Итого" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,help:l10n_ru_advance_payments.field_order_prepaid__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "Тип исключительной активности в записи." + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__website_message_ids +msgid "Website Messages" +msgstr "Сообщения сайта" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,help:l10n_ru_advance_payments.field_order_prepaid__website_message_ids +msgid "Website communication history" +msgstr "История коммуникаций сайта" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.template_order_prepaid_invoice_body +msgid "units" +msgstr "единицы" + +#. module: l10n_ru_advance_payments +#: model:ir.model,name:l10n_ru_advance_payments.model_order_prepaid +msgid "Авансовые платежи" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.actions.act_window,name:l10n_ru_advance_payments.action_order_prepaid +#: model:ir.ui.menu,name:l10n_ru_advance_payments.menu_order_prepaid +#: model:ir.ui.menu,name:l10n_ru_advance_payments.menu_order_prepaid_bill +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.form_order_prepaid_view +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.tree_order_prepaid_view +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.view_sale_order_form_inherit_button_advance +msgid "Авансовые счета" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.view_res_config_settings_advance +msgid "Авансовые счета:" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_payment_register_prepaid__prepaid_id +msgid "Авансовый платеж" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_account_payment__prepaid_id +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid_line__prepaid_id +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.view_sale_order_form_inherit_button_advance +msgid "Авансовый счет" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid_line__analytic_distribution +msgid "Аналитическое распределение" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.report_order_prepaid +msgid "БИК" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.report_order_prepaid +msgid "Банк получателя" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__partner_bank_id +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_payment_register_prepaid__partner_bank_id +msgid "Банковский счёт получателя" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.report_order_prepaid +msgid "Без НДС" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.report_order_prepaid +msgid "Бухгалтер" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields.selection,name:l10n_ru_advance_payments.selection__order_prepaid__payment_state__in_payment +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.form_order_prepaid_view +msgid "В оплате" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__currency_id +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_payment_register_prepaid__currency_id +msgid "Валюта" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_payment_register_prepaid__currency_const +msgid "Валюта(Const)" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.report_order_prepaid +msgid "" +"Внимание! Оплата данного счета означает согласие с условиями поставки " +"товара." +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__all_total +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__amount +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.form_order_prepaid_view +msgid "Всего" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.report_order_prepaid +msgid "Всего наименований" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields.selection,name:l10n_ru_advance_payments.selection__order_prepaid__advance_type__inbound +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.view_res_config_settings_advance +msgid "Входящий" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_res_company__advance_in_id +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_res_config_settings__advance_in_id +msgid "Входящий счет" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__payment_amount +msgid "Выплачено" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_payment_register_prepaid__payment_date +msgid "Дата платежа" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__invoice_date +msgid "Дата счета" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.form_order_prepaid_view +msgid "Доп. информация" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.report_order_prepaid +msgid "Ед." +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid_line__product_uom_id +msgid "Ед. измерения" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_payment_register_prepaid__journal_id +msgid "Журнал" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__sale_order_id +msgid "Заказ продаж" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_sale_order__prepaid_advance_count +msgid "Закупки" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_payment_register_prepaid__communication +msgid "Заметки" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.report_order_prepaid +msgid "ИНН" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.template_order_prepaid_invoice_body +msgid "Информация" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields.selection,name:l10n_ru_advance_payments.selection__order_prepaid__advance_type__outbound +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.view_res_config_settings_advance +msgid "Исходящий" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_res_company__advance_out_id +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_res_config_settings__advance_out_id +msgid "Исходящий счет" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.report_order_prepaid +msgid "КПП" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.report_order_prepaid +msgid "Кол-во" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid_line__quantity +msgid "Количество" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__comment +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.form_order_prepaid_view +msgid "Комментарий" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__company_id +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_payment_register_prepaid__company_id +msgid "Компания" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__company_partner_id +msgid "Контакт компании" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__partner_id +msgid "Контрагент" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid_line__label +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid_line__name +msgid "Метка" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_payment_register_prepaid__method_line_type +msgid "Метод" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_payment_register_prepaid__payment_method_line_id +msgid "Метод оплаты" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.report_order_prepaid +msgid "НДС:" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__name +msgid "Название" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid_line__tax_ids +msgid "Налоги" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields.selection,name:l10n_ru_advance_payments.selection__order_prepaid__payment_state__not_paid +msgid "Не оплачен" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.tree_order_prepaid_view +msgid "Номер" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.template_order_prepaid_invoice_body +msgid "Номер:" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields.selection,name:l10n_ru_advance_payments.selection__order_prepaid__payment_state__paid +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.form_order_prepaid_view +msgid "Оплачено" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__amount_residual +msgid "Остаток долга" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.form_order_prepaid_view +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.view_account_payment_register_prepaid_form +msgid "Отмена" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields.selection,name:l10n_ru_advance_payments.selection__order_prepaid__state__cancel +msgid "Отменено" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.form_order_prepaid_view +msgid "Переместить в черновики" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__payment_id +msgid "Платеж" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.form_order_prepaid_view +msgid "Подтвердить" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.form_order_prepaid_view +msgid "Позиция счета" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.report_order_prepaid +msgid "Покупатель:" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.report_order_prepaid +msgid "Получатель" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.report_order_prepaid +msgid "Поставщик:" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields.selection,name:l10n_ru_advance_payments.selection__order_prepaid__state__posted +msgid "Проведено" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__th_field_taxes +msgid "Проверка столбца налогов" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid_line__product_id +msgid "Продукт" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.form_order_prepaid_view +msgid "Регистрация Платежа" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model,name:l10n_ru_advance_payments.model_payment_register_prepaid +msgid "Регистрация авансовых платежей" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.report_order_prepaid +msgid "Руководитель" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__payment_line_ids +msgid "Связанные платежи" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_sale_order_line__prepaid_ids +msgid "Связные строки авансовых счетов" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid_line__sale_ids +msgid "Связные строки заказа" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.view_account_payment_register_prepaid_form +msgid "Создать платеж" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__invoice_date_due +msgid "Срок оплаты" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__state +msgid "Статус" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__payment_state +msgid "Статус платежа" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__prepaid_line +msgid "Строки счета" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__amount_sum_line +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_payment_register_prepaid__amount +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.report_order_prepaid +msgid "Сумма" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_account_payment__amount_adv_currency +msgid "Сумма от счета" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_payment_register_prepaid__amount_const +msgid "Сумма(Const)" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.report_order_prepaid +msgid "Сч. №" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.actions.report,name:l10n_ru_advance_payments.report_order_prepaid_invoice +msgid "Счет" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.actions.report,name:l10n_ru_advance_payments.action_report_orderprepaid +msgid "Счет по форме 1С" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid_line__account_id +msgid "Счёт" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__advance_type +msgid "Тип платежа" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_payment_register_prepaid__advance_type +msgid "Тип счета на аванс" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.report_order_prepaid +msgid "Товары (работы, услуги)" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid__payment_terms +msgid "Условия оплаты" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.report_order_prepaid +msgid "Условия оплаты:" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields,field_description:l10n_ru_advance_payments.field_order_prepaid_line__price_unit +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.form_order_prepaid_view +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.report_order_prepaid +msgid "Цена" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields.selection,name:l10n_ru_advance_payments.selection__order_prepaid__payment_state__partial +msgid "Частично оплачено" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.form_order_prepaid_view +msgid "Частичный" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model:ir.model.fields.selection,name:l10n_ru_advance_payments.selection__order_prepaid__state__draft +msgid "Черновик" +msgstr "" + +#. module: l10n_ru_advance_payments +#: model_terms:ir.ui.view,arch_db:l10n_ru_advance_payments.report_order_prepaid +msgid "руб." +msgstr "" diff --git a/l10n_ru_advance_payments/models/__init__.py b/l10n_ru_advance_payments/models/__init__.py new file mode 100644 index 00000000..82aa0994 --- /dev/null +++ b/l10n_ru_advance_payments/models/__init__.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- + +from . import sale_order +from . import sale_order_line +from . import order_prepaid +from . import order_prepaid_line +from . import account_payment +from . import res_company +from . import res_config_settings \ No newline at end of file diff --git a/l10n_ru_advance_payments/models/account_payment.py b/l10n_ru_advance_payments/models/account_payment.py new file mode 100644 index 00000000..c1d7a72f --- /dev/null +++ b/l10n_ru_advance_payments/models/account_payment.py @@ -0,0 +1,55 @@ +from odoo import models, fields, api + + +class AccountPayment(models.Model): + _inherit = 'account.payment' + + prepaid_id = fields.Many2one(comodel_name='order.prepaid', string='Авансовый счет') + amount_adv_currency = fields.Float(string='Сумма от счета', default=0) + + + @api.depends('journal_id', 'partner_id', 'partner_type') + def _compute_destination_account_id(self): + for pay in self: + pay.destination_account_id = False + company = pay.company_id + + if pay.prepaid_id: + if pay.payment_type == 'inbound' and company.advance_in_id: + pay.destination_account_id = company.advance_in_id.id + elif pay.payment_type == 'outbound' and company.advance_out_id: + pay.destination_account_id = company.advance_out_id.id + + if pay.destination_account_id: + continue + + partner = pay.partner_id + # if pay.default_is_internal_transfer: + # pay.destination_account_id = pay.destination_journal_id.company_id.transfer_account_id + if pay.partner_type == 'customer': + pay.destination_account_id = self._get_partner_account( + partner, + company, + account_type='asset_receivable', + partner_account_field='property_account_receivable_id' + ) + elif pay.partner_type == 'supplier': + pay.destination_account_id = self._get_partner_account( + partner, + company, + account_type='liability_payable', + partner_account_field='property_account_payable_id' + ) + + def _get_partner_account(self, partner, company, account_type, partner_account_field): + if partner: + account = getattr(partner.with_company(company), partner_account_field, False) + if account: + return account.id + account = self.env['account.account'].search([ + *self.env['account.account']._check_company_domain(company), + ('account_type', '=', account_type), + ('deprecated', '=', False), + ], limit=1) + + return account.id if account else False \ No newline at end of file diff --git a/l10n_ru_advance_payments/models/order_prepaid.py b/l10n_ru_advance_payments/models/order_prepaid.py new file mode 100644 index 00000000..5b0c9193 --- /dev/null +++ b/l10n_ru_advance_payments/models/order_prepaid.py @@ -0,0 +1,195 @@ +from odoo import models, fields, api + +class OrderPrepaid(models.Model): + _name = 'order.prepaid' + _description = 'Авансовые платежи' + _inherit = ['mail.thread', 'mail.activity.mixin'] + + name = fields.Char(string='Название', default='Draft', copy=False) + partner_id = fields.Many2one(comodel_name='res.partner', string='Контрагент') + invoice_partner_display_name = fields.Char(compute='_compute_invoice_partner_display_info', store=True) + + payment_terms = fields.Char(string='Условия оплаты') + invoice_date = fields.Date(string='Дата счета', default=fields.Date.context_today, required=True) + invoice_date_due = fields.Date(string='Срок оплаты', default=fields.Date.context_today, required=True) + company_id = fields.Many2one(comodel_name='res.company', string='Компания') + sale_order_id = fields.Many2one(comodel_name='sale.order', string='Заказ продаж') + advance_type = fields.Selection(selection=[('outbound', 'Исходящий'),('inbound', 'Входящий')], + string='Тип платежа', default='inbound') + comment = fields.Text(string='Комментарий') + state = fields.Selection(selection=[('cancel', 'Отменено'), + ('draft', 'Черновик'), + ('posted', 'Проведено')], + string='Статус', default='draft') + prepaid_line = fields.One2many(comodel_name='order.prepaid.line', inverse_name='prepaid_id', string='Строки счета') + + currency_id = fields.Many2one(comodel_name='res.currency', string='Валюта', tracking=True, required=True, readonly=False, + compute='_compute_currency_id', inverse='_inverse_currency_id', + store=True, precompute=True) + partner_bank_id = fields.Many2one(comodel_name='res.partner.bank', string="Банковский счёт получателя") + amount = fields.Monetary(currency_field='currency_id', store=True, readonly=False, + compute='_compute_amount', string='Всего') + + payment_line_ids = fields.One2many(comodel_name='account.payment', inverse_name='prepaid_id', + string='Связанные платежи', compute_sudo=True, store=True) + company_partner_id = fields.Many2one(string='Контакт компании', related='company_id.partner_id') + + payment_state = fields.Selection(selection=[('not_paid', 'Не оплачен'), + ('in_payment', 'В оплате'), + ('paid', 'Оплачено'), + ('partial', 'Частично оплачено'), + ], + string="Статус платежа", readonly=True, copy=False, tracking=True, + compute='_compute_payment_state', store=True) + payment_id = fields.Many2one(comodel_name='account.payment', string='Платеж') + payment_amount = fields.Monetary(currency_field='currency_id', compute='_compute_payment_amount', store=True, string='Выплачено') + amount_sum_line = fields.Monetary(currency_field='currency_id', store=True, readonly=False, + compute='_compute_amount_sum_line', string='Сумма') + + amount_residual = fields.Monetary(currency_field='currency_id', store=True, readonly=False, + compute='_compute_amount_residual', string='Остаток долга', default=0, copy=False) + + all_total = fields.Monetary(currency_field='currency_id', store=True, readonly=True, + compute='_compute_all_total', string='Всего', default=0, copy=False) + + th_field_taxes = fields.Boolean(string='Проверка столбца налогов', compute='_th_field_taxes', store=True) + + @api.depends('prepaid_line.tax_ids') + def _th_field_taxes(self): + for rec in self: + values = rec.prepaid_line.mapped('tax_ids') + if values: + rec.th_field_taxes = True + else: + rec.th_field_taxes = False + + @api.depends('amount') + def _compute_all_total(self): + for rec in self: + if rec.amount > 0: + rec.all_total = -(rec.amount) if rec.advance_type == 'outbound' else rec.amount + else: + rec.all_total = 0 + + @api.depends('partner_id', 'partner_id.display_name') + def _compute_invoice_partner_display_info(self): + for record in self: + vendor_display_name = record.partner_id.display_name if record.partner_id else '' + record.invoice_partner_display_name = vendor_display_name + + @api.depends('amount', 'payment_amount', 'state') + def _compute_amount_residual(self): + for rec in self: + if rec.state == 'posted': + rec.amount_residual = rec.amount - abs(rec.payment_amount) + else: + rec.amount_residual = 0 + + @api.depends('prepaid_line', 'prepaid_line.tax_ids') + def _compute_amount_sum_line(self): + for rec in self: + amount = 0 + for el in rec.prepaid_line: + amount += el.price_subtotal + rec.amount_sum_line = amount + + + @api.depends('payment_amount', 'payment_line_ids.reconciled_statement_line_ids') + def _compute_payment_state(self): + if not self.payment_line_ids: + self.payment_state = 'not_paid' + elif abs(self.payment_amount) != 0: + if abs(self.payment_amount) >= self.amount: + bool = True + for rec in self.payment_line_ids: + if not rec.reconciled_statement_line_ids: + bool = False + break + self.payment_state = 'paid' if bool else 'in_payment' + else: + self.payment_state = 'partial' + else: + self.payment_state = 'not_paid' + + @api.depends('payment_line_ids', 'payment_line_ids.state') + def _compute_payment_amount(self): + for rec in self: + payments = self.env['account.payment'].with_company(rec.company_id) + records = payments.search([('state', '=', 'posted'), + ('prepaid_id', '=', rec.id), + ('company_id', '=', rec.company_id.id)]) + amount = sum(records.mapped('amount_adv_currency')) + rec.payment_amount = amount + + + @api.depends('prepaid_line') + def _compute_amount(self): + for rec in self: + amount = 0 + for el in rec.prepaid_line: + amount += el.price_unit * el.quantity + rec.amount = amount + + @api.depends('company_id') + def _compute_currency_id(self): + for invoice in self: + invoice.currency_id = invoice.company_id.currency_id + + @api.onchange('currency_id') + def _inverse_currency_id(self): + self.currency_id = self.currency_id + + + def action_post(self): + if self.name == 'Draft': + self.name = self.env['ir.sequence'].next_by_code('order.prepaid') + self.state = 'posted' + + def button_draft(self): + self.state = 'draft' + payments = self.env['account.payment'].with_company(self.company_id) + records = payments.search([('prepaid_id', '=', self.id), ('company_id', '=', self.company_id.id)]) + if records: + for el in records: + el.action_draft() + el.action_cancel() + el.unlink() + + + def button_cancel(self): + self.state = 'cancel' + + + def action_register_payment(self): + journals = self.env['account.journal'].with_company(self.company_id.id) + journal = journals.search([('type', 'in', ['bank', 'cash']), ('company_id', '=', self.company_id.id)]) + if journal: + if self.partner_bank_id: + journal_bank = journal.search([('bank_account_id', '=', self.partner_bank_id.id)], limit=1) + journal_id = journal_bank.id if journal_bank else journal[0].id + else: + journal_id = journal[0].id + else: + journal_id = False + + delta_amount = self.amount - abs(self.payment_amount) + default_amount = delta_amount if delta_amount > 0 else 0 + + return { + 'name': 'Регистрация платежа', + 'res_model': 'payment.register.prepaid', + 'view_mode': 'form', + 'views': [[False, 'form']], + 'context': { + 'default_prepaid_id': self.id, + 'default_company_id': self.company_id.id, + 'default_communication': self.name, + 'default_amount': default_amount, + 'default_amount_const': default_amount, + 'default_journal_id': journal_id + }, + 'target': 'new', + 'type': 'ir.actions.act_window', + } + + diff --git a/l10n_ru_advance_payments/models/order_prepaid_line.py b/l10n_ru_advance_payments/models/order_prepaid_line.py new file mode 100644 index 00000000..a1990a2e --- /dev/null +++ b/l10n_ru_advance_payments/models/order_prepaid_line.py @@ -0,0 +1,82 @@ +from odoo import models, fields, api + + +class OrderPrepaidLine(models.Model): + _name = 'order.prepaid.line' + _inherit = "analytic.mixin" + _description = 'Order Prepaid line' + + + product_id = fields.Many2one(comodel_name='product.product', string='Продукт') + name = fields.Char(string='Метка', compute='_compute_name') + label = fields.Char(string='Метка') + account_id = fields.Many2one(comodel_name='account.account', string='Счёт') + quantity = fields.Float(string='Количество', default=1, digits='Product Unit of Measure') + product_uom_id = fields.Many2one(comodel_name='uom.uom', string='Ед. измерения', compute='_compute_product_uom_id') + price_unit = fields.Float(string='Цена', digits='Product Price', default=1) + tax_ids = fields.Many2many(comodel_name='account.tax', string="Налоги") + prepaid_id = fields.Many2one(comodel_name='order.prepaid', string='Авансовый счет') + sale_ids = fields.Many2many(comodel_name='sale.order.line', string='Связные строки заказа') + analytic_distribution = fields.Json(string='Аналитическое распределение') + + + price_subtotal = fields.Monetary( + string='Subtotal', + compute='_compute_totals', store=True, + currency_field='currency_id', + ) + + price_total = fields.Monetary( + string='Total', + compute='_compute_totals', store=True, + currency_field='currency_id', + ) + + currency_id = fields.Many2one( + comodel_name='res.currency', + string='Currency', + compute='_compute_currency_id', store=True, readonly=False, precompute=True, + required=True, + ) + + @api.depends('prepaid_id.currency_id') + def _compute_currency_id(self): + for line in self: + line.currency_id = line.prepaid_id.currency_id + + + @api.depends('quantity', 'price_unit', 'tax_ids', 'currency_id') + def _compute_totals(self): + for line in self: + subtotal = line.quantity * line.price_unit + if line.tax_ids: + taxes_res = line.tax_ids.compute_all( + line.price_unit, + quantity=line.quantity, + currency=line.currency_id, + product=line.product_id, + partner=self.prepaid_id.partner_id, + is_refund=False, + ) + line.price_subtotal = taxes_res['total_excluded'] + line.price_total = taxes_res['total_included'] + else: + line.price_total = line.price_subtotal = subtotal + + + @api.depends('product_id') + def _compute_product_uom_id(self): + for line in self: + if line.product_id: + line.product_uom_id = line.product_id.uom_id + else: + line.product_uom_id = False + + + @api.depends('product_id') + def _compute_name(self): + for line in self: + if line.product_id: + line.name = line.product_id.name + else: + line.name = '' diff --git a/l10n_ru_advance_payments/models/res_company.py b/l10n_ru_advance_payments/models/res_company.py new file mode 100644 index 00000000..77085229 --- /dev/null +++ b/l10n_ru_advance_payments/models/res_company.py @@ -0,0 +1,8 @@ +from odoo import models, fields + + +class ResCompany(models.Model): + _inherit = 'res.company' + + advance_out_id = fields.Many2one(comodel_name='account.account', string='Исходящий счет') + advance_in_id = fields.Many2one(comodel_name='account.account', string='Входящий счет') \ No newline at end of file diff --git a/l10n_ru_advance_payments/models/res_config_settings.py b/l10n_ru_advance_payments/models/res_config_settings.py new file mode 100644 index 00000000..03e3f9c9 --- /dev/null +++ b/l10n_ru_advance_payments/models/res_config_settings.py @@ -0,0 +1,14 @@ +from odoo import models, fields + + +class ResConfigSettings(models.TransientModel): + _inherit = 'res.config.settings' + + advance_out_id = fields.Many2one(comodel_name='account.account', string='Исходящий счет', related='company_id.advance_out_id',readonly=False) + advance_in_id = fields.Many2one(comodel_name='account.account', string='Входящий счет', related='company_id.advance_in_id',readonly=False) + + + + + + diff --git a/l10n_ru_advance_payments/models/sale_order.py b/l10n_ru_advance_payments/models/sale_order.py new file mode 100644 index 00000000..1bf6cdd5 --- /dev/null +++ b/l10n_ru_advance_payments/models/sale_order.py @@ -0,0 +1,68 @@ +from odoo import models, fields +from odoo.fields import Command + + +class SaleOrder(models.Model): + _inherit = 'sale.order' + + prepaid_advance_count = fields.Integer(string='Закупки', compute='_compute_prepaid_advance_count') + + def _compute_prepaid_advance_count(self): + for el in self: + prepaid = self.env['order.prepaid'].search([('sale_order_id', '=', self.id), ('state', '!=', 'cancel')]) + el.prepaid_advance_count = len(prepaid) + + + def action_prepaid_advance(self): + action = self.env['ir.actions.act_window']._for_xml_id('l10n_ru_advance_payments.action_order_prepaid') + prepaid = self.env['order.prepaid'].search([('sale_order_id', '=', self.id), ('state', '!=', 'cancel')]) + if len(prepaid) > 1: + action['domain'] = [('sale_order_id', '=', self.id)] + action['context'] = { + 'group_by': ['advance_type'] + } + elif len(prepaid) == 1: + return { + 'type': 'ir.actions.act_window', + 'res_model': 'order.prepaid', + 'res_id': prepaid.id, + 'view_mode': 'form', + 'view_type': 'form', + 'target': 'self' + } + return action + + + def button_advance(self): + prepaid_vals = { + 'partner_id': self.partner_id.id, + 'company_id': self.company_id.id, + 'sale_order_id': self.id, + 'prepaid_line': [], + } + for line in self.order_line: + elem = self._prepare_line(line) + prepaid_vals['prepaid_line'].append((0, 0, elem)) + prepaid = self.env['order.prepaid'].create(prepaid_vals) + return { + 'type': 'ir.actions.act_window', + 'res_model': 'order.prepaid', + 'res_id': prepaid.id, + 'view_mode': 'form', + 'view_type': 'form', + 'target': 'self' + } + + def _prepare_line(self, line): + res = { + 'product_id': line.product_id.id, + 'product_uom_id': line.product_uom_id.id, + 'quantity': line.product_uom_qty, + 'price_unit': line.price_unit, + 'tax_ids': [(6, 0, line.tax_ids.ids)], + 'sale_ids': [Command.link(line.id)], + } + if line.analytic_distribution: + res['analytic_distribution'] = line.analytic_distribution + return res + diff --git a/l10n_ru_advance_payments/models/sale_order_line.py b/l10n_ru_advance_payments/models/sale_order_line.py new file mode 100644 index 00000000..840af4c2 --- /dev/null +++ b/l10n_ru_advance_payments/models/sale_order_line.py @@ -0,0 +1,9 @@ +from odoo import models, fields + + +class SaleOrderLine(models.Model): + _inherit = 'sale.order.line' + + prepaid_ids = fields.Many2many('order.prepaid.line', string='Связные строки авансовых счетов') + bool_const_bill = fields.Boolean(copy=False) + bool_const_bill_bill = fields.Boolean(copy=False) \ No newline at end of file diff --git a/l10n_ru_advance_payments/report/__init__.py b/l10n_ru_advance_payments/report/__init__.py new file mode 100644 index 00000000..5e8c4e20 --- /dev/null +++ b/l10n_ru_advance_payments/report/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import report_order_prepaid diff --git a/l10n_ru_advance_payments/report/order_prepaid.xml b/l10n_ru_advance_payments/report/order_prepaid.xml new file mode 100644 index 00000000..cbc23a61 --- /dev/null +++ b/l10n_ru_advance_payments/report/order_prepaid.xml @@ -0,0 +1,44 @@ + + + A4 + + A4 + 0 + 0 + Portrait + 7 + 7 + 7 + 7 + + 35 + 75 + + + + Счет по форме 1С + order.prepaid + qweb-pdf + l10n_ru_advance_payments.report_order_prepaid + l10n_ru_advance_payments.report_order_prepaid + 'Счет - %s ' % (str(object.name)+' '+(str(object.partner_id.parent_id.name) if + object.partner_id.parent_id else str(object.partner_id.name))) + + + + report + + + + Счет + order.prepaid + qweb-pdf + l10n_ru_advance_payments.template_order_prepaid_invoice + l10n_ru_advance_payments.template_order_prepaid_invoice + 'Счет - %s ' % ((object.name if object.name else '')+' '+(object.partner_id.parent_id.name if + object.partner_id.parent_id else object.partner_id.name)) + + + report + + \ No newline at end of file diff --git a/l10n_ru_advance_payments/report/report_invoice.xml b/l10n_ru_advance_payments/report/report_invoice.xml new file mode 100644 index 00000000..7d1c5795 --- /dev/null +++ b/l10n_ru_advance_payments/report/report_invoice.xml @@ -0,0 +1,286 @@ + + + + + + diff --git a/l10n_ru_advance_payments/report/report_order_prepaid.py b/l10n_ru_advance_payments/report/report_order_prepaid.py new file mode 100644 index 00000000..a8d0cf1b --- /dev/null +++ b/l10n_ru_advance_payments/report/report_order_prepaid.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from odoo import models +from odoo.addons.l10n_ru_advance_payments.report_helper import QWebHelper + + +class RuOrderPrepaidReport(models.AbstractModel): + _name = 'report.l10n_ru_advance_payments.report_order_prepaid' + + def _get_report_values(self, docids, data=None): + docs = self.env['order.prepaid'].browse(docids) + return { + 'helper': QWebHelper(), + 'doc_ids': docs.ids, + 'doc_model': 'order.prepaid', + 'docs': docs + } diff --git a/l10n_ru_advance_payments/report/report_order_prepaid.xml b/l10n_ru_advance_payments/report/report_order_prepaid.xml new file mode 100644 index 00000000..8e14ce69 --- /dev/null +++ b/l10n_ru_advance_payments/report/report_order_prepaid.xml @@ -0,0 +1,320 @@ + + + + + + diff --git a/l10n_ru_advance_payments/report_helper.py b/l10n_ru_advance_payments/report_helper.py new file mode 100644 index 00000000..4ae4803b --- /dev/null +++ b/l10n_ru_advance_payments/report_helper.py @@ -0,0 +1,112 @@ +from datetime import datetime +import re +from pytils import numeral, dt +from odoo.tools import pycompat + + +class QWebHelper(object): + + def img(self, img, type='png', width=0, height=0) : + if width : + width = "width='%spx'"%(width) + else : + width = " " + if height : + height = "height='%spx'"%(height) + else : + height = " " + toreturn = ""%( + width, + height, + type, + str(pycompat.to_text(img))) + return toreturn + + def numer(self, name): + if name: + numeration = re.findall(r'\d+$', name) + if numeration: + return numeration[0] + return '' + + def ru_date(self, date): + if date and date != 'False': + return dt.ru_strftime('"%d" %B %Y года', date=datetime.strptime(str(date), + "%Y-%m-%d"), inflected=True) + return '' + + def ru_date2(self, date): + if date and date != 'False': + return dt.ru_strftime('%d %B %Y г.', date=datetime.strptime(str(date), + "%Y-%m-%d %H:%M:%S"), inflected=True) + return '' + + def in_words(self, number): + return numeral.in_words(number) + + def rubles(self, sum): + text_rubles = numeral.rubles(int(sum)) + copeck = round((sum - int(sum))*100) + text_copeck = numeral.choose_plural(int(copeck), ("копейка", "копейки", "копеек")) + return ("%s %02d %s")%(text_rubles, copeck, text_copeck) + + def initials(self, fio): + if fio: + return (fio.split()[0]+' '+''.join([fio[0:1]+'.' for fio in fio.split()[1:]])).strip() + return '' + + def address(self, partner): + repr = [] + if partner.zip: + repr.append(partner.zip) + if partner.country_id: + repr.append(partner.country_id.name) + if partner.state_id: + repr.append(partner.state_id.name) + if partner.city: + repr.append(partner.city) + if partner.street: + repr.append(partner.street) + if partner.street2: + repr.append(partner.street2) + return ', '.join(repr) + + def representation(self, partner): + repr = [] + if partner.name: + repr.append(partner.name) + if partner.inn: + repr.append("ИНН " + partner.inn) + if partner.kpp: + repr.append("КПП " + partner.kpp) + repr.append(self.address(partner)) + return ', '.join(repr) + + def full_representation(self, partner): + repr = [self.representation(partner)] + if partner.phone: + repr.append("тел.: " + partner.phone) + elif partner.parent_id.phone: + repr.append("тел.: " + partner.parent_id.phone) + bank = None + if partner.bank_ids: + bank = partner.bank_ids[0] + elif partner.parent_id.bank_ids: + bank = partner.parent_id.bank_ids[0] + if bank and bank.acc_number: + repr.append("р/сч " + bank.acc_number) + if bank and bank.bank_name: + repr.append("в банке " + bank.bank_name) + if bank and bank.banvk_bic: + repr.append("БИК " + bank.bank_bic) + if bank and bank.bank_corr_acc: + repr.append("к/с " + bank.bank_corr_acc) + return ', '.join(repr) + + def representation_small(self, partner): + repr = [] + if partner.name: + repr.append(partner.name) + + repr.append(self.address(partner)) + return ', '.join(repr) diff --git a/l10n_ru_advance_payments/security/ir.model.access.csv b/l10n_ru_advance_payments/security/ir.model.access.csv new file mode 100644 index 00000000..998ca734 --- /dev/null +++ b/l10n_ru_advance_payments/security/ir.model.access.csv @@ -0,0 +1,4 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_order_prepaid,order.prepaid,model_order_prepaid,base.group_user,1,1,1,1 +access_order_prepaid_line,order.prepaid.line,model_order_prepaid_line,base.group_user,1,1,1,1 +access_payment_register_prepaid,payment.register.prepaid,model_payment_register_prepaid,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/l10n_ru_advance_payments/tests/__init__.py b/l10n_ru_advance_payments/tests/__init__.py new file mode 100644 index 00000000..45bb0f5c --- /dev/null +++ b/l10n_ru_advance_payments/tests/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import test_advance diff --git a/l10n_ru_advance_payments/tests/test_advance.py b/l10n_ru_advance_payments/tests/test_advance.py new file mode 100644 index 00000000..a3c4c13d --- /dev/null +++ b/l10n_ru_advance_payments/tests/test_advance.py @@ -0,0 +1,225 @@ +# -*- coding: utf-8 -*- +""" +Tests for l10n_ru_advance_payments — advance payment invoices. + +Validates: Requirements 14.1, 14.2, 14.3 +""" +from odoo.tests.common import TransactionCase +from odoo.tests import tagged + + +def _get_or_create_partner(env): + """Return an existing company partner or create one.""" + partner = env['res.partner'].search( + [('is_company', '=', True)], limit=1 + ) + if not partner: + partner = env['res.partner'].create({ + 'name': 'Test Partner Advance', + 'is_company': True, + }) + return partner + + +def _get_or_create_contract(env, partner): + """Return an existing contract or create a minimal one.""" + contract = env['partner.contract.customer'].search( + [('partner_id', '=', partner.id)], limit=1 + ) + if not contract: + profile = env['contract.profile'].search([], limit=1) + if not profile: + profile = env['contract.profile'].create({'name': 'Test Profile'}) + contract = env['partner.contract.customer'].create({ + 'date_start': '2024-01-01', + 'date_end': '2024-12-31', + 'type': 'customer', + 'profile_id': profile.id, + 'partner_id': partner.id, + 'partner_type': 'company', + 'company_id': env.company.id, + }) + return contract + + +def _make_prepaid(env, partner=None): + """Create a minimal order.prepaid record.""" + if partner is None: + partner = _get_or_create_partner(env) + return env['order.prepaid'].create({ + 'partner_id': partner.id, + 'company_id': env.company.id, + 'invoice_date': '2024-06-01', + 'invoice_date_due': '2024-06-30', + 'prepaid_line': [(0, 0, { + 'label': 'Аванс', + 'quantity': 1.0, + 'price_unit': 1000.0, + })], + }) + + +@tagged('post_install', '-at_install') +class TestAdvancePayments(TransactionCase): + """ + Tests for advance payment invoices (order.prepaid). + + Validates: Requirements 14.1, 14.2, 14.3 + """ + + def setUp(self): + super().setUp() + self.partner = _get_or_create_partner(self.env) + self.contract = _get_or_create_contract(self.env, self.partner) + self.prepaid = _make_prepaid(self.env, self.partner) + + # ------------------------------------------------------------------ + # Requirement 14.1 — create advance invoice with contract and partner + # ------------------------------------------------------------------ + + def test_create_advance_with_partner_no_error(self): + """ + Req 14.1 — creating an order.prepaid with a partner saves without errors. + """ + self.assertTrue(self.prepaid.id, "order.prepaid should be created with a valid id") + self.assertEqual(self.prepaid.partner_id, self.partner, + "partner_id should match the provided partner") + self.assertEqual(self.prepaid.state, 'draft', + "Newly created prepaid should be in draft state") + + def test_create_advance_with_contract_and_partner_no_error(self): + """ + Req 14.1 — creating an order.prepaid linked to a contract and partner + saves without errors. + """ + prepaid = self.env['order.prepaid'].create({ + 'partner_id': self.partner.id, + 'company_id': self.env.company.id, + 'invoice_date': '2024-07-01', + 'invoice_date_due': '2024-07-31', + 'prepaid_line': [(0, 0, { + 'label': 'Предоплата по договору', + 'quantity': 1.0, + 'price_unit': 5000.0, + })], + }) + self.assertTrue(prepaid.id, "order.prepaid with contract should be created") + self.assertEqual(prepaid.partner_id.id, self.partner.id) + self.assertGreater(prepaid.amount, 0, "Amount should be computed from lines") + + # ------------------------------------------------------------------ + # Requirement 14.2 — printing returns non-empty binary content + # ------------------------------------------------------------------ + + def test_print_advance_report_values_no_exception(self): + """ + Req 14.2 — calling _get_report_values on the advance payment report model + returns a non-empty dict without exceptions. + """ + report_model = self.env['report.l10n_ru_advance_payments.report_order_prepaid'] + result = report_model._get_report_values([self.prepaid.id]) + self.assertIsInstance(result, dict, "Report values should be a dict") + self.assertIn('docs', result, "Report values should contain 'docs' key") + self.assertTrue(result['docs'], "Report docs should be non-empty") + + def test_print_advance_html_render_returns_binary_content(self): + """ + Req 14.2 — rendering the advance payment QWeb template returns + non-empty binary content without exceptions. + """ + html_content, content_type = self.env['ir.actions.report']._render_qweb_html( + 'l10n_ru_advance_payments.report_order_prepaid', [self.prepaid.id] + ) + self.assertTrue(html_content, + "Advance payment HTML render should return non-empty binary content") + self.assertIsInstance(html_content, bytes, "Rendered content should be bytes") + self.assertGreater(len(html_content), 0, "Rendered content should have non-zero length") + + # ------------------------------------------------------------------ + # Requirement 14.3 — registering payment creates account.payment + # ------------------------------------------------------------------ + + def test_register_payment_creates_account_payment(self): + """ + Req 14.3 — using the payment wizard creates a corresponding account.payment record. + """ + # Post the prepaid first + self.prepaid.action_post() + self.assertEqual(self.prepaid.state, 'posted', + "Prepaid should be in posted state after action_post") + + # Find a bank/cash journal + journal = self.env['account.journal'].search( + [('type', 'in', ['bank', 'cash']), + ('company_id', '=', self.env.company.id)], + limit=1 + ) + self.assertTrue(journal, "A bank or cash journal must exist for payment registration") + + # Find a payment method line + payment_method_line = journal.outbound_payment_method_line_ids[:1] + if not payment_method_line: + payment_method_line = journal.inbound_payment_method_line_ids[:1] + self.assertTrue(payment_method_line, + "Journal must have at least one payment method line") + + # Create the wizard directly and call action_create_payments + wizard = self.env['payment.register.prepaid'].create({ + 'prepaid_id': self.prepaid.id, + 'company_id': self.env.company.id, + 'amount': self.prepaid.amount, + 'currency_id': self.prepaid.currency_id.id, + 'payment_date': '2024-06-15', + 'journal_id': journal.id, + 'payment_method_line_id': payment_method_line.id, + 'communication': self.prepaid.name, + }) + + payment_count_before = self.env['account.payment'].search_count( + [('prepaid_id', '=', self.prepaid.id)] + ) + + wizard.action_create_payments() + + payment_count_after = self.env['account.payment'].search_count( + [('prepaid_id', '=', self.prepaid.id)] + ) + self.assertGreater( + payment_count_after, payment_count_before, + "action_create_payments should create a new account.payment linked to the prepaid" + ) + + def test_register_payment_payment_linked_to_prepaid(self): + """ + Req 14.3 — the created account.payment has prepaid_id set to the advance invoice. + """ + self.prepaid.action_post() + + journal = self.env['account.journal'].search( + [('type', 'in', ['bank', 'cash']), + ('company_id', '=', self.env.company.id)], + limit=1 + ) + payment_method_line = ( + journal.outbound_payment_method_line_ids[:1] + or journal.inbound_payment_method_line_ids[:1] + ) + + wizard = self.env['payment.register.prepaid'].create({ + 'prepaid_id': self.prepaid.id, + 'company_id': self.env.company.id, + 'amount': self.prepaid.amount, + 'currency_id': self.prepaid.currency_id.id, + 'payment_date': '2024-06-20', + 'journal_id': journal.id, + 'payment_method_line_id': payment_method_line.id, + 'communication': self.prepaid.name, + }) + wizard.action_create_payments() + + payment = self.env['account.payment'].search( + [('prepaid_id', '=', self.prepaid.id)], limit=1 + ) + self.assertTrue(payment, "An account.payment linked to the prepaid should exist") + self.assertEqual(payment.prepaid_id.id, self.prepaid.id, + "payment.prepaid_id should reference the advance invoice") diff --git a/l10n_ru_advance_payments/views/order_prepaid.xml b/l10n_ru_advance_payments/views/order_prepaid.xml new file mode 100644 index 00000000..5df84eb3 --- /dev/null +++ b/l10n_ru_advance_payments/views/order_prepaid.xml @@ -0,0 +1,135 @@ + + + + Авансовые счета + ir.actions.act_window + order.prepaid + list,form,search + + + + + + Авансовые счета + order.prepaid + + + + + + + + + + + + + + + + + + + Авансовые счета + order.prepaid + +
+
+ +
+ + + + +
+

+ + + Draft + +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Всего + + + + + + + + + + + + + + +
+ + + + + + + +
+
+
+
\ No newline at end of file diff --git a/l10n_ru_advance_payments/views/res_config_settings.xml b/l10n_ru_advance_payments/views/res_config_settings.xml new file mode 100644 index 00000000..19532653 --- /dev/null +++ b/l10n_ru_advance_payments/views/res_config_settings.xml @@ -0,0 +1,26 @@ + + + view.res.config.settings.advance + res.config.settings + + + + +
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/l10n_ru_advance_payments/views/sale_order.xml b/l10n_ru_advance_payments/views/sale_order.xml new file mode 100644 index 00000000..cd669c69 --- /dev/null +++ b/l10n_ru_advance_payments/views/sale_order.xml @@ -0,0 +1,18 @@ + + + view.sale.order.form.inherit.button.advance + sale.order + + + + + + + + \ No newline at end of file diff --git a/l10n_ru_advance_payments/wizard/__init__.py b/l10n_ru_advance_payments/wizard/__init__.py new file mode 100644 index 00000000..a9d861b2 --- /dev/null +++ b/l10n_ru_advance_payments/wizard/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import account_payment_register_prepaid diff --git a/l10n_ru_advance_payments/wizard/account_payment_register_prepaid.py b/l10n_ru_advance_payments/wizard/account_payment_register_prepaid.py new file mode 100644 index 00000000..c817a37d --- /dev/null +++ b/l10n_ru_advance_payments/wizard/account_payment_register_prepaid.py @@ -0,0 +1,104 @@ +# -*- coding: utf-8 -*- +from collections import defaultdict + +from odoo import models, fields, api + + +class AccountPaymentRegisterPrepaid(models.TransientModel): + _name = 'payment.register.prepaid' + _description = 'Регистрация авансовых платежей' + + company_id = fields.Many2one(comodel_name='res.company', string='Компания') + payment_method_line_id = fields.Many2one(comodel_name='account.payment.method.line', string='Метод оплаты', required=True) + partner_bank_id = fields.Many2one(comodel_name='res.partner.bank', string="Банковский счёт получателя") + amount = fields.Monetary(currency_field='currency_id', string='Сумма', readonly=False, required=True) + currency_id = fields.Many2one(comodel_name='res.currency', string='Валюта', required=True) + payment_date = fields.Date(string="Дата платежа", required=True, default=fields.Date.context_today) + journal_id = fields.Many2one(comodel_name='account.journal', string='Журнал', required=True) + communication = fields.Char(string="Заметки") + prepaid_id = fields.Many2one(comodel_name='order.prepaid', string="Авансовый платеж") + advance_type = fields.Selection(selection=[('outbound', 'Входящий'), ('inbound', 'Исходящий')], + string='Тип счета на аванс', related='prepaid_id.advance_type') + method_line_type = fields.Many2one(comodel_name='account.payment.method.line', string="Метод") + amount_const = fields.Float(string='Сумма(Const)') + currency_const = fields.Many2one(comodel_name='res.currency', string='Валюта(Const)') + + @api.onchange('partner_bank_id', 'journal_id') + def currency_bank(self): + if self.partner_bank_id: + self.currency_id = self.partner_bank_id.currency_id + + @api.onchange('currency_id') + def _amount(self): + for wizard in self: + if not wizard.journal_id or not wizard.currency_id or not wizard.payment_date: + wizard.amount = wizard.amount + else: + test = self.prepaid_id.currency_id._convert( + self.amount_const, + self.currency_id, + self.company_id, + self.payment_date, + ) + wizard.amount = test + + @api.onchange('journal_id') + def _payment_method_line_id(self): + journal = self.journal_id + if journal: + if self.advance_type == 'outbound': + self.payment_method_line_id = journal.inbound_payment_method_line_ids[0] if journal.inbound_payment_method_line_ids else False + elif self.advance_type == 'inbound': + self.payment_method_line_id = journal.outbound_payment_method_line_ids[0] if journal.outbound_payment_method_line_ids else False + else: + self.payment_method_line_id = False + else: + self.payment_method_line_id = False + + @api.onchange('journal_id') + def _bank(self): + if self.prepaid_id and self.prepaid_id.partner_bank_id: + self.partner_bank_id = self.prepaid_id.partner_bank_id + elif self.journal_id and self.journal_id.bank_account_id: + self.partner_bank_id = self.journal_id.bank_account_id + else: + self.partner_bank_id = False + + def action_create_payments(self): + prepaid=self.prepaid_id + amount_adv_currency = self.currency_id._convert( + self.amount, + prepaid.currency_id, + self.company_id, + self.payment_date, + ) + payment_vals = { + 'date': self.payment_date, + 'amount': self.amount, + 'payment_type': self.advance_type, + 'memo': self.communication, + 'journal_id': self.journal_id.id, + 'company_id': self.company_id.id, + 'currency_id': self.currency_id.id, + 'partner_id': prepaid.partner_id.id, + 'partner_bank_id': self.partner_bank_id.id, + 'payment_method_line_id': self.payment_method_line_id.id, + 'prepaid_id': prepaid.id, + 'amount_adv_currency': amount_adv_currency, + 'state': 'draft' + } + payment = self.env['account.payment'].create(payment_vals) + prepaid.payment_id = payment.id + payment.action_post() + prepaid._compute_payment_amount() + return { + 'type': 'ir.actions.act_window', + 'res_model': 'account.payment', + 'res_id': payment.id, + 'view_mode': 'form', + 'view_type': 'form', + 'target': 'self' + } + + + diff --git a/l10n_ru_advance_payments/wizard/account_payment_register_prepaid.xml b/l10n_ru_advance_payments/wizard/account_payment_register_prepaid.xml new file mode 100644 index 00000000..1e6a93cd --- /dev/null +++ b/l10n_ru_advance_payments/wizard/account_payment_register_prepaid.xml @@ -0,0 +1,43 @@ + + + + + account.payment.register.prepaid.form + payment.register.prepaid + +
+ + + + + + + + + + + + + + + +
+
+
+
+
+
+
diff --git a/l10n_ru_attorney/README.md b/l10n_ru_attorney/README.md new file mode 100644 index 00000000..58c8d910 --- /dev/null +++ b/l10n_ru_attorney/README.md @@ -0,0 +1,21 @@ +# Российская локализация - Доверенность +name: l10n_ru_attorney + +## Описание +Создание списка доверенностей на получение ТМЦ и их печать. + +###Создание доверенности: +1. Меню Покупки - Доверенности - кнопка "Создать"; +2. На форме указываем: + + 2.1. Контрагент - поставщик; + + 2.2. Заказ на закупку; + + 2.3. Даты действия доверенности ("дата выдачи" и "действительно по"). + + +###Для печати: +1. Меню Настройки - Техническое - Отчеты; +2. Находим в списке l10n_ru_attorney и добавляем в меню "Печать"; +3. Открываем созданную запись доверенности - Действие - "Доверенность". \ No newline at end of file diff --git a/l10n_ru_attorney/__init__.py b/l10n_ru_attorney/__init__.py new file mode 100644 index 00000000..5305644d --- /dev/null +++ b/l10n_ru_attorney/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import models \ No newline at end of file diff --git a/l10n_ru_attorney/__manifest__.py b/l10n_ru_attorney/__manifest__.py new file mode 100644 index 00000000..fc49d1b0 --- /dev/null +++ b/l10n_ru_attorney/__manifest__.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +{ + 'name': "Российская локализация - Доверенность", + + 'summary': """ + Печать доверенности на получение ТМЦ + """, + + 'description': """ + Создание списка доверенностей на получение ТМЦ и их печать. + + Создание доверенности: + 1. Меню Покупки - Доверенности - кнопка "Создать"; + 2. На форме указываем: + 2.1. Контрагент - поставщик; + 2.2. Заказ на закупку; + 2.3. Даты действия доверенности ("дата выдачи" и "действительно по"). + + Для печати: + 1. Меню Настройки - Техническое - Отчеты; + 2. Находим в списке l10n_ru_attorney и добавляем в меню "Печать"; + 3. Открываем созданную запись доверенности - Действие - "Доверенность". + """, + + 'author': "MK.Lab", + 'website': "https://www.inf-centre.ru/", + + 'category': 'Uncategorized', + 'version': '0.1', + + # any module necessary for this one to work correctly + 'depends': ['base', 'account', 'sale', 'purchase', 'hr', 'l10n_ru_base'], + + # always loaded + 'data': [ + 'security/ir.model.access.csv', + 'views/base_consent_views.xml', + 'views/hr_employee_views.xml', + 'views/purchase_order_views.xml', + 'report/consent_report.xml', + ], + 'demo': [ + 'demo/demo.xml', + ], +} diff --git a/l10n_ru_attorney/demo/demo.xml b/l10n_ru_attorney/demo/demo.xml new file mode 100644 index 00000000..4efb1dee --- /dev/null +++ b/l10n_ru_attorney/demo/demo.xml @@ -0,0 +1,36 @@ + + + + + + + ООО "Снабжение Плюс" + + Москва + + + + + Иванов Иван Иванович + Менеджер по закупкам + + + + + + 2026-01-15 10:00:00 + + + + + ДОВ-2026-001 + 2026-01-15 + 2026-07-15 + + + + + + + + diff --git a/l10n_ru_attorney/models/__init__.py b/l10n_ru_attorney/models/__init__.py new file mode 100644 index 00000000..0cad7149 --- /dev/null +++ b/l10n_ru_attorney/models/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- + +from . import base_consent +from . import hr_employee +from . import purchase_order \ No newline at end of file diff --git a/l10n_ru_attorney/models/base_consent.py b/l10n_ru_attorney/models/base_consent.py new file mode 100644 index 00000000..a70a0227 --- /dev/null +++ b/l10n_ru_attorney/models/base_consent.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- + +from odoo import api, fields, models, _ +from datetime import datetime, timedelta + + +class BaseConsent(models.Model): + _name = 'base.consent' + _inherit = ['mail.thread', 'utm.mixin'] + _description = 'Consent' + _order = 'date_from desc' + + name = fields.Char(string=_('Номер')) + date_from = fields.Date(string=_('Дата выдачи'), default=lambda self: fields.Datetime.now()) + date_to = fields.Date(string=_('Действительна по'), default=lambda self: datetime.today() + timedelta(days=180)) + partner_id = fields.Many2one('res.partner', string=_('Контрагент'), required=1) + employee_id = fields.Many2one('hr.employee', string=_('Сотрудник'), required=1) + purchaseorder_id = fields.Many2one('purchase.order', _('Заказ на закупку'), domain="[('partner_id','=',partner_id)]", + required=1) + company_id = fields.Many2one('res.company', string=_('Компания'), + default=lambda self: self.env.company, + required=1) + + @api.model_create_multi + def create(self, vals_list): + for vals in vals_list: + if not vals.get("name"): + vals["name"] = self.env["ir.sequence"].next_by_code("base.consent") + + records = super().create(vals_list) + for record in records: + if record.purchaseorder_id: + record.purchaseorder_id.sudo().write({ + "consent_id": record.id + }) + + return records + + @api.onchange('purchaseorder_id') + def set_partner(self): + if self.purchaseorder_id: + self.partner_id = self.purchaseorder_id.partner_id + + @api.constrains('purchaseorder_id') + def fill_order(self): + p_orders = self.env['purchase.order'].sudo().browse(self.purchaseorder_id.id) + for order in p_orders: + order.consent_id = self.id diff --git a/l10n_ru_attorney/models/hr_employee.py b/l10n_ru_attorney/models/hr_employee.py new file mode 100644 index 00000000..1e632581 --- /dev/null +++ b/l10n_ru_attorney/models/hr_employee.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- + +from odoo import fields, models, _ + + +class HrEmployee(models.Model): + _inherit = 'hr.employee' + + inn = fields.Char(string=_("ИНН")) + pass_kem = fields.Char(string=_("Кем выдан паспорт")) + pass_date = fields.Date(string=_('Дата выдачи паспорта')) diff --git a/l10n_ru_attorney/models/purchase_order.py b/l10n_ru_attorney/models/purchase_order.py new file mode 100644 index 00000000..aa178c66 --- /dev/null +++ b/l10n_ru_attorney/models/purchase_order.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- + +from odoo import fields, models, _ + + +class PurchaseOrder(models.Model): + _inherit = 'purchase.order' + + consent_id = fields.Many2one('base.consent', string=_('Доверенность')) diff --git a/l10n_ru_attorney/report/consent_report.xml b/l10n_ru_attorney/report/consent_report.xml new file mode 100644 index 00000000..a187e641 --- /dev/null +++ b/l10n_ru_attorney/report/consent_report.xml @@ -0,0 +1,305 @@ + + + + + + + Доверенность + base.consent + (u'Доверенность - %s.pdf' % (object.name)) + + qweb-pdf + l10n_ru_attorney.report_consent + + + + A4 + + A4 + 0 + 0 + Portrait + 15 + 15 + 7 + 7 + + 10 + 90 + + + + + diff --git a/l10n_ru_attorney/security/ir.model.access.csv b/l10n_ru_attorney/security/ir.model.access.csv new file mode 100644 index 00000000..ee8128f0 --- /dev/null +++ b/l10n_ru_attorney/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_base_consent,base.consent,model_base_consent,base.group_user,1,1,1,1 diff --git a/l10n_ru_attorney/tests/__init__.py b/l10n_ru_attorney/tests/__init__.py new file mode 100644 index 00000000..fdfe2ba9 --- /dev/null +++ b/l10n_ru_attorney/tests/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import test_base_consent diff --git a/l10n_ru_attorney/tests/test_base_consent.py b/l10n_ru_attorney/tests/test_base_consent.py new file mode 100644 index 00000000..bba93926 --- /dev/null +++ b/l10n_ru_attorney/tests/test_base_consent.py @@ -0,0 +1,136 @@ +# -*- coding: utf-8 -*- +""" +Tests for l10n_ru_attorney — attorney (base.consent) creation, autonumbering, +and linkage to purchase orders. + +Validates: Requirements 17.1, 17.2, 17.3 +""" +from odoo.tests.common import TransactionCase + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + +def _make_partner(env): + """Create a company partner (supplier).""" + return env['res.partner'].create({ + 'name': 'Test Supplier Attorney', + 'is_company': True, + }) + + +def _make_employee(env): + """Create a minimal hr.employee.""" + return env['hr.employee'].create({ + 'name': 'Test Employee Attorney', + }) + + +def _make_purchase_order(env, partner): + """Create a minimal purchase.order.""" + return env['purchase.order'].create({ + 'partner_id': partner.id, + }) + + +def _make_consent(env, partner, employee, purchase_order, name=None): + """Create a base.consent record.""" + vals = { + 'partner_id': partner.id, + 'employee_id': employee.id, + 'purchaseorder_id': purchase_order.id, + } + if name: + vals['name'] = name + return env['base.consent'].create(vals) + + +# --------------------------------------------------------------------------- +# TestBaseConsent +# --------------------------------------------------------------------------- + +class TestBaseConsent(TransactionCase): + """ + Tests for base.consent creation: autonumbering via ir.sequence, + write-back of consent_id to purchase.order, and fill_order constraint. + + Validates: Requirements 17.1, 17.2, 17.3 + """ + + def setUp(self): + super().setUp() + self.partner = _make_partner(self.env) + self.employee = _make_employee(self.env) + self.purchase_order = _make_purchase_order(self.env, self.partner) + + # ------------------------------------------------------------------ + # Requirement 17.1 — autonumber via ir.sequence when name is absent + # ------------------------------------------------------------------ + + def test_create_autonumber(self): + """ + Req 17.1 — creating base.consent without a name assigns a number + via ir.sequence with code 'base.consent'. + """ + consent = _make_consent( + self.env, self.partner, self.employee, self.purchase_order + ) + self.assertTrue( + consent.name, + "consent.name should be set automatically via ir.sequence", + ) + # A manually-supplied name must be preserved as-is + consent2 = _make_consent( + self.env, self.partner, self.employee, self.purchase_order, + name='MANUAL-001', + ) + self.assertEqual( + consent2.name, 'MANUAL-001', + "Explicitly supplied name should not be overwritten", + ) + + # ------------------------------------------------------------------ + # Requirement 17.2 — purchase.order.consent_id set after create + # ------------------------------------------------------------------ + + def test_create_writes_back_to_purchase_order(self): + """ + Req 17.2 — after creating base.consent linked to a purchase.order, + purchase.order.consent_id equals the created consent. + """ + consent = _make_consent( + self.env, self.partner, self.employee, self.purchase_order + ) + self.purchase_order.invalidate_recordset() + self.assertEqual( + self.purchase_order.consent_id.id, + consent.id, + "purchase.order.consent_id should be set to the created consent", + ) + + # ------------------------------------------------------------------ + # Requirement 17.3 — fill_order constraint writes consent_id to order + # ------------------------------------------------------------------ + + def test_constrains_fill_order(self): + """ + Req 17.3 — the @api.constrains('purchaseorder_id') method fill_order + writes consent_id into the linked purchase.order. + """ + # Create a second purchase order to reassign to + second_order = _make_purchase_order(self.env, self.partner) + + consent = _make_consent( + self.env, self.partner, self.employee, self.purchase_order + ) + + # Reassign to second_order — this triggers fill_order constraint + consent.write({'purchaseorder_id': second_order.id}) + + second_order.invalidate_recordset() + self.assertEqual( + second_order.consent_id.id, + consent.id, + "fill_order should write consent_id into the newly assigned purchase.order", + ) diff --git a/l10n_ru_attorney/views/base_consent_views.xml b/l10n_ru_attorney/views/base_consent_views.xml new file mode 100644 index 00000000..359fd6c6 --- /dev/null +++ b/l10n_ru_attorney/views/base_consent_views.xml @@ -0,0 +1,62 @@ + + + + + Consents + base.consent + + + + + + + + + + + + + consent.form + base.consent + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + Доверенности + base.consent + list,form + + + + + + Consents + base.consent + CON + 5 + + + +
+
diff --git a/l10n_ru_attorney/views/hr_employee_views.xml b/l10n_ru_attorney/views/hr_employee_views.xml new file mode 100644 index 00000000..b0617e1a --- /dev/null +++ b/l10n_ru_attorney/views/hr_employee_views.xml @@ -0,0 +1,19 @@ + + + + + view_employee_form.inherit + hr.employee + + + + + + + + + + + + + diff --git a/l10n_ru_attorney/views/purchase_order_views.xml b/l10n_ru_attorney/views/purchase_order_views.xml new file mode 100644 index 00000000..618e27e9 --- /dev/null +++ b/l10n_ru_attorney/views/purchase_order_views.xml @@ -0,0 +1,16 @@ + + + + + purchase.order.form.inherit + purchase.order + + + + + + + + + diff --git a/l10n_ru_base/README.md b/l10n_ru_base/README.md new file mode 100644 index 00000000..520efe09 --- /dev/null +++ b/l10n_ru_base/README.md @@ -0,0 +1,17 @@ +# Российская локализация - Базовый +name: l10n_ru_base + +## Описание +Российская локализация: основные отчеты и печатные формы. Это базовый модуль для работы с модулями локализации. + +### Для включения модулей: +1. Меню Настройки - в боковом меню "Российская локализация"; +2. Выбирается нужный блок для подключения дополнительных возможностей по локализации. + +### Перечень модулей локализации: +1. Российская локализация - Акт сверки (l10n_ru_act_rev) +2. Российская локализация - Доверенность (l10n_ru_attorney) +3. Российская локализация - Договоры (l10n_ru_contract) +4. Российская локализация - Документы (l10n_ru_doc) +5. Российская локализация - УПД в xml-формате (l10n_ru_upd_xml) +6. Российская локализация - Авансовые платежи (l10n_ru_advance_payments) diff --git a/l10n_ru_base/__init__.py b/l10n_ru_base/__init__.py new file mode 100644 index 00000000..899bcc97 --- /dev/null +++ b/l10n_ru_base/__init__.py @@ -0,0 +1,2 @@ +from . import models + diff --git a/l10n_ru_base/__manifest__.py b/l10n_ru_base/__manifest__.py new file mode 100644 index 00000000..148a0198 --- /dev/null +++ b/l10n_ru_base/__manifest__.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +{ + 'name': "Российская локализация - Базовый", + 'summary': """ + Российская локализация: основные отчеты и печатные формы. + """, + + 'description': """ + Российская локализация: основные отчеты и печатные формы. + + Для включения модулей: + 1. Меню Настройки - в боковом меню "Российская локализация" + 2. Выбирается нужный блок. + """, + + 'author': "MK.Lab", + 'website': "https://www.inf-centre.ru/", + + 'version': '19.0.2025.11.11', + 'license': 'LGPL-3', + 'category': 'Uncategorized', + + 'depends': [], + + 'data': [ + 'views/res_config_settings_views.xml', + ], +} diff --git a/l10n_ru_base/i18n/ru_RU.po b/l10n_ru_base/i18n/ru_RU.po new file mode 100644 index 00000000..8aaf339f --- /dev/null +++ b/l10n_ru_base/i18n/ru_RU.po @@ -0,0 +1,110 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_russian_localization +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e-20240904\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-10-29 07:45+0000\n" +"PO-Revision-Date: 2024-10-29 07:45+0000\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_russian_localization +#. odoo-python +#: code:addons/base_russian_localization/models/res_config_settings.py:0 +#: model:ir.model.fields,field_description:base_russian_localization.field_res_config_settings__module_act_revise +#: model_terms:ir.ui.view,arch_db:base_russian_localization.res_config_settings_view_form +#, python-format +msgid "Act revise" +msgstr "Акт сверки" + +#. module: base_russian_localization +#: model:ir.model.fields,field_description:base_russian_localization.field_res_config_settings__company_status_rf +msgid "Company Status Rf" +msgstr "Статус компании" + +#. module: base_russian_localization +#: model:ir.model,name:base_russian_localization.model_res_config_settings +msgid "Config Settings" +msgstr "Параметры конфигурации" + +#. module: base_russian_localization +#. odoo-python +#: code:addons/base_russian_localization/models/res_config_settings.py:0 +#: model:ir.model.fields,field_description:base_russian_localization.field_res_config_settings__module_fehu_base_consent +#: model_terms:ir.ui.view,arch_db:base_russian_localization.res_config_settings_view_form +#, python-format +msgid "Consent" +msgstr "Доверенность" + +#. module: base_russian_localization +#. odoo-python +#: code:addons/base_russian_localization/models/res_config_settings.py:0 +#: model:ir.model.fields,field_description:base_russian_localization.field_res_config_settings__module_contract +#, python-format +msgid "Contract" +msgstr "Договор" + +#. module: base_russian_localization +#: model_terms:ir.ui.view,arch_db:base_russian_localization.res_config_settings_view_form +msgid "Contracts" +msgstr "Договоры" + +#. module: base_russian_localization +#: model_terms:ir.ui.view,arch_db:base_russian_localization.res_config_settings_view_form +msgid "Powers of attorney" +msgstr "Доверенность на получение ТМЦ" + +#. module: base_russian_localization +#. odoo-python +#: code:addons/base_russian_localization/models/res_config_settings.py:0 +#: model:ir.model.fields,field_description:base_russian_localization.field_res_config_settings__module_l10n_ru_doc +#: model_terms:ir.ui.view,arch_db:base_russian_localization.res_config_settings_view_form +#, python-format +msgid "Print forms" +msgstr "Печатные формы" + +#. module: base_russian_localization +#: model_terms:ir.ui.view,arch_db:base_russian_localization.res_config_settings_view_form +msgid "Report act revise" +msgstr "Отчет Акт сверки" + +#. module: base_russian_localization +#: model_terms:ir.ui.view,arch_db:base_russian_localization.res_config_settings_view_form +msgid "Report contract" +msgstr "Договоры" + +#. module: base_russian_localization +#: model_terms:ir.ui.view,arch_db:base_russian_localization.res_config_settings_view_form +msgid "Report report_xml" +msgstr "УПД в формате xml для ЭДО" + +#. module: base_russian_localization +#. odoo-python +#: code:addons/base_russian_localization/models/res_config_settings.py:0 +#: model:ir.model.fields,field_description:base_russian_localization.field_res_config_settings__module_report_xml +#, python-format +msgid "Report_xml" +msgstr "Универсальный передаточный документ (УПД) в формате xml для ЭДО" + +#. module: base_russian_localization +#: model_terms:ir.ui.view,arch_db:base_russian_localization.res_config_settings_view_form +msgid "Russian Localization" +msgstr "Российская локализация" + + +#. module: base_russian_localization +#: model_terms:ir.ui.view,arch_db:base_russian_localization.res_config_settings_view_form +msgid "UPD xml" +msgstr "УПД в формате xml для ЭДО" + +#. module: base_russian_localization +#: model_terms:ir.ui.view,arch_db:base_russian_localization.res_config_settings_view_form +msgid "print_forms" +msgstr "Печатные формы документов" diff --git a/l10n_ru_base/models/__init__.py b/l10n_ru_base/models/__init__.py new file mode 100644 index 00000000..4a304019 --- /dev/null +++ b/l10n_ru_base/models/__init__.py @@ -0,0 +1,4 @@ +from . import res_config_settings + + + diff --git a/l10n_ru_base/models/res_config_settings.py b/l10n_ru_base/models/res_config_settings.py new file mode 100644 index 00000000..33fe58df --- /dev/null +++ b/l10n_ru_base/models/res_config_settings.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import _, api, fields, models +from odoo.exceptions import UserError + +_FIELDS_MODUL = [ + 'module_l10n_ru_act_rev', + 'module_l10n_ru_contract', + 'module_l10n_ru_upd_xml', + 'module_l10n_ru_doc', + 'module_l10n_ru_attorney', + 'module_l10n_ru_advance_payments' +] + +class ResConfigSettings(models.TransientModel): + _inherit = 'res.config.settings' + + module_l10n_ru_act_rev = fields.Boolean(_("Act revise")) + module_l10n_ru_contract = fields.Boolean(_("Contract")) + module_l10n_ru_upd_xml = fields.Boolean(_("Report_xml")) + module_l10n_ru_doc = fields.Boolean(_("Print forms")) + module_l10n_ru_attorney = fields.Boolean(_("Consent")) + module_l10n_ru_advance_payments = fields.Boolean(_("Advance payments")) + + @api.model + def write(self, values): + company = self.env.company + if company.country_id.code != 'RU': + if any(field in values for field in _FIELDS_MODUL): + raise UserError("Признак Российской компании не обнаружен!") + if _FIELDS_MODUL: + missing_modules = set() + for field in _FIELDS_MODUL: + if self.mapped(field)[0]: + module_name = field[7:] + module_installed = self.env['ir.module.module'].search([('name', '=', module_name)], limit=1) + if not module_installed: + missing_modules.add(module_name) + if missing_modules: + message = "Обратитесь в тех.поддержку для получения лицензии для следующих модулей:\n" + \ + "\n".join(missing_modules) + raise UserError(message) + return super(ResConfigSettings, self).write(values) diff --git a/l10n_ru_base/static/description/icon.png b/l10n_ru_base/static/description/icon.png new file mode 100644 index 00000000..5ea24f8c Binary files /dev/null and b/l10n_ru_base/static/description/icon.png differ diff --git a/l10n_ru_base/views/res_config_settings_views.xml b/l10n_ru_base/views/res_config_settings_views.xml new file mode 100644 index 00000000..57127bb6 --- /dev/null +++ b/l10n_ru_base/views/res_config_settings_views.xml @@ -0,0 +1,66 @@ + + + + + res.config.settings.view.form.inherit.russian.localization + res.config.settings + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/l10n_ru_contract/.gitignore b/l10n_ru_contract/.gitignore new file mode 100644 index 00000000..b0b6f3a3 --- /dev/null +++ b/l10n_ru_contract/.gitignore @@ -0,0 +1,160 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +.idea/ \ No newline at end of file diff --git a/l10n_ru_contract/README.md b/l10n_ru_contract/README.md new file mode 100644 index 00000000..6b6074fb --- /dev/null +++ b/l10n_ru_contract/README.md @@ -0,0 +1,30 @@ +# Российская локализация - Договоры +name: l10n_ru_contract + + +## Описание +Создание договоров с клиентами и поставщиками в системе. +Возможность разделения договоров на виды, отслеживание статуса договора. Вы также можете распечатать договор из системы. + +### Создание вида договора клиента(поставщика): +1. Меню Продажи (Покупки) - Договоры - Виды договора - кнопка "Создать"; +2. На форме указываем: + + 2.1. Журнал и счета дебетовой и кредиторской задолженности; + + 2.2. Присваиваем новое название. + +### Создание договора клиента (поставщика): +1. Меню Продажи (Покупки) - Договоры - кнопка "Создать"; +2. На форме указываем основные и дополнительные условия договора: + + 2.1. Контрагент - клиент (поставщик); + + 2.2. Тип контрагента; + + 2.3. Компанию, от лица которой будет подписан договор; + + 2.4. Вид договора. + +### Для печати: +1. Открываем созданную запись договора - Действие - "Договор". \ No newline at end of file diff --git a/l10n_ru_contract/__init__.py b/l10n_ru_contract/__init__.py new file mode 100644 index 00000000..7db66946 --- /dev/null +++ b/l10n_ru_contract/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +from . import models +from . import report diff --git a/l10n_ru_contract/__manifest__.py b/l10n_ru_contract/__manifest__.py new file mode 100644 index 00000000..8b691c56 --- /dev/null +++ b/l10n_ru_contract/__manifest__.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +{ + 'name': 'Российская локализация - Договоры', + 'summary': """ + Создание договоров, их видов и печать + """, + + 'description': """ + Создание договоров с клиентами и поставщиками. Возможность разделения на виды договоров, отслеживание статуса договора и его печатью + Создание вида договора клиента(поставщика): + 1. Меню Продажи (Покупки) - Договоры - Виды договора - кнопка "Создать"; + 2. На форме указываем: + 2.1. Журнал и счета дебетовой и кредиторской задолженности; + 2.2. Присваиваем новое название. + + Создание договора клиента (поставщика): + 1. Меню Продажи (Покупки) - Договоры - кнопка "Создать"; + 2. На форме указываем основные и дополнительные условия договора: + 2.1. Контрагент - клиент (поставщик); + 2.2. Тип контрагента; + 2.3. Компанию, от лица которой будет подписан договор; + 2.4. Вид договора. + + Для печати: + 1. Открываем созданную запись договора - Действие - "Договор". + """, + + 'version': '19.0.1.0.0', + 'sequence': 0, + 'author': 'MK.Lab', + 'website': 'https://www.inf-centre.ru/', + 'depends': [ + 'base', + 'mail', + 'l10n_ru_base', + 'report_weasyprint', + ], + "external_dependencies": { + "python": ["weasyprint"], + }, + 'data': [ + 'data/data.xml', + 'report/report_contract_simple.xml', + 'views/contract_customer_view.xml', + "views/contract_header_templates.xml", + 'views/res_company_views.xml', + 'views/res_partner_views.xml', + 'views/contract_profile_views.xml', + 'security/ir.model.access.csv', + 'report/report_contract.xml', + ], + 'demo': [ + 'demo/demo.xml', + ], + 'installable': True, + 'auto_install': False, +} diff --git a/l10n_ru_contract/data/data.xml b/l10n_ru_contract/data/data.xml new file mode 100644 index 00000000..3b1bf110 --- /dev/null +++ b/l10n_ru_contract/data/data.xml @@ -0,0 +1,21 @@ + + + + + Договор последовательность клиент + partner.contract.customer.sequence + + + + 5 + + + Договор последовательность поставщик + partner.contract.supplier.sequence + + + + 5 + + + diff --git a/l10n_ru_contract/demo/demo.xml b/l10n_ru_contract/demo/demo.xml new file mode 100644 index 00000000..cb9413ef --- /dev/null +++ b/l10n_ru_contract/demo/demo.xml @@ -0,0 +1,101 @@ + + + + + + + + + Договор поставки + + + Договор оказания услуг + + + Агентский договор + + + + + Понедельник + + + Среда + + + Пятница + + + + + + + ООО "Торговый Дом Альфа" + + ул. Ленина, д. 10 + Москва + 101000 + 7701234567 + 770101001 + 1027700000001 + 12345678 + + + + + ООО "Производственная Компания Бета" + + пр. Мира, д. 25 + Санкт-Петербург + 190000 + 7802345678 + 780201001 + 1027800000002 + 87654321 + + + + + + + 2026-01-01 + 2026-12-31 + + + + customer + signed + company + + + + + 2026-01-01 + 2026-12-31 + + + + supplier + signed + company + + + + + + 10 + 1.1 + <p>Поставщик обязуется поставить товар в соответствии с условиями настоящего договора.</p> + + + + 20 + 1.2 + <p>Покупатель обязуется принять и оплатить товар в установленные сроки.</p> + + + + + + diff --git a/l10n_ru_contract/models/__init__.py b/l10n_ru_contract/models/__init__.py new file mode 100644 index 00000000..fcb967b4 --- /dev/null +++ b/l10n_ru_contract/models/__init__.py @@ -0,0 +1,9 @@ +from . import partner_contract_customer +from . import dop_field +from . import res_partner +from . import res_partner_bank +from . import res_company +from . import contract_day +from . import contract_allowed_profiles +from . import contract_line +from . import contract_profile \ No newline at end of file diff --git a/l10n_ru_contract/models/account_move.py b/l10n_ru_contract/models/account_move.py new file mode 100644 index 00000000..06cbf321 --- /dev/null +++ b/l10n_ru_contract/models/account_move.py @@ -0,0 +1,50 @@ +from odoo import api, fields, models, exceptions, _ + + +class AccountMove(models.Model): + _inherit = 'account.move' + + mt_contract_id = fields.Many2one('partner.contract.customer', string=_('Номер договора')) + sf_number = fields.Char(string=_('Номер с/ф')) + osnovanie = fields.Char(string=_('Основание')) + sec_partner_id = fields.Many2one('res.partner', string=_('Контрагент'), store=True, compute='_compute_get_pid') + stamp = fields.Boolean(string=_('Печать и подпись'), related='mt_contract_id.stamp') + + @api.depends('partner_id') + def _compute_get_pid(self): + for s in self: + s.sec_partner_id = s.partner_id.parent_id if s.partner_id.parent_id else s.partner_id + + @api.onchange('mt_contract_id') + def set_ons(self): + if self.mt_contract_id: + self.osnovanie = 'Договор № ' + self.mt_contract_id.name + ' от ' + fields.Datetime.from_string( + self.mt_contract_id.date_start).strftime("%d.%m.%Y") + + @api.constrains('state') + def invoice_fields_check(self): + for s in self: + if s.state == 'posted': + if s.mt_contract_id: + errors_list = [] + journal_in_contract = s.mt_contract_id.profile_id.journal_id + payment_term_in_contract = s.mt_contract_id.profile_id.payment_term_id + receivable_in_contract = s.mt_contract_id.profile_id.receivable_account_id + + if journal_in_contract != s.journal_id: + errors_list.append(f'Отличается Журнал - [{s.journal_id.name}] ' + f'и указанный в договоре №{s.mt_contract_id.name} ' + f'Журнал - [{journal_in_contract.name}]\n\n') + + if payment_term_in_contract != s.invoice_payment_term_id: + errors_list.append(f'Отличается поле "Условие оплаты" в инвойсе ' + f'[Условие оплаты - {s.invoice_payment_term_id.name}] ' + f'и указанный в договоре №{s.mt_contract_id.name} ' + f'[Условие оплаты - {payment_term_in_contract.name}]\n\n') + + if receivable_in_contract not in s.line_ids.account_id: + errors_list.append(f'Отличается поле "Счет дебиторской задолженности" в инвойсе ' + f'и указанный в договоре №{s.mt_contract_id.name}') + + if errors_list: + raise exceptions.ValidationError(''.join(errors_list)) \ No newline at end of file diff --git a/l10n_ru_contract/models/contract_allowed_profiles.py b/l10n_ru_contract/models/contract_allowed_profiles.py new file mode 100644 index 00000000..325de2dd --- /dev/null +++ b/l10n_ru_contract/models/contract_allowed_profiles.py @@ -0,0 +1,16 @@ +from odoo import api, fields, models + +class AllowedProfiles(models.Model): + _name = 'contract.allowed.profiles' + name = fields.Char(string='Одновременно включены следующие виды договоров:') + allowed_profiles = fields.Many2many('contract.profile', string='Виды договоров', required=True) + + @api.onchange('allowed_profiles') + def set_name(self): + for s in self: + s.name = '' + for profile in s.allowed_profiles: + s.name += profile.name + ' + ' + if s.name: + if s.name[-2] == '+': + s.name = s.name[:-2] \ No newline at end of file diff --git a/l10n_ru_contract/models/contract_customer.py b/l10n_ru_contract/models/contract_customer.py new file mode 100644 index 00000000..5e6477e7 --- /dev/null +++ b/l10n_ru_contract/models/contract_customer.py @@ -0,0 +1,498 @@ +# -*- coding: utf-8 -*- +from odoo import api, fields, models, exceptions, tools, _ +import pymorphy2 +from datetime import datetime, timedelta +from dateutil.relativedelta import relativedelta +from .crutch_fields_header import IP_CONTACT_HEADER, ENTITY_CONTRACT_HEADER, INDIVIDUAL_CONTRACT_HEADER +from odoo.exceptions import UserError +import re +import base64 +from io import BytesIO +from docx import Document +from docx.shared import Pt, Inches +from docx.enum.text import WD_ALIGN_PARAGRAPH + + +class PartnerContractCustomer(models.Model): + _name = 'partner.contract.customer' + _inherit = ['mail.thread', 'mail.activity.mixin', 'mail.render.mixin'] + + def get_dateend(self): + for s in self: + if s.date_start: + six_months = fields.Datetime.from_string(s.date_start) + relativedelta(months=+11) + else: + six_months = datetime.today() + relativedelta(months=+11) + return fields.Datetime.to_string(six_months) + + name = fields.Char(string='Номер') + date_start = fields.Date(string='Дата договора', required=True, default=fields.Datetime.now()) + partner_id = fields.Many2one('res.partner', string=_('Контрагент'), required=True) + sec_partner_id = fields.Many2one('res.partner', string=_('Контрагент как в заказе')) + company_id = fields.Many2one('res.company', string=_('Компания'), required=True) + name_print = fields.Char(string=_('Имя для печати'), compute='_get_name_print') + name_print1 = fields.Char(string=_('Имя для печати, И.П.'), compute='_get_name_printip') + date_end = fields.Date(string=_('Дата окончания'), required=True, default=get_dateend) + name_dirprint = fields.Char(string=_('Имя нашего директора для печати')) + name_dirprint1 = fields.Char(string=_('Имя нашего директора для печати И.П.')) + lines = fields.One2many('contract.line', 'contract_id', string=_('Договорные цены')) + type = fields.Selection( + [('customer', 'С покупателем'), + ('supplier', 'С поставщиком'), + ('other', 'Прочие расчеты'), + + ], + string=_('Тип договора'), default='customer', required=True) + saleorder_id = fields.Many2one('sale.order', string=_('Заказ/Сделка')) + stamp = fields.Boolean(string=_('Печать и подпись')) + signed = fields.Boolean(string=_('Договор подписан')) + state = fields.Selection( + [('draft', 'Черновик'), + ('progress', 'На согласовании'), + ('signed', 'Подписан, действует'), + ('closed', 'Истёк'), + ], + string=_('Статус'), default='draft', group_expand='_expand_states', index=True + ) + is_template = fields.Boolean(_('Это шаблон')) + copy_from = fields.Many2one('partner.contract.customer', string=_('Копировать из этого шаблона')) + profile_id = fields.Many2one('contract.profile', string=_('Вид договора'), required=True) + credit_limit = fields.Float(string=_('Лимит кредита')) + guid_1s = fields.Char(_('Код договора из 1С')) + buh_code = fields.Char(_('Код договора из бухгалтерии')) + payment_term_id = fields.Many2one('account.payment.term', string=_('Условие оплаты')) + manager_id = fields.Many2one('res.users', string=_('Менеджер по продажам')) + accountant_id = fields.Many2one('res.users', string=_('Бухгалтер по взаиморасчетам')) + time_to_delivery_from = fields.Datetime(_('Время доставки от')) + time_to_delivery_to = fields.Datetime(_('Время доставки до')) + day_of_delivery = fields.Float(_('Дни доставки')) + day_of_otgruzki = fields.Float(_('Дни отгрузки')) + + channel_id = fields.Many2one('saleorder.channel', string=_('Канал продаж')) + team_id = fields.Many2one('crm.team', string=_('Команда продаж')) + order_days_ids = fields.Many2many(comodel_name='contract.day', relation='orderdays', string=_('Дни доставки'), + column1='contract_id', column2='day_id') + shipment_days_ids = fields.Many2many(comodel_name='contract.day', relation='shipmentdays', string=_('Дни отгрузки'), + column1='contract_id', + column2='day_id') + # Доработка хедера договора + partner_type = fields.Selection(string=_('Тип контрагента'), selection=[ + ('person', 'Физ. лицо'), + ('company_ip', 'ИП'), + ('company', 'Юр. лицо') + ], required=True) + contract_header = fields.Html(_('Шапка договора')) + + @api.onchange('partner_type') + def generate_contract_header(self): + self.ensure_one() + self.render_model = 'partner.contract.customer' + if self.partner_type == 'company_ip': + self.contract_header = IP_CONTACT_HEADER + elif self.partner_type == 'person': + self.contract_header = INDIVIDUAL_CONTRACT_HEADER + else: + self.contract_header = ENTITY_CONTRACT_HEADER + # # Рендер Jinja выражение типа {{object.field}} + result = self._render_template(self.contract_header, self.render_model, res_ids=[self.id]) + result = tools.html_sanitize(result[self.id]) + self.contract_header = result + + @api.onchange('sec_partner_id') + def set_pid(self): + for s in self: + s.partner_id = s.sec_partner_id.parent_id if s.sec_partner_id.parent_id else s.sec_partner_id + + def _expand_states(self, states, domain, order): + return [key for key, val in type(self).state.selection] + + def copy_it(self): + for s in self: + if s.copy_from: + for line in s.copy_from.lines: + line.copy({'contract_id': s.id}) + + def _get_name_print(self): + morph = pymorphy2.MorphAnalyzer() + for s in self: + s.name_print = False + director = self.env['res.partner'].search([('parent_id', '=', s.partner_id.id), ('type', '=', 'director')], + limit=1) + if director: + if len(director.name.split(' ')) == 3: + lastname_old, firstname_old, middlename_old = director.name.split(' ') + + if lastname_old: + lastname_n = morph.parse(lastname_old)[0] + if lastname_n.inflect({'gent'}): + lastname_n = lastname_n.inflect({'gent'}).word + else: + lastname_n = lastname_old + else: + lastname_n = '' + + if firstname_old: + firstname_n = morph.parse(firstname_old)[0] + firstname_n = firstname_n.inflect({'gent'}).word + else: + firstname_n = '' + + if middlename_old: + middlename_n = morph.parse(middlename_old)[0] + middlename_n = middlename_n.inflect({'gent'}).word + else: + middlename_n = '' + + name_print = lastname_n + ' ' + firstname_n + ' ' + middlename_n + + s.name_print = name_print.title() + + def _get_name_print1(self): + morph = pymorphy2.MorphAnalyzer() + for s in self: + director = s.company_id.chief_id.partner_id if s.company_id.chief_id else False + # raise exceptions.UserError(str(director)) + s.name_dirprint = False + if director: + if len(director.name.split(' ')) == 3: + lastname_old, firstname_old, middlename_old = director.name.split(' ') + + if lastname_old: + lastname_n = morph.parse(lastname_old)[0] + lastname_n = lastname_n.inflect({'gent'}).word + else: + lastname_n = '' + + if firstname_old: + firstname_n = morph.parse(firstname_old)[0] + firstname_n = firstname_n.inflect({'gent'}).word + else: + firstname_n = '' + + if middlename_old: + middlename_n = morph.parse(middlename_old)[0] + middlename_n = middlename_n.inflect({'gent'}).word + else: + middlename_n = '' + + name_print = lastname_n + ' ' + firstname_n + ' ' + middlename_n + + s.name_dirprint = name_print.title() + + @api.model + def create(self, vals_list): + if isinstance(vals_list, dict): + vals_list = [vals_list] + + records = super().create(vals_list) + + for record, vals in zip(records, vals_list): + if vals.get('is_template'): + continue + if vals.get('type') == 'customer': + sequence_code = 'partner.contract.customer.sequence' + elif vals.get('type') == 'supplier': + sequence_code = 'partner.contract.supplier.sequence' + else: + continue + name = self.env['ir.sequence'].next_by_code(sequence_code) + record.name = name + + return records + + # @api.model + def write(self, values): + + if 'state' in values: + if self.state != values['state']: + msg = 'Статус: ' + dict(self._fields['state'].selection).get(self.state) + ' -> ' + dict( + self._fields['state'].selection).get(values['state']) + self.message_post(body=msg) + res = super(PartnerContractCustomer, self).write(values) + return res + + def _get_name_print1ip(self): + for s in self: + s.name_dirprint1 = s.company_id.chief_id.partner_id.name if s.company_id.chief_id else False + + def _get_name_printip(self): + for s in self: + s.name_print1 = False + director = self.env['res.partner'].search([('parent_id', '=', s.partner_id.id), ('type', '=', 'director')], + limit=1) + if director: + s.name_print1 = director.name + + def print_supp(self): + # self.filtered(lambda s: s.state == 'draft').write({'state': 'sent'}) + return self.env['report'].get_action(self, 'mta_base.action_mtacontractsupp_report') + + def print_contract_cust(self): + for s in self: + if s.saleorder_id: + return s.saleorder_id.print_contract() + else: + raise exceptions.UserError( + 'Вы не можете напечатать договор с Клиентом, потому что нет связи с Заказом. Нужно зайти в Заказ и привязать этот договор.') + + def contract_action_confirm(self): + for s in self: + if s.state == 'draft': + s.state = 'progress' + elif s.state == 'progress': + s.state = 'signed' + + def contract_in_draft(self): + for s in self: + s.state = 'draft' + + @api.onchange('name') + def set_comp_and_partn(self): + for s in self: + context = s._context + order_id = context.get('sale_order_id') + if order_id: + sale_order = self.env['sale.order'].browse(order_id) + + s.company_id = sale_order.company_id + s.partner_id = sale_order.partner_id + + @api.onchange('profile_id') + def set_payment(self): + for s in self: + if s.profile_id.payment_term_id: + s.payment_term_id = s.profile_id.payment_term_id + + # @api.constrains('name') + def check_name(self): + obj = self.search([('name', '=', self.name), ('id', '!=', self.id), ('state', '!=', 'closed')]) + if obj: + raise exceptions.ValidationError('Договор с таким номером уже существует') + + """ + @api.constrains('profile_id') + def check_profile_id(self): + contracts = self.search([('partner_id', '=', self.partner_id.id), ('id', '!=', self.id)]) + if contracts: + profiles_in_contracts = contracts.profile_id + # raise exceptions.ValidationError(profiles_in_contracts.ids) + if profiles_in_contracts: + ads = self.env['contract.allowed.profiles'].search( + [('allowed_profiles', 'in', profiles_in_contracts.ids)]) + if ads: + raise exceptions.ValidationError((self.profile_id.name, ads.name)) + # raise exceptions.ValidationError(contracts) + """ + + + def action_report_contract_with_format(self, report_format): + if report_format == 'docx': + file_data, filename = self._generate_contract_docx() + mimetype = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' + elif report_format == 'md': + file_data, filename = self._generate_contract_md() + mimetype = 'application/md' + else: + raise UserError("Неверный формат отчёта.") + + attachment = self.env['ir.attachment'].create({ + 'name': filename, + 'datas': base64.b64encode(file_data), + 'res_model': self._name, + 'res_id': self.id, + 'mimetype': mimetype or 'application/octet-stream', + }) + + return { + 'type': 'ir.actions.act_url', + 'url': '/web/content/%s?download=true' % attachment.id, + 'target': 'new', + } + + def _strip_html_tags(self, html): + clean = re.compile('<.*?>') + return re.sub(clean, '', html) + + def _generate_contract_docx(self): + doc = Document() + style = doc.styles['Normal'] + font = style.font + font.name = 'Times New Roman' + font.size = Pt(12) + company = self.env.company + partner = self.partner_id + + table_header = doc.add_table(rows=1, cols=2) + rc_header = table_header.rows[0].cells + run_left = rc_header[0].paragraphs[0].add_run(f"{company.name or ''}") + run_left.font.bold = True + header_paragraph_right = rc_header[1].paragraphs[0] + header_paragraph_right.alignment = WD_ALIGN_PARAGRAPH.RIGHT + header_run_right = header_paragraph_right.add_run(f"Договор {self.name or ''} от {self.date_start or ''}") + header_run_right.font.bold = True + + header_paragraph_centre = doc.add_paragraph(f"Договор №{self.name or ''} от {self.date_start or ''}\n на поставку продукции") + header_paragraph_centre.alignment = WD_ALIGN_PARAGRAPH.CENTER + + table_city_date = doc.add_table(rows=1, cols=2) + row = table_city_date.rows[0].cells + run_city = row[0].paragraphs[0].add_run(company.city or '') + run_city.font.bold = True + paragraph_date = row[1].paragraphs[0] + paragraph_date.alignment = WD_ALIGN_PARAGRAPH.RIGHT + run_date = paragraph_date.add_run(self.get_date_text(self.date_start) or '') + run_date.font.bold = True + + text_contract_header = self._strip_html_tags(self.contract_header) + doc.add_paragraph(text_contract_header) + + for line in self.lines.sorted(key=lambda r: r.sequence, reverse=False): + doc.add_paragraph(line.name or '') + doc.add_paragraph(line.punct or '') + + doc.add_paragraph("Реквизиты и подписи сторон.").alignment = WD_ALIGN_PARAGRAPH.CENTER + + table = doc.add_table(rows=7, cols=6) + table.style = 'Table Grid' + table.cell(0, 0).merge(table.cell(0, 2)).text = "Поставщик:" + table.cell(0, 3).merge(table.cell(0, 5)).text = "Покупатель:" + table.cell(1, 0).merge(table.cell(1, 2)).text = company.name or '' + table.cell(1, 3).merge(table.cell(1, 5)).text = partner.name or '' + table.cell(2, 0).merge(table.cell(2, 2)).text = f"ИНН {company.inn or ''}" + table.cell(2, 3).merge(table.cell(2, 5)).text = f"ИНН {partner.inn or ''}" + table.cell(3, 0).merge(table.cell(3, 1)).text = f"ОГРН {company.partner_id.ogrn or ''}" + table.cell(3, 3).merge(table.cell(3, 5)).text = f"ОГРН {partner.ogrn or ''}" + table.cell(4, 0).merge(table.cell(4, 2)).text = f"КПП {company.kpp or ''}" + table.cell(4, 3).merge(table.cell(4, 5)).text = f"КПП {partner.kpp or ''}" + company_address = self.address(company) or '' + partner_address = self.address(partner) or '' + table.cell(5, 0).merge(table.cell(5, 2)).text = f"Юридический адрес: {company_address}" + table.cell(5, 3).merge(table.cell(5, 5)).text = f"Юридический адрес: {partner_address}" + table.cell(6, 0).merge(table.cell(6, 2)).text = "Подпись Исполнителя:" + table.cell(6, 3).merge(table.cell(6, 5)).text = "Подпись Заказчика:" + + f = BytesIO() + doc.save(f) + f.seek(0) + return f.read(), 'Договор (DOCX).docx' + + + def _generate_contract_md(self): + company = self.env.company + partner = self.partner_id + + lines = [] + + lines.append(f"| **{company.name or ''}** | **Договор {self.name or ''} от {self.date_start or ''}** |") + lines.append("| --- | --- |") + + lines.append(f"**Договор {self.name or ''} от {self.date_start or ''}**\n") + lines.append("**на поставку продукции**\n") + + lines.append("| Город | Дата |") + lines.append("| --- | --- |") + lines.append(f"| {company.city or ''} | {self.get_date_text(self.date_start)} |\n") + + text_contract_header = self._strip_html_tags(self.contract_header or "") + lines.append(text_contract_header + "\n") + + for line in self.lines.sorted(key=lambda r: r.sequence): + lines.append(f"**{line.name or ''}**") + lines.append((line.punct or '') + "\n") + + lines.append("**Реквизиты и подписи сторон.**\n") + + lines.append("| Поставщик | | Покупатель | |") + lines.append("| --- | --- | --- | --- |") + + lines.append(f"| {company.name or ''} | | {partner.name or ''} | |") + lines.append(f"| ИНН {company.inn or ''} | | ИНН {partner.inn or ''} | |") + + lines.append(f"| ОГРН {company.ogrn or ''} | | ОГРН {partner.ogrn or ''} | |") + lines.append(f"| КПП {company.kpp or ''} | | КПП {partner.kpp or ''} | |") + + company_address = self.address(company) or '' + partner_address = self.address(partner) or '' + lines.append(f"| Юридический адрес: {company_address} | | Юридический адрес: {partner_address} | |") + lines.append(f"| Подпись Исполнителя | | Подпись Заказчика | |\n") + + md_content = "\n".join(lines) + return md_content.encode('utf-8'), 'Договор (MD).md' + + def action_print_by_template(self): + return { + 'name': 'Печать по шаблону', + 'type': 'ir.actions.act_window', + 'res_model': 'report.template.wizard', + 'view_mode': 'form', + 'target': 'new', + 'context': {'default_contract_id': self.id}, + } + +class Partner(models.Model): + _inherit = 'res.partner' + + contract_count = fields.Integer(string='Договоры', compute='get_count_contract') + pol = fields.Selection(string="Пол", selection=[('m', 'Муж.'), ('j', 'Жен'), ], required=False) + type = fields.Selection(selection_add=[('director', 'Директор')]) + + def get_count_contract(self): + contract = self.env['partner.contract.customer'] + self.contract_count = contract.search_count([('partner_id', '=', self.id)]) + + def action_view_contract(self): + action = self.env.ref('contract.contract_customer_action').read()[0] + + action['domain'] = [('partner_id', '=', self.id)] + + return action + + +class ContractLine(models.Model): + _name = 'contract.line' + contract_id = fields.Many2one('partner.contract.customer', string='Order Reference', required=True, + ondelete='cascade', index=True, copy=False) + _order = "sequence desc" + # name = fields.Text(string='Название для договора') + # price_unit = fields.Float('Цена', default=0.0) + # product_uom = fields.Many2one('uom.uom', string='Единица измерения') + # product_id = fields.Many2one('product.product', string='Услуга', domain=[('sale_ok', '=', True)], change_default=True, ondelete='restrict') + sequence = fields.Integer('Порядок') + name = fields.Char('Номер пункта') + punct = fields.Html('Текст пункта') + + @api.onchange('product_id') + def set_name(self): + for s in self: + s.name = s.product_id.name + + +class AllowedProfiles(models.Model): + _name = 'contract.allowed.profiles' + name = fields.Char(string='Одновременно включены следующие виды договоров:') + allowed_profiles = fields.Many2many('contract.profile', string='Виды договоров', required=True) + + @api.onchange('allowed_profiles') + def set_name(self): + for s in self: + s.name = '' + for profile in s.allowed_profiles: + s.name += profile.name + ' + ' + if s.name: + if s.name[-2] == '+': + s.name = s.name[:-2] + + +class ContractProfile(models.Model): + _name = 'contract.profile' + name = fields.Char(string='Вид договора', required=True) + payable_account_id = fields.Many2one('account.account', string='Счет кредиторской задолженности', required=True) + receivable_account_id = fields.Many2one('account.account', string='Счет дебиторской задолженности', required=True) + max_receivable_id = fields.Float(string='Максимальная деб. задолженность', required=True) + payment_term_id = fields.Many2one('account.payment.term', string='Условие оплаты', required=True) + journal_id = fields.Many2one('account.journal', string='Журнал', required=True) + + +class ContractDay(models.Model): + _name = 'contract.day' + name = fields.Char('День') diff --git a/l10n_ru_contract/models/contract_customer_report_templates.py b/l10n_ru_contract/models/contract_customer_report_templates.py new file mode 100644 index 00000000..becb2f4e --- /dev/null +++ b/l10n_ru_contract/models/contract_customer_report_templates.py @@ -0,0 +1,20 @@ +from odoo import models, fields, api +import os + +class ReportTemplate(models.Model): + _name = 'contract.report.template' + _description = 'Шаблоны отчетов' + + name = fields.Char(string='Название', required=True) + attachment = fields.Binary(string='Файл шаблона', required=True) + attachment_filename = fields.Char(string='Имя файла') + typeformat = fields.Char(string='Формат', compute='_compute_format', store=True) + create_date = fields.Datetime(string='Дата создания', default=fields.Datetime.now) + + @api.depends('attachment_filename') + def _compute_typeformat(self): + for rec in self: + if rec.attachment_filename: + rec.typeformat = os.path.splitext(rec.attachment_filename)[1].lstrip('.').lower() + else: + rec.typeformat = False \ No newline at end of file diff --git a/l10n_ru_contract/models/contract_day.py b/l10n_ru_contract/models/contract_day.py new file mode 100644 index 00000000..8ffd8efe --- /dev/null +++ b/l10n_ru_contract/models/contract_day.py @@ -0,0 +1,5 @@ +from odoo import api, fields, models, exceptions, _ + +class ContractDay(models.Model): + _name = 'contract.day' + name = fields.Char(_('День')) diff --git a/l10n_ru_contract/models/contract_line.py b/l10n_ru_contract/models/contract_line.py new file mode 100644 index 00000000..eacdb7fa --- /dev/null +++ b/l10n_ru_contract/models/contract_line.py @@ -0,0 +1,12 @@ +from odoo import api, fields, models, exceptions, tools, _ + +class ContractLine(models.Model): + _name = 'contract.line' + _order = "sequence desc" + + + contract_id = fields.Many2one('partner.contract.customer', string='Order Reference', required=True, + ondelete='cascade', index=True, copy=False) + sequence = fields.Integer('Порядок') + name = fields.Char('Номер пункта') + punct = fields.Html('Текст пункта') diff --git a/l10n_ru_contract/models/contract_profile.py b/l10n_ru_contract/models/contract_profile.py new file mode 100644 index 00000000..795d25f0 --- /dev/null +++ b/l10n_ru_contract/models/contract_profile.py @@ -0,0 +1,6 @@ +from odoo import api, fields, models, exceptions, _ + +class ContractProfile(models.Model): + _name = 'contract.profile' + + name = fields.Char(string=_('Вид договора'), required=True) diff --git a/l10n_ru_contract/models/crutch_fields_header.py b/l10n_ru_contract/models/crutch_fields_header.py new file mode 100644 index 00000000..f290eff2 --- /dev/null +++ b/l10n_ru_contract/models/crutch_fields_header.py @@ -0,0 +1,33 @@ +ENTITY_CONTRACT_HEADER = """ +{{object.company_id.partner_id.name}}, +именуемое в дальнейшем «Поставщик», в лице +{{(object.company_id.chief_id.partner_id.function or '').lower()}} +{{(object.name_dirprint1 or '').title()}}, + действующего на основании ОГРНИП № {{object.company_id.company_registry or ''}}, с одной стороны, и {{object.partner_id.name or ''}}, +именуемое в дальнейшем «Покупатель», в лице +{{(object.get_function_partner1(object.partner_id.id) or '').lower()}} +{{(object.name_print1 or '').title()}}, действующего на основании устава общества, с другой стороны, вместе именуемые в дальнейшем «Стороны» заключили +настоящий Договор о нижеследующем: + """ +IP_CONTACT_HEADER = """ +{{object.company_id.partner_id.name}}, +именуемое в дальнейшем «Поставщик», в лице +{{(object.company_id.chief_id.partner_id.function or '').lower()}} +{{(object.name_dirprint1 or '').title()}}, + действующего на основании ОГРНИП № {{object.company_id.company_registry or ''}}, с одной стороны, и {{object.partner_id.name or ''}}, +именуемое в дальнейшем «Покупатель», в лице +{{(object.get_function_partner1(object.partner_id.id) or '').lower()}} +{{(object.name_print1 or '').title()}}, действующего на основании ОГРНИП №{{object.partner_id.ogrn or ''}}, + с другой стороны, вместе именуемые в дальнейшем «Стороны» заключили +настоящий Договор о нижеследующем: +""" + +INDIVIDUAL_CONTRACT_HEADER = """ +{{object.company_id.partner_id.name}}, +именуемое в дальнейшем «Поставщик», в лице +{{(object.company_id.chief_id.partner_id.function or '').lower()}} +{{(object.name_dirprint1 or '').title()}}, + действующего на основании ОГРНИП № {{object.company_id.company_registry or ''}}, с одной стороны, и {{object.partner_id.name or ''}}, +именуемое в дальнейшем «Покупатель», вместе именуемые в дальнейшем «Стороны» заключили +настоящий Договор о нижеследующем: + """ diff --git a/l10n_ru_contract/models/dop_field.py b/l10n_ru_contract/models/dop_field.py new file mode 100644 index 00000000..cd4cd596 --- /dev/null +++ b/l10n_ru_contract/models/dop_field.py @@ -0,0 +1,313 @@ +from odoo import models +from datetime import datetime +import re +import pymorphy2 +from odoo.tools import pycompat + +FRACTIONS = ( + (u"десятая", u"десятых", u"десятых"), + (u"сотая", u"сотых", u"сотых"), + (u"тысячная", u"тысячных", u"тысячных"), + (u"десятитысячная", u"десятитысячных", u"десятитысячных"), + (u"стотысячная", u"стотысячных", u"стотысячных"), + (u"миллионная", u"милллионных", u"милллионных"), + (u"десятимиллионная", u"десятимилллионных", u"десятимиллионных"), + (u"стомиллионная", u"стомилллионных", u"стомиллионных"), + (u"миллиардная", u"миллиардных", u"миллиардных"), +) + +ONES = { + 0: (u"", u"", u""), + 1: (u"один", u"одна", u"одно"), + 2: (u"два", u"две", u"два"), + 3: (u"три", u"три", u"три"), + 4: (u"четыре", u"четыре", u"четыре"), + 5: (u"пять", u"пять", u"пять"), + 6: (u"шесть", u"шесть", u"шесть"), + 7: (u"семь", u"семь", u"семь"), + 8: (u"восемь", u"восемь", u"восемь"), + 9: (u"девять", u"девять", u"девять"), +} + +TENS = { + 0: u"", + 10: u"десять", + 11: u"одиннадцать", + 12: u"двенадцать", + 13: u"тринадцать", + 14: u"четырнадцать", + 15: u"пятнадцать", + 16: u"шестнадцать", + 17: u"семнадцать", + 18: u"восемнадцать", + 19: u"девятнадцать", + 2: u"двадцать", + 3: u"тридцать", + 4: u"сорок", + 5: u"пятьдесят", + 6: u"шестьдесят", + 7: u"семьдесят", + 8: u"восемьдесят", + 9: u"девяносто", +} + +HUNDREDS = { + 0: u"", + 1: u"сто", + 2: u"двести", + 3: u"триста", + 4: u"четыреста", + 5: u"пятьсот", + 6: u"шестьсот", + 7: u"семьсот", + 8: u"восемьсот", + 9: u"девятьсот", +} + +MALE = 1 +FEMALE = 2 + +import sys +import types + +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + +class Report_contract_customer(models.Model): + _inherit = 'partner.contract.customer' + + def img(self, img, type='png', width=0, height=0): + if width: + width = "width='%spx'" % (width) + else: + width = " " + if height: + height = "height='%spx'" % (height) + else: + height = " " + toreturn = "" % ( + width, + height, + type, + str(pycompat.to_text(img))) + return toreturn + + def numer(self, name): + if name: + numeration = re.findall('\d+$', name) + if numeration: return numeration[0] + return '' + + def ru_date(self, date): + if date and date != 'False': + return dt.ru_strftime(u'"%d" %B %Y года', date=datetime.strptime(str(date), "%Y-%m-%d"), inflected=True) + return '' + + def ru_date2(self, date): + if date and date != 'False': + return dt.ru_strftime(u'%d %B %Y г.', date=datetime.strptime(str(date), "%Y-%m-%d %H:%M:%S"), + inflected=True) + return '' + + def in_words(self, number): + return numeral.in_words(number) + + def rubles(self, sum): + "Transform sum number in rubles to text" + text_rubles = self.numeral_rubles(int(sum)) + copeck = round((sum - int(sum)) * 100) + text_copeck = self.numeral_choose_plural(int(copeck), (u"копейка", u"копейки", u"копеек")) + return ("%s %02d %s") % (text_rubles, copeck, text_copeck) + + def numeral_rubles(self, amount, zero_for_kopeck=False): + self.check_positive(amount) + pts = [] + amount = round(amount, 2) + pts.append(self.sum_string(int(amount), 1, (u"рубль", u"рубля", u"рублей"))) + remainder = self._get_float_remainder(amount, 2) + iremainder = int(remainder) + + if iremainder != 0 or zero_for_kopeck: + if iremainder < 10 and len(remainder) == 1: + iremainder *= 10 + pts.append(self.sum_string(iremainder, 2, + (u"копейка", u"копейки", u"копеек"))) + return u" ".join(pts) + + def _get_float_remainder(self, fvalue, signs=9): + self.check_positive(fvalue) + if isinstance(fvalue, integer_types): + return "0" + if isinstance(fvalue, Decimal) and fvalue.as_tuple()[2] == 0: + return "0" + + def sum_string(self, amount, gender, items=None): + if isinstance(items, text_type): + items = split_values(items) + if items is None: + items = (u"", u"", u"") + try: + one_item, two_items, five_items = items + except ValueError: + raise ValueError("Items must be 3-element sequence") + self.check_positive(amount) + if amount == 0: + return u"ноль %s" % five_items + into = u'' + tmp_val = amount + into, tmp_val = self._sum_string_fn(into, tmp_val, gender, items) + into, tmp_val = self._sum_string_fn(into, tmp_val, FEMALE, + (u"тысяча", u"тысячи", u"тысяч")) + into, tmp_val = self._sum_string_fn(into, tmp_val, MALE, + (u"миллион", u"миллиона", u"миллионов")) + into, tmp_val = self._sum_string_fn(into, tmp_val, MALE, + (u"миллиард", u"миллиарда", u"миллиардов")) + if tmp_val == 0: + return into + else: + raise ValueError("Cannot operand with numbers bigger than 10**11") + + def _sum_string_fn(self, into, tmp_val, gender, items=None): + if items is None: + items = (u"", u"", u"") + one_item, two_items, five_items = items + self.check_positive(tmp_val) + if tmp_val == 0: + return into, tmp_val + words = [] + rest = tmp_val % 1000 + tmp_val = tmp_val // 1000 + if rest == 0: + if into == u"": + into = u"%s " % five_items + return into, tmp_val + end_word = five_items + words.append(HUNDREDS[rest // 100]) + rest = rest % 100 + rest1 = rest // 10 + tens = rest1 == 1 and TENS[rest] or TENS[rest1] + words.append(tens) + if rest1 < 1 or rest1 > 1: + amount = rest % 10 + end_word = self.numeral_choose_plural(amount, items) + words.append(ONES[amount][gender - 1]) + words.append(end_word) + words.append(into) + words = filter(lambda x: len(x) > 0, words) + return u" ".join(words).strip(), tmp_val + + def check_positive(self, value, strict=False): + if not strict and value < 0: + raise ValueError("Value must be positive or zero, not %s" % str(value)) + if strict and value <= 0: + raise ValueError("Value must be positive, not %s" % str(value)) + + def numeral_choose_plural(self, amount, variants): + if isinstance(variants, text_type): + variants = split_values(variants) + self.check_length(variants, 3) + amount = abs(amount) + if amount % 10 == 1 and amount % 100 != 11: + variant = 0 + elif amount % 10 >= 2 and amount % 10 <= 4 and \ + (amount % 100 < 10 or amount % 100 >= 20): + variant = 1 + else: + variant = 2 + return variants[variant] + + def check_length(self, value, length): + _length = len(value) + if _length != length: + raise ValueError("length must be %d, not %d" % \ + (length, _length)) + + def initials(self, fio): + if fio: + return (fio.split()[0] + ' ' + ''.join([fio[0:1] + '.' for fio in fio.split()[1:]])).strip() + return '' + + def address(self, partner): + repr = [] + if partner.zip: repr.append(partner.zip) + if partner.city: repr.append(partner.city) + if partner.street: repr.append(partner.street) + if partner.street2: repr.append(partner.street2) + return ', '.join(repr) + + def address_delivery(self, partner): + if partner: + addr = self.env['res.partner'].search([('parent_id', '=', partner), ('type', '=', 'delivery')], limit=1) + repr = [] + if addr: + if addr.zip: repr.append(addr.zip) + if addr.city: repr.append(addr.city) + if addr.street: repr.append(addr.street) + if addr.street2: repr.append(addr.street2) + return ', '.join(repr) + + def get_function_print(self, function): + morph = pymorphy2.MorphAnalyzer() + if function: + f = morph.parse(function)[0] + f = f.inflect({'gent'}).word + return f.title() + + def get_function_partnerip(self, partner): + director = self.env['res.partner'].search([('parent_id', '=', partner), ('type', '=', 'director')], limit=1) + if director: + if director.function: + return director.function + + def get_function_partner(self, partner): + res = [] + morph = pymorphy2.MorphAnalyzer() + if partner: + director = self.env['res.partner'].search([('parent_id', '=', partner), ('type', '=', 'director')], limit=1) + if director: + if director.function: + list_f = str(director.function).split(' ') + for func in list_f: + f = morph.parse(func)[0] + f = f.inflect({'gent'}).word + res.append(f) + return ' '.join(res) + + + + def get_date_text(self, date): + month_list = ['января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', + 'ноября', 'декабря'] + if date: + date_list = str(date).split('-') + if date_list[0] and date_list[1] and date_list[2]: + return ('"' + date_list[2] + '" ' + month_list[int(date_list[1]) - 1] + ' ' + date_list[0] + ' г.') + + def get_bank(self, partner): + repr = [] + bank = None + if partner.bank_ids: + bank = partner.bank_ids[0] + elif partner.parent_id.bank_ids: + bank = partner.parent_id.bank_ids[0] + if bank and bank.bank_name: repr.append(bank.bank_name) + if bank and bank.acc_number: repr.append(u"Р/счет " + bank.acc_number) + if bank and bank.bank_bic: repr.append(u"БИК " + bank.bank_bic) + if bank and bank.bank_corr_acc: repr.append(u"к/с " + bank.bank_corr_acc) + return '
'.join(repr) diff --git a/l10n_ru_contract/models/invoice_saleorder.py b/l10n_ru_contract/models/invoice_saleorder.py new file mode 100644 index 00000000..29309b9f --- /dev/null +++ b/l10n_ru_contract/models/invoice_saleorder.py @@ -0,0 +1,130 @@ +from odoo import api, fields, models, exceptions +from datetime import datetime + + +class contract_sale_order(models.Model): + _inherit = 'sale.order' + mt_contractid = fields.Many2one('partner.contract.customer', string='Номер договора') + sec_partner_id = fields.Many2one('res.partner', string='Контрагент', store=True, compute='get_pid') + stamp = fields.Boolean(string='Печать и подпись', related='mt_contractid.stamp') + + @api.depends('partner_id') + def get_pid(self): + for s in self: + s.sec_partner_id = s.partner_id.parent_id if s.partner_id.parent_id else s.partner_id + + @api.onchange('mt_contractid') + def set_ons(self): + for s in self: + if s.mt_contractid: + s.payment_term_id = s.mt_contractid.payment_term_id + + @api.constrains('state') + def late_payment_check(self): + for s in self: + if s.mt_contractid: + if s.state == 'sale': + late_invoices_count = 0 + max_receivable = s.mt_contractid.profile_id.max_receivable_id # макс. деб. задолженность в договоре + # ищу просроченные инвойсы контрагента указанного в заказе со стейтом "Подтверждено" + invoices_obj = self.env['account.move'].search([('partner_id', '=', s.partner_id.id), + ('state', '=', 'posted'), + ('payment_state', 'not in', ['paid','reversed']), + ('move_type','in',['out_invoice']), + ('invoice_date_due', '<', datetime.now().date())]) + + for invoice in invoices_obj: + late_invoices_count += invoice.amount_residual # складываю деб. задолженность по просроченным инвойсам + + if late_invoices_count > max_receivable: + raise exceptions.ValidationError( + f'Нельзя подтвердить заказ, так как у контрагента {s.sec_partner_id.name} нарушено ' + f'условие по дебиторской задолженности.\n\n' + f'Контрагент {s.sec_partner_id.name} должен {late_invoices_count}руб.\n' + f'Максимальная дебиторская задолженность указанная в ' + f'договоре №{s.mt_contractid.name} - {max_receivable}руб.\n\n' + f'Проверьте следующие неоплаченные счета контрагента:\n' + f'{", ".join([invoice.name for invoice in invoices_obj])}') + + # def _get_invoice_grouping_keys(self): + # res = super(contract_sale_order, self)._get_invoice_grouping_keys() + # res.append('mt_contractid') + # return res + + def _prepare_invoice(self): + invoice_vals = super(contract_sale_order, self)._prepare_invoice() + for s in self: + if s.mt_contractid: + invoice_vals['mt_contractid'] = s.mt_contractid.id + invoice_vals['osnovanie'] = 'Договор № ' + s.mt_contractid.name + ' от ' + fields.Datetime.from_string( + s.mt_contractid.date_start).strftime("%d.%m.%Y") + return invoice_vals + + +class ContractCreateInvoice(models.TransientModel): + _inherit = 'sale.advance.payment.inv' + + def _prepare_invoice_values(self, order, so_lines): + invoice_vals = super(ContractCreateInvoice, self)._prepare_invoice_values(order, so_lines) + if order.mt_contractid: + invoice_vals['mt_contractid'] = order.mt_contractid.id + invoice_vals['osnovanie'] = 'Договор № ' + order.mt_contractid.name + ' от ' + fields.Datetime.from_string(order.mt_contractid.date_start).strftime("%d.%m.%Y") + return invoice_vals + +class contract_invoice(models.Model): + _inherit = 'account.move' + mt_contractid = fields.Many2one('partner.contract.customer', string='Номер договора') + sf_number = fields.Char(string='Номер с/ф') + osnovanie = fields.Char(string='Основание') + sec_partner_id = fields.Many2one('res.partner', string='Контрагент', store=True, compute='get_pid') + stamp = fields.Boolean(string='Печать и подпись', related='mt_contractid.stamp') + + @api.depends('partner_id') + def get_pid(self): + for s in self: + s.sec_partner_id = s.partner_id.parent_id if s.partner_id.parent_id else s.partner_id + + @api.onchange('mt_contractid') + def set_ons(self): + if self.mt_contractid: + self.osnovanie = 'Договор № ' + self.mt_contractid.name + ' от ' + fields.Datetime.from_string( + self.mt_contractid.date_start).strftime("%d.%m.%Y") + + @api.constrains('state') + def invoice_fields_check(self): + for s in self: + if s.state == 'posted': + if s.mt_contractid: + errors_list = [] + journal_in_contract = s.mt_contractid.profile_id.journal_id + payment_term_in_contract = s.mt_contractid.profile_id.payment_term_id + receivable_in_contract = s.mt_contractid.profile_id.receivable_account_id + + if journal_in_contract != s.journal_id: + errors_list.append(f'Отличается Журнал - [{s.journal_id.name}] ' + f'и указанный в договоре №{s.mt_contractid.name} ' + f'Журнал - [{journal_in_contract.name}]\n\n') + + if payment_term_in_contract != s.invoice_payment_term_id: + errors_list.append(f'Отличается поле "Условие оплаты" в инвойсе ' + f'[Условие оплаты - {s.invoice_payment_term_id.name}] ' + f'и указанный в договоре №{s.mt_contractid.name} ' + f'[Условие оплаты - {payment_term_in_contract.name}]\n\n') + + if receivable_in_contract not in s.line_ids.account_id: + errors_list.append(f'Отличается поле "Счет дебиторской задолженности" в инвойсе ' + f'и указанный в договоре №{s.mt_contractid.name}') + + if errors_list: + raise exceptions.ValidationError(''.join(errors_list)) + + +class contact_purchase_order(models.Model): + _inherit = 'purchase.order' + mt_contractid = fields.Many2one('partner.contract.customer', string='Номер договора') + sec_partner_id = fields.Many2one('res.partner', string='Контрагент', store=True, compute='get_pid') + + @api.depends('partner_id') + def get_pid(self): + for s in self: + s.sec_partner_id = s.partner_id.parent_id if s.partner_id.parent_id else s.partner_id diff --git a/l10n_ru_contract/models/partner_contract_customer.py b/l10n_ru_contract/models/partner_contract_customer.py new file mode 100644 index 00000000..827fde38 --- /dev/null +++ b/l10n_ru_contract/models/partner_contract_customer.py @@ -0,0 +1,231 @@ +from odoo import api, fields, models, tools, _ + +import logging +_logger = logging.getLogger(__name__) + +class PartnerContractCustomer(models.Model): + _name = 'partner.contract.customer' + _inherit = ['mail.thread', 'mail.activity.mixin', 'mail.render.mixin'] + + name = fields.Char(string=_('Номер')) + date_start = fields.Date(string=_('Дата договора'), required=True, default=fields.Datetime.now()) + date_end = fields.Date(string=_('Дата окончания'), required=True) + type = fields.Selection( + [('customer', 'С покупателем'), + ('supplier', 'С поставщиком'), + ('other', 'Прочие расчеты'), + + ], + string=_('Тип договора'), default='customer', required=True) + profile_id = fields.Many2one('contract.profile', string=_('Вид договора'), required=True) + partner_id = fields.Many2one( + 'res.partner', + string='Контрагент', + required=True, + domain="[('id', 'in', possible_partner_ids)]", + ) + + partner_type = fields.Selection(string=_('Тип контрагента'), selection=[ + ('person', 'Физ. лицо'), + ('company_ip', 'ИП'), + ('company', 'Юр. лицо') + ], required=True) + company_id = fields.Many2one('res.company', string=_('Компания'), required=True) + state = fields.Selection( + [ + ('draft', 'Черновик'), + ('progress', 'На согласовании'), + ('signed', 'Подписан, действует'), + ('closed', 'Истёк'), + ], + string=_('Статус'), + default='draft', + group_expand=lambda self, states, domain: [ + key for key, _ in self._fields['state'].selection + ], + ) + stamp = fields.Boolean(string=_('Печать и подпись')) + signed = fields.Boolean(string=_('Договор подписан')) + lines_ids = fields.One2many('contract.line', 'contract_id', string=_('Пункты договора')) + + is_template = fields.Boolean(_('Это шаблон')) + copy_from = fields.Many2one('partner.contract.customer', string=_('Копировать из этого шаблона')) + + director_name_partner = fields.Char( + string=_('ФИО директора (от партнёра)'), + related='partner_id.parent_id.name', + readonly=True, + ) + + director_name_company = fields.Char( + string=_('ФИО руководителя (от компании)'), + related='company_id.chief_id.partner_id.name', + readonly=True, + ) + + contract_header = fields.Html( + string=_("Шапка договора"), + compute="_compute_contract_header", + ) + + contract_header_template_id = fields.Many2one( + "ir.ui.view", + string=_("Шаблон шапки договора"), + domain='[' + '("type", "=", "qweb"), ' + '"|", ' + '"&", ("model", "!=", False), ("model", "=", "partner.contract.customer"), ' + '"&", ("model", "=", False), ("key", "ilike", "l10n_ru_contract.contract_header_")' + ']', + help=_("QWeb-шаблон, по которому генерируется поле «Шапка договора»."), + ) + + use_custom_contract_header = fields.Boolean( + string=_("Использовать кастомный шаблон"), + default=False, + help=_( + "Если включено, шапка договора редактируется вручную и " + "не перегенерируется автоматически при изменении реквизитов." + ), + ) + + possible_partner_ids = fields.Many2many( + 'res.partner', + compute='_compute_possible_partners', + compute_sudo=True, + ) + + @api.depends('partner_type') + def _compute_possible_partners(self): + company_ids = self.env.companies.ids + internal_user_partners = self.env['res.users'].sudo().search([ + ('share', '=', False) + ]).mapped('partner_id.id') + + for rec in self: + if rec.partner_type in ('company', 'company_ip'): + rec.possible_partner_ids = self.env['res.partner'].search([ + ('is_company', '=', True), + ('id', 'not in', company_ids), + ]) + elif rec.partner_type == 'person': + rec.possible_partner_ids = self.env['res.partner'].search([ + ('is_company', '=', False), + ('id', 'not in', internal_user_partners), + ]) + else: + rec.possible_partner_ids = self.env['res.partner'].search([]) + + @api.onchange('partner_type') + def _onchange_partner_type(self): + if self.partner_id: + if self.partner_type in ('company', 'company_ip'): + if not self.partner_id.is_company or self.partner_id.id in self.env.companies.ids: + self.partner_id = False + elif self.partner_type == 'person': + if self.partner_id.is_company or self.partner_id.id in self.env['res.users'].sudo().search( + [('share', '=', False)]).mapped('partner_id.id'): + self.partner_id = False + + def _get_default_header_xmlid(self): + self.ensure_one() + if self.partner_type == "company_ip": + xmlid = "l10n_ru_contract.contract_header_ip" + elif self.partner_type == "person": + xmlid = "l10n_ru_contract.contract_header_individual" + else: + xmlid = "l10n_ru_contract.contract_header_entity" + + return xmlid + + def _render_header_qweb(self): + self.ensure_one() + view = self.contract_header_template_id + if not view: + xmlid = self._get_default_header_xmlid() + view = self.env.ref(xmlid, raise_if_not_found=False) + self.contract_header_template_id = view + try: + html = self.env["ir.qweb"]._render(view.key, {"object": self}) + except Exception as e: + return "" + return tools.html_sanitize(html or "") + + @api.depends( + "partner_type", + "partner_id", + "company_id", + "contract_header_template_id", + "use_custom_contract_header", + ) + def _compute_contract_header(self): + for rec in self: + rec.contract_header = rec._render_header_qweb() + + @api.onchange("partner_type") + def _onchange_partner_type_set_template(self): + for rec in self: + xmlid = rec._get_default_header_xmlid() + view = rec.env.ref(xmlid, raise_if_not_found=False) + rec.contract_header_template_id = view + + def generate_contract_header(self): + for rec in self: + rec.contract_header = rec._render_header_qweb() + + @api.onchange("use_custom_contract_header") + def _onchange_use_custom_contract_header(self): + for rec in self: + if rec.use_custom_contract_header: + if not rec.contract_header: + rec.contract_header = rec._render_header_qweb() + else: + rec.contract_header = rec._render_header_qweb() + + @api.onchange('sec_partner_id') + def set_pid(self): + for s in self: + s.partner_id = s.sec_partner_id.parent_id if s.sec_partner_id.parent_id else s.sec_partner_id + + def copy_it(self): + for s in self: + if s.copy_from: + for line in s.copy_from.lines_ids: + line.copy({'contract_id': s.id}) + + @api.model + def create(self, vals_list): + if not isinstance(vals_list, list): + vals_list = [vals_list] + + for vals in vals_list: + if not vals.get('is_template'): + if vals.get('type') == 'customer': + vals['name'] = self.env['ir.sequence'].next_by_code('partner.contract.customer.sequence') + elif vals.get('type') == 'supplier': + vals['name'] = self.env['ir.sequence'].next_by_code('partner.contract.supplier.sequence') + + records = super().create(vals_list) + return records + + def write(self, values): + + if 'state' in values: + if self.state != values['state']: + msg = 'Статус: ' + dict(self._fields['state'].selection).get(self.state) + ' -> ' + dict( + self._fields['state'].selection).get(values['state']) + self.message_post(body=msg) + return super().write(values) + + + def action_set_on_approval(self): + for rec in self: + rec.state = 'progress' + + def action_confirm(self): + for rec in self: + rec.state = 'signed' + + def action_reset_to_draft(self): + for rec in self: + rec.state = 'draft' \ No newline at end of file diff --git a/l10n_ru_contract/models/purchase_order.py b/l10n_ru_contract/models/purchase_order.py new file mode 100644 index 00000000..d4d5271e --- /dev/null +++ b/l10n_ru_contract/models/purchase_order.py @@ -0,0 +1,13 @@ +from odoo import api, fields, models, exceptions, _ + + +class PurchaseOrder(models.Model): + _inherit = 'purchase.order' + + mt_contract_id = fields.Many2one('partner.contract.customer', string=_('Номер договора')) + sec_partner_id = fields.Many2one('res.partner', string=_('Контрагент'), store=True, compute='_compute_get_pid') + + @api.depends('partner_id') + def _compute_get_pid(self): + for s in self: + s.sec_partner_id = s.partner_id.parent_id if s.partner_id.parent_id else s.partner_id diff --git a/l10n_ru_contract/models/res_company.py b/l10n_ru_contract/models/res_company.py new file mode 100644 index 00000000..4d19300e --- /dev/null +++ b/l10n_ru_contract/models/res_company.py @@ -0,0 +1,10 @@ +from odoo import api, fields, models, exceptions, _ + +class Company(models.Model): + _inherit = 'res.company' + + inn = fields.Char(related='partner_id.inn', readonly=False) + kpp = fields.Char(related='partner_id.kpp', readonly=False) + okpo = fields.Char(related='partner_id.okpo', readonly=False) + chief_id = fields.Many2one('res.users', 'Имя директора') + stamp = fields.Binary("Stamp") \ No newline at end of file diff --git a/l10n_ru_contract/models/res_partner.py b/l10n_ru_contract/models/res_partner.py new file mode 100644 index 00000000..e1568c47 --- /dev/null +++ b/l10n_ru_contract/models/res_partner.py @@ -0,0 +1,24 @@ +from odoo import api, fields, models, exceptions, _ + +class Partner(models.Model): + _inherit = 'res.partner' + + ogrn = fields.Char('ОГРН') + okpo = fields.Char('ОКПО') + inn = fields.Char('ИНН') + kpp = fields.Char('KPP') + passport = fields.Char('Паспорт') + + contract_count = fields.Integer(string=_('Договоры'), compute='get_count_contract') + pol = fields.Selection(string=_("Пол"), selection=[('m', 'Муж.'), ('j', 'Жен'), ], required=False) + type = fields.Selection(selection_add=[('director', 'Директор')]) + + def get_count_contract(self): + contract = self.env['partner.contract.customer'] + for s in self: + s.contract_count = contract.search_count([('partner_id', '=', s.id)]) + + def action_view_contract(self): + action = self.env.ref('l10n_ru_contract.contract_customer_action').read()[0] + action['domain'] = [('partner_id', '=', self.id)] + return action \ No newline at end of file diff --git a/l10n_ru_contract/models/res_partner_bank.py b/l10n_ru_contract/models/res_partner_bank.py new file mode 100644 index 00000000..3314fe6c --- /dev/null +++ b/l10n_ru_contract/models/res_partner_bank.py @@ -0,0 +1,6 @@ +from odoo import api, fields, models, exceptions, _ + + +class Partner_Bank(models.Model): + _inherit = 'res.partner.bank' + bank_corr_acc = fields.Char('Кор.счет') \ No newline at end of file diff --git a/l10n_ru_contract/models/sale_make_invoice_advance.py b/l10n_ru_contract/models/sale_make_invoice_advance.py new file mode 100644 index 00000000..e6cae6a5 --- /dev/null +++ b/l10n_ru_contract/models/sale_make_invoice_advance.py @@ -0,0 +1,14 @@ +from odoo import api, fields, models + + +class ContractCreateInvoice(models.TransientModel): + _inherit = 'sale.advance.payment.inv' + + # при выбора счета "Авансовый платеж" + @api.model + def _create_invoice(self, order, so_line, amount): + res = super(ContractCreateInvoice, self)._create_invoice(order, so_line, amount) + if order.mt_contract_id: + res.write({'mt_contract_id': order.mt_contract_id, + 'journal_id': order.mt_contract_id.profile_id.journal_id, }) + return res diff --git a/l10n_ru_contract/models/sale_order.py b/l10n_ru_contract/models/sale_order.py new file mode 100644 index 00000000..53eee3e5 --- /dev/null +++ b/l10n_ru_contract/models/sale_order.py @@ -0,0 +1,53 @@ +from odoo import api, fields, models, exceptions, _ +from datetime import datetime + + +class SaleOrder(models.Model): + _inherit = 'sale.order' + + mt_contract_id = fields.Many2one('partner.contract.customer', string=_('Номер договора')) + sec_partner_id = fields.Many2one('res.partner', string=_('Контрагент'), store=True, compute='_compute_get_pid') + stamp = fields.Boolean(string=_('Печать и подпись'), related='mt_contract_id.stamp') + + @api.depends('partner_id') + def _compute_get_pid(self): + for s in self: + s.sec_partner_id = s.partner_id.parent_id if s.partner_id.parent_id else s.partner_id + + @api.onchange('mt_contract_id') + def set_ons(self): + if self.mt_contract_id: + self.payment_term_id = self.mt_contract_id.payment_term_id + + @api.constrains('state') + def late_payment_check(self): + if self.mt_contract_id: + if self.state == 'sale': + late_invoices_count = 0 + max_receivable = self.mt_contract_id.profile_id.max_receivable_id # макс. деб. задолженность в договоре + # ищу просроченные инвойсы контрагента указанного в заказе со стейтом "Подтверждено" + invoices_obj = self.env['account.move'].search([('partner_id', '=', self.partner_id.id), + ('state', '=', 'posted'), + ('invoice_date_due', '<', datetime.now().date())]) + + for invoice in invoices_obj: + late_invoices_count += invoice.amount_residual # складываю деб. задолженность по просроченным инвойсам + + if late_invoices_count > max_receivable: + raise exceptions.ValidationError( + f'Нельзя подтвердить заказ, так как у контрагента {self.sec_partner_id.name} нарушено ' + f'условие по дебиторской задолженности.\n\n' + f'Контрагент {self.sec_partner_id.name} должен {late_invoices_count}руб.\n' + f'Максимальная дебиторская задолженность указанная в ' + f'договоре №{self.mt_contract_id.name} - {max_receivable}руб.\n\n' + f'Проверьте следующие неоплаченные счета контрагента:\n' + f'{", ".join([invoice.name for invoice in invoices_obj])}') + + # при выбора счета "Обычный счет" + @api.model + def _create_invoices(self, grouped=False, final=False, date=None): + res = super(SaleOrder, self)._create_invoices(grouped, final, date) + if self.mt_contract_id: + res.write({'mt_contract_id': self.mt_contract_id, + 'journal_id': self.mt_contract_id.profile_id.journal_id}) + return res \ No newline at end of file diff --git a/l10n_ru_contract/report/__init__.py b/l10n_ru_contract/report/__init__.py new file mode 100644 index 00000000..ba5ca7c2 --- /dev/null +++ b/l10n_ru_contract/report/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import report_contract diff --git a/l10n_ru_contract/report/report_contract.py b/l10n_ru_contract/report/report_contract.py new file mode 100644 index 00000000..3baf4141 --- /dev/null +++ b/l10n_ru_contract/report/report_contract.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +from odoo import api, models + +class ContractCustomerReport(models.AbstractModel): + _name = 'contract.customer.report' + + + def get_report_values(self, docids, data=None): + docs = self.env['partner.contract.customer'].browse(docids) + return { + 'doc_ids': docs.ids, + 'doc_model': 'partner.contract.customer', + 'docs': docs, + } diff --git a/l10n_ru_contract/report/report_contract.xml b/l10n_ru_contract/report/report_contract.xml new file mode 100644 index 00000000..faf060f3 --- /dev/null +++ b/l10n_ru_contract/report/report_contract.xml @@ -0,0 +1,398 @@ + + + + A4 + + A4 + 0 + 0 + Portrait + 15 + 30 + 7 + 7 + + 10 + 90 + + + + Договор + partner.contract.customer + qweb-pdf + l10n_ru_contract.report_contract_customer + l10n_ru_contract.report_contract_customer + 'Договор - %s' % (object.name) + + + report + + + + diff --git a/l10n_ru_contract/report/report_contract_docx.xml b/l10n_ru_contract/report/report_contract_docx.xml new file mode 100644 index 00000000..e8459b9d --- /dev/null +++ b/l10n_ru_contract/report/report_contract_docx.xml @@ -0,0 +1,24 @@ + + + + Договор DOCX + + + code + + action = records.action_report_contract_with_format('docx') + + action + + + + Договор MD + + + code + + action = records.action_report_contract_with_format('md') + + action + + \ No newline at end of file diff --git a/l10n_ru_contract/report/report_contract_invoice.py b/l10n_ru_contract/report/report_contract_invoice.py new file mode 100644 index 00000000..ccb72fca --- /dev/null +++ b/l10n_ru_contract/report/report_contract_invoice.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +from odoo import api, models + + +class ContractCustomerReportInvoice(models.AbstractModel): + _name = 'contract.customer.report_invoice' + + + def get_report_values(self, docids, data=None): + docs = self.env['account.move'].browse(docids) + return { + 'doc_ids': docs.ids, + 'doc_model': 'account.move', + 'docs': docs, + } diff --git a/l10n_ru_contract/report/report_contract_invoice.xml b/l10n_ru_contract/report/report_contract_invoice.xml new file mode 100644 index 00000000..07d15c4e --- /dev/null +++ b/l10n_ru_contract/report/report_contract_invoice.xml @@ -0,0 +1,592 @@ + + + + + + A4 + + A4 + 0 + 0 + Portrait + 15 + 30 + 7 + 7 + + 10 + 90 + + + + Договор со спецификацией + account.move + qweb-pdf + l10n_ru_contract.report_contract_customer_invoice + l10n_ru_contract.report_contract_customer_invoice + 'Договор со спецификацией - %s' % (object.name) + + + report + + diff --git a/l10n_ru_contract/report/report_contract_order.py b/l10n_ru_contract/report/report_contract_order.py new file mode 100644 index 00000000..42a679de --- /dev/null +++ b/l10n_ru_contract/report/report_contract_order.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +from odoo import api, models + + +class ContractCustomerReportOrder(models.AbstractModel): + _name = 'contract.customer.report_order' + + + def get_report_values(self, docids, data=None): + docs = self.env['sale.order'].browse(docids) + return { + 'doc_ids': docs.ids, + 'doc_model': 'sale.order', + 'docs': docs, + } + + + diff --git a/l10n_ru_contract/report/report_contract_order.xml b/l10n_ru_contract/report/report_contract_order.xml new file mode 100644 index 00000000..8d288196 --- /dev/null +++ b/l10n_ru_contract/report/report_contract_order.xml @@ -0,0 +1,594 @@ + + + + + + A4 + + A4 + 0 + 0 + Portrait + 15 + 30 + 7 + 7 + + 10 + 90 + + + + Договор со спецификацией + sale.order + qweb-pdf + l10n_ru_contract.report_contract_customer_order + l10n_ru_contract.report_contract_customer_order + 'Договор со спецификацией - %s' % (object.name) + + + report + + diff --git a/l10n_ru_contract/report/report_contract_order1.xml b/l10n_ru_contract/report/report_contract_order1.xml new file mode 100644 index 00000000..0c79c37d --- /dev/null +++ b/l10n_ru_contract/report/report_contract_order1.xml @@ -0,0 +1,406 @@ + + + + + + A4 + + A4 + 0 + 0 + Portrait + 15 + 30 + 7 + 7 + + 10 + 90 + + + + Спецификация + sale.order + qweb-pdf + l10n_ru_contract.report_contract_customer_order1 + l10n_ru_contract.report_contract_customer_order1 + 'Спецификация - %s' % (object.name) + + + report + + diff --git a/l10n_ru_contract/report/report_contract_simple.xml b/l10n_ru_contract/report/report_contract_simple.xml new file mode 100644 index 00000000..aa5a4fe7 --- /dev/null +++ b/l10n_ru_contract/report/report_contract_simple.xml @@ -0,0 +1,343 @@ + + + + Договор (WeasyPrint) + partner.contract.customer + qweb-pdf + l10n_ru_contract.report_contract_customer_modern + l10n_ru_contract.report_contract_customer_modern + 'Договор - %s' % (object.name or '') + + True + + + + + diff --git a/l10n_ru_contract/security/ir.model.access.csv b/l10n_ru_contract/security/ir.model.access.csv new file mode 100644 index 00000000..079900a9 --- /dev/null +++ b/l10n_ru_contract/security/ir.model.access.csv @@ -0,0 +1,6 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_partner_contract_customer,access_partner_contract_customer,model_partner_contract_customer,,1,1,1,1 +access_contract_day,access_contract_day,model_contract_day,,1,1,1,1 +access_contract_allowed_profiles,access_contract_allowed_profiles,model_contract_allowed_profiles,,1,1,1,1 +access_partner_contract_customerline,access_partner_contract_customerline,model_contract_line,,1,1,1,1 +access_contract_profile,access_contract_profile,model_contract_profile,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/l10n_ru_contract/tests/__init__.py b/l10n_ru_contract/tests/__init__.py new file mode 100644 index 00000000..3c02082d --- /dev/null +++ b/l10n_ru_contract/tests/__init__.py @@ -0,0 +1 @@ +from . import test_contract diff --git a/l10n_ru_contract/tests/test_contract.py b/l10n_ru_contract/tests/test_contract.py new file mode 100644 index 00000000..a7416f58 --- /dev/null +++ b/l10n_ru_contract/tests/test_contract.py @@ -0,0 +1,215 @@ +""" +Tests for Contract_Model (l10n_ru_contract). + +Validates: Requirements 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 4.10 +""" +from odoo.tests.common import TransactionCase + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + +def _get_or_create_profile(env): + """Return an existing contract.profile or create a minimal one.""" + profile = env['contract.profile'].search([], limit=1) + if not profile: + profile = env['contract.profile'].create({'name': 'Test Profile'}) + return profile + + +def _get_or_create_partner(env): + """Return an existing external partner or create one.""" + partner = env['res.partner'].search( + [('is_company', '=', True), ('id', 'not in', env.companies.ids)], limit=1 + ) + if not partner: + partner = env['res.partner'].create({'name': 'Test Partner', 'is_company': True}) + return partner + + +def _make_contract(env, **kwargs): + """Create a minimal PartnerContractCustomer record.""" + profile = _get_or_create_profile(env) + partner = _get_or_create_partner(env) + vals = { + 'date_start': '2024-01-01', + 'date_end': '2024-12-31', + 'type': 'customer', + 'profile_id': profile.id, + 'partner_id': partner.id, + 'partner_type': 'company', + 'company_id': env.company.id, + } + vals.update(kwargs) + return env['partner.contract.customer'].create(vals) + + +# --------------------------------------------------------------------------- +# TestContractCreate +# --------------------------------------------------------------------------- + +class TestContractCreate(TransactionCase): + """Validates: Requirement 4.1 — unique contract number assigned via sequence on create.""" + + def test_create_assigns_unique_name_via_sequence(self): + """Req 4.1 — creating a customer contract assigns a non-empty unique name.""" + contract1 = _make_contract(self.env) + contract2 = _make_contract(self.env) + + self.assertTrue(contract1.name, "Contract 1 should have a name assigned") + self.assertTrue(contract2.name, "Contract 2 should have a name assigned") + self.assertNotEqual( + contract1.name, contract2.name, + "Each contract should receive a unique number from the sequence" + ) + + def test_create_supplier_contract_assigns_name(self): + """Req 4.1 — creating a supplier contract also assigns a name via sequence.""" + contract = _make_contract(self.env, type='supplier') + self.assertTrue(contract.name, "Supplier contract should have a name assigned") + + +# --------------------------------------------------------------------------- +# TestContractStates +# --------------------------------------------------------------------------- + +class TestContractStates(TransactionCase): + """Validates: Requirements 4.2, 4.3 — state transitions.""" + + def setUp(self): + super().setUp() + self.contract = _make_contract(self.env) + + def test_contract_action_confirm_draft_to_progress(self): + """Req 4.2 — contract_action_confirm moves draft → progress.""" + self.assertEqual(self.contract.state, 'draft') + self.contract.contract_action_confirm() + self.assertEqual( + self.contract.state, 'progress', + "contract_action_confirm should move draft contract to progress" + ) + + def test_contract_action_confirm_progress_to_signed(self): + """Req 4.2 — second call to contract_action_confirm moves progress → signed.""" + self.contract.contract_action_confirm() # draft → progress + self.contract.contract_action_confirm() # progress → signed + self.assertEqual( + self.contract.state, 'signed', + "Second contract_action_confirm should move progress contract to signed" + ) + + def test_contract_in_draft_returns_to_draft(self): + """Req 4.3 — contract_in_draft moves any state back to draft.""" + self.contract.contract_action_confirm() # draft → progress + self.assertEqual(self.contract.state, 'progress') + + self.contract.contract_in_draft() + self.assertEqual( + self.contract.state, 'draft', + "contract_in_draft should return contract to draft state" + ) + + def test_contract_in_draft_from_signed(self): + """Req 4.3 — contract_in_draft from signed state returns to draft.""" + self.contract.contract_action_confirm() # draft → progress + self.contract.contract_action_confirm() # progress → signed + self.assertEqual(self.contract.state, 'signed') + + self.contract.contract_in_draft() + self.assertEqual( + self.contract.state, 'draft', + "contract_in_draft should return signed contract to draft" + ) + + +# --------------------------------------------------------------------------- +# TestContractHelpers +# --------------------------------------------------------------------------- + +class TestContractHelpers(TransactionCase): + """Validates: Requirements 4.4–4.10 — helper methods on the contract model.""" + + def setUp(self): + super().setUp() + self.contract = _make_contract(self.env, date_start='2024-01-15') + + def test_get_dateend_returns_date_11_months_later(self): + """Req 4.4 — get_dateend returns a date 11 months after date_start.""" + result = self.contract.get_dateend() + self.assertTrue(result, "get_dateend should return a non-empty string") + # date_start = 2024-01-15, +11 months = 2024-12-15 + self.assertIn('2024-12-15', result, + "get_dateend should return date 11 months after date_start") + + def test_initials_full_name(self): + """Req 4.5 — initials('Иванов Иван Иванович') returns 'Иванов И.И.'""" + result = self.contract.initials('Иванов Иван Иванович') + self.assertEqual(result, 'Иванов И.И.', + "initials should format full name as 'Фамилия И.О.'") + + def test_initials_empty_string(self): + """Req 4.5 — initials('') returns empty string.""" + result = self.contract.initials('') + self.assertFalse(result, "initials with empty string should return falsy value") + + def test_ru_date_returns_russian_format(self): + """Req 4.6 — ru_date returns date in Russian format with quoted day.""" + result = self.contract.ru_date('2024-03-15') + self.assertTrue(result, "ru_date should return a non-empty string") + self.assertIn('2024', result, "ru_date result should contain the year") + self.assertIn('15', result, "ru_date result should contain the day") + + def test_rubles_returns_string_with_rubles_word(self): + """Req 4.7 — rubles(1500.50) returns string containing a rubles word.""" + result = self.contract.rubles(1500.50) + self.assertTrue(result, "rubles should return a non-empty string") + has_rubles_word = any( + word in result for word in ('рублей', 'рубля', 'рубль') + ) + self.assertTrue(has_rubles_word, + "rubles result should contain 'рублей', 'рубля', or 'рубль'") + + def test_rubles_1500_50_exact(self): + """Req 4.7 — rubles(1500.50) returns expected Russian text.""" + result = self.contract.rubles(1500.50) + self.assertIn('тысяча', result, "1500 should produce 'тысяча' in result") + self.assertIn('пятьсот', result, "1500 should produce 'пятьсот' in result") + self.assertIn('копеек', result, "0.50 kopecks should appear in result") + + def test_numeral_choose_plural_1_returns_rubly(self): + """Req 4.8 — numeral_choose_plural(1, ...) returns 'рубль'.""" + result = self.contract.numeral_choose_plural(1, ('рубль', 'рубля', 'рублей')) + self.assertEqual(result, 'рубль', + "numeral_choose_plural(1) should return first variant 'рубль'") + + def test_numeral_choose_plural_11_returns_rubley(self): + """Req 4.9 — numeral_choose_plural(11, ...) returns 'рублей'.""" + result = self.contract.numeral_choose_plural(11, ('рубль', 'рубля', 'рублей')) + self.assertEqual(result, 'рублей', + "numeral_choose_plural(11) should return third variant 'рублей'") + + def test_numeral_choose_plural_2_returns_rublya(self): + """numeral_choose_plural(2) returns second variant 'рубля'.""" + result = self.contract.numeral_choose_plural(2, ('рубль', 'рубля', 'рублей')) + self.assertEqual(result, 'рубля', + "numeral_choose_plural(2) should return second variant 'рубля'") + + def test_check_positive_negative_raises_value_error(self): + """Req 4.10 — check_positive with negative number raises ValueError.""" + with self.assertRaises(ValueError): + self.contract.check_positive(-1) + + def test_check_positive_zero_does_not_raise(self): + """check_positive(0) should not raise (non-strict mode).""" + try: + self.contract.check_positive(0) + except ValueError: + self.fail("check_positive(0) should not raise ValueError in non-strict mode") + + def test_check_positive_positive_does_not_raise(self): + """check_positive with positive number should not raise.""" + try: + self.contract.check_positive(100) + except ValueError: + self.fail("check_positive(100) should not raise ValueError") diff --git a/l10n_ru_contract/views/contract_customer_report_tempates_view.xml b/l10n_ru_contract/views/contract_customer_report_tempates_view.xml new file mode 100644 index 00000000..c20fef60 --- /dev/null +++ b/l10n_ru_contract/views/contract_customer_report_tempates_view.xml @@ -0,0 +1,46 @@ + + + + + contract.report.template.tree + contract.report.template + + + + + + + + + + + + contract.report.template.form + contract.report.template + +
+ + + + + + + + +
+
+
+ + + Шаблоны отчетов + contract.report.template + tree,form + +

+ Создайте новый шаблон отчета. +

+
+
+ + +
diff --git a/l10n_ru_contract/views/contract_customer_view.xml b/l10n_ru_contract/views/contract_customer_view.xml new file mode 100644 index 00000000..13163a9e --- /dev/null +++ b/l10n_ru_contract/views/contract_customer_view.xml @@ -0,0 +1,149 @@ + + + + + Договор + partner.contract.customer + +
+
+ +
+ +

+ + + от + + +

+ + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + + Договор + partner.contract.customer + + + + + + + + + + + Поиск в договорах + partner.contract.customer + + + + + + + + + + + + + Договоры + ir.actions.act_window + partner.contract.customer + kanban,list,form + +

+ Нет созданных контрактов +

+

+

+
+
+ + + Договор + partner.contract.customer + + + + + + + + + + + +
+
+
+ Номер: +
+
+ Контрагент:
+ Тип:
+ Вид договора: +
+
+ Наша компания: +
+
+
+
+
+
+ + +
+
+
+
diff --git a/l10n_ru_contract/views/contract_header_templates.xml b/l10n_ru_contract/views/contract_header_templates.xml new file mode 100644 index 00000000..36bc1fb1 --- /dev/null +++ b/l10n_ru_contract/views/contract_header_templates.xml @@ -0,0 +1,51 @@ + + + + + + + diff --git a/l10n_ru_contract/views/contract_profile_views.xml b/l10n_ru_contract/views/contract_profile_views.xml new file mode 100644 index 00000000..563d54aa --- /dev/null +++ b/l10n_ru_contract/views/contract_profile_views.xml @@ -0,0 +1,29 @@ + + + contract.profile.form + contract.profile + +
+ + + + + +
+
+
+ + + Виды договоров + ir.actions.act_window + contract.profile + list,form + + + + Настройка одновременно включенных договоров + ir.actions.act_window + contract.allowed.profiles + list,form + +
diff --git a/l10n_ru_contract/views/mail_template.xml b/l10n_ru_contract/views/mail_template.xml new file mode 100644 index 00000000..cd65bf04 --- /dev/null +++ b/l10n_ru_contract/views/mail_template.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/l10n_ru_contract/views/res_company_views.xml b/l10n_ru_contract/views/res_company_views.xml new file mode 100644 index 00000000..488e3b6f --- /dev/null +++ b/l10n_ru_contract/views/res_company_views.xml @@ -0,0 +1,12 @@ + + + res.company.form.chief.inherit + res.company + + + + + + + + \ No newline at end of file diff --git a/l10n_ru_contract/views/res_partner_views.xml b/l10n_ru_contract/views/res_partner_views.xml new file mode 100644 index 00000000..84d4c44c --- /dev/null +++ b/l10n_ru_contract/views/res_partner_views.xml @@ -0,0 +1,18 @@ + + + view_partner_form + res.partner + + + + + + + + + + + \ No newline at end of file diff --git a/l10n_ru_contract/wizard/__init__.py b/l10n_ru_contract/wizard/__init__.py new file mode 100644 index 00000000..d8860bab --- /dev/null +++ b/l10n_ru_contract/wizard/__init__.py @@ -0,0 +1,3 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import report_template_wizard diff --git a/l10n_ru_contract/wizard/report_template_wizard.py b/l10n_ru_contract/wizard/report_template_wizard.py new file mode 100644 index 00000000..e6beff53 --- /dev/null +++ b/l10n_ru_contract/wizard/report_template_wizard.py @@ -0,0 +1,63 @@ +import base64 +from odoo import models, fields, api +from io import BytesIO + +try: + from docxtpl import DocxTemplate +except ImportError: + DocxTemplate = None + +class ReportTemplateWizard(models.TransientModel): + _name = 'report.template.wizard' + _description = 'Визард выбора шаблона для печати договора' + + contract_id = fields.Many2one('model.contract', string='Договор', required=True) + typeformat = fields.Selection([('docx','DOCX'), + ('md','MD') + ], string='Формат', required=True) + template_id = fields.Many2one('contract.report.template', string='Шаблон отчета', required=True) + generated_report = fields.Binary(string='Сформированный отчет') + + def print_report(self): + self.ensure_one() + template = self.template_id + contract = self.contract_id + + if template.format == 'docx': + template_data = base64.b64decode(template.attachment) + docx_io = BytesIO(template_data) + doc = DocxTemplate(docx_io) + + context = { + 'o': contract, + 'user': self.env.user, + 'name': contract.name or '', + } + doc.render(context) + + output_io = BytesIO() + doc.save(output_io) + output_io.seek(0) + + self.generated_report = base64.b64encode(output_io.read()) + self.report_filename = f'{contract.name or "report"}.docx' + + return { + 'type': 'ir.actions.act_url', + 'url': f'/web/content/?model={self._name}&id={self.id}&field=generated_report&filename={self.report_filename}&download=true', + 'target': 'self', + } + + elif template.format == 'md': + md_content = f"# Отчет по договору\n\nНазвание договора: {contract.name or ''}\n" + self.generated_report = base64.b64encode(md_content.encode('utf-8')) + self.report_filename = f'{contract.name or "report"}.md' + + return { + 'type': 'ir.actions.act_url', + 'url': f'/web/content/?model={self._name}&id={self.id}&field=generated_report&filename={self.report_filename}&download=true', + 'target': 'self', + } + + else: + raise UserError('Неподдерживаемый формат шаблона') \ No newline at end of file diff --git a/l10n_ru_contract/wizard/report_template_wizard.xml b/l10n_ru_contract/wizard/report_template_wizard.xml new file mode 100644 index 00000000..14e721be --- /dev/null +++ b/l10n_ru_contract/wizard/report_template_wizard.xml @@ -0,0 +1,19 @@ + + + report.template.wizard.form + report.template.wizard + +
+ + + + + +
+
+
+
+
+
diff --git a/l10n_ru_contract_account/__init__.py b/l10n_ru_contract_account/__init__.py new file mode 100644 index 00000000..a4882d10 --- /dev/null +++ b/l10n_ru_contract_account/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import report \ No newline at end of file diff --git a/l10n_ru_contract_account/__manifest__.py b/l10n_ru_contract_account/__manifest__.py new file mode 100644 index 00000000..03a5e5bb --- /dev/null +++ b/l10n_ru_contract_account/__manifest__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +{ + 'name': 'Российская локализация - Договоры счета', + 'summary': """ + Создание договоров + """, + + 'description': """ + Создание договоров с клиентами и поставщиками. Адаптация под модуль счетов. + """, + + 'version': '19.0.1.0.0', + 'sequence': 0, + 'author': 'MK.Lab', + 'website': 'https://www.inf-centre.ru/', + 'depends': ['l10n_ru_contract', 'account'], + 'data': [ + 'views/contract_customer_account_views.xml', + 'views/contract_profile.xml', + 'views/account_move_views.xml', + 'report/report_contract_invoice.xml', + 'security/ir.model.access.csv', + ], + 'installable': True, +} diff --git a/l10n_ru_contract_account/models/__init__.py b/l10n_ru_contract_account/models/__init__.py new file mode 100644 index 00000000..47315735 --- /dev/null +++ b/l10n_ru_contract_account/models/__init__.py @@ -0,0 +1,3 @@ +from . import partner_contract_customer +from . import contract_profile +from . import account_move \ No newline at end of file diff --git a/l10n_ru_contract_account/models/account_move.py b/l10n_ru_contract_account/models/account_move.py new file mode 100644 index 00000000..f16d9485 --- /dev/null +++ b/l10n_ru_contract_account/models/account_move.py @@ -0,0 +1,51 @@ +from odoo import api, fields, models, exceptions, _ + + +class AccountMove(models.Model): + _inherit = 'account.move' + + mt_contract_id = fields.Many2one('partner.contract.customer', string=_('Номер договора')) + sf_number = fields.Char(string=_('Номер с/ф')) + osnovanie = fields.Char(string=_('Основание')) + sec_partner_id = fields.Many2one('res.partner', string=_('Контрагент'), store=True, compute='_compute_get_pid') + stamp = fields.Boolean(string=_('Печать и подпись'), related='mt_contract_id.stamp') + + @api.depends('partner_id') + def _compute_get_pid(self): + for s in self: + s.sec_partner_id = s.partner_id.parent_id if s.partner_id.parent_id else s.partner_id + + @api.onchange('mt_contract_id') + def set_ons(self): + for s in self: + if s.mt_contract_id: + s.osnovanie = 'Договор № ' + s.mt_contract_id.name + ' от ' + fields.Datetime.from_string( + s.mt_contract_id.date_start).strftime("%d.%m.%Y") + + @api.constrains('state') + def invoice_fields_check(self): + for s in self: + if s.state == 'posted': + if s.mt_contract_id: + errors_list = [] + journal_in_contract = s.mt_contract_id.profile_id.journal_id + payment_term_in_contract = s.mt_contract_id.profile_id.payment_term_id + receivable_in_contract = s.mt_contract_id.profile_id.receivable_account_id + + if journal_in_contract != s.journal_id: + errors_list.append(f'Отличается Журнал - [{s.journal_id.name}] ' + f'и указанный в договоре №{s.mt_contract_id.name} ' + f'Журнал - [{journal_in_contract.name}]\n\n') + + if payment_term_in_contract != s.invoice_payment_term_id: + errors_list.append(f'Отличается поле "Условие оплаты" в инвойсе ' + f'[Условие оплаты - {s.invoice_payment_term_id.name}] ' + f'и указанный в договоре №{s.mt_contract_id.name} ' + f'[Условие оплаты - {payment_term_in_contract.name}]\n\n') + + if receivable_in_contract not in s.line_ids.account_id: + errors_list.append(f'Отличается поле "Счет дебиторской задолженности" в инвойсе ' + f'и указанный в договоре №{s.mt_contract_id.name}') + + if errors_list: + raise exceptions.ValidationError(''.join(errors_list)) \ No newline at end of file diff --git a/l10n_ru_contract_account/models/contract_profile.py b/l10n_ru_contract_account/models/contract_profile.py new file mode 100644 index 00000000..bf1f857d --- /dev/null +++ b/l10n_ru_contract_account/models/contract_profile.py @@ -0,0 +1,11 @@ +from odoo import fields, models, _ + + +class ContractProfile(models.Model): + _inherit = 'contract.profile' + + payable_account_id = fields.Many2one('account.account', string=_('Счет кредиторской задолженности'), required=True) + receivable_account_id = fields.Many2one('account.account', string=_('Счет дебиторской задолженности'), required=True) + max_receivable_id = fields.Float(string=_('Максимальная деб. задолженность'), required=True) + payment_term_id = fields.Many2one('account.payment.term', string=_('Условие оплаты'), required=True) + journal_id = fields.Many2one('account.journal', string=_('Журнал'), required=True) \ No newline at end of file diff --git a/l10n_ru_contract_account/models/partner_contract_customer.py b/l10n_ru_contract_account/models/partner_contract_customer.py new file mode 100644 index 00000000..dc58b9d9 --- /dev/null +++ b/l10n_ru_contract_account/models/partner_contract_customer.py @@ -0,0 +1,22 @@ +from odoo import fields, models, _ + +class PartnerContractCustomer(models.Model): + _inherit = "partner.contract.customer" + + sec_partner_id = fields.Many2one( + "res.partner", + string=_("Контрагент как в заказе"), + ) + accountant_id = fields.Many2one( + "res.users", + string=_("Бухгалтер по взаиморасчетам"), + ) + buh_code = fields.Char( + string=_("Код договора из бухгалтерии"), + ) + payment_term_id = fields.Many2one( + "account.payment.term", + string=_("Условие оплаты"), + related="profile_id.payment_term_id", + readonly=False, + ) \ No newline at end of file diff --git a/l10n_ru_contract_account/report/__init__.py b/l10n_ru_contract_account/report/__init__.py new file mode 100644 index 00000000..7313dc3c --- /dev/null +++ b/l10n_ru_contract_account/report/__init__.py @@ -0,0 +1 @@ +from . import report_contract_invoice diff --git a/l10n_ru_contract_account/report/report_contract_invoice.py b/l10n_ru_contract_account/report/report_contract_invoice.py new file mode 100644 index 00000000..ccb72fca --- /dev/null +++ b/l10n_ru_contract_account/report/report_contract_invoice.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +from odoo import api, models + + +class ContractCustomerReportInvoice(models.AbstractModel): + _name = 'contract.customer.report_invoice' + + + def get_report_values(self, docids, data=None): + docs = self.env['account.move'].browse(docids) + return { + 'doc_ids': docs.ids, + 'doc_model': 'account.move', + 'docs': docs, + } diff --git a/l10n_ru_contract_account/report/report_contract_invoice.xml b/l10n_ru_contract_account/report/report_contract_invoice.xml new file mode 100644 index 00000000..0d6b98cd --- /dev/null +++ b/l10n_ru_contract_account/report/report_contract_invoice.xml @@ -0,0 +1,592 @@ + + + + + + A4 + + A4 + 0 + 0 + Portrait + 15 + 30 + 7 + 7 + + 10 + 90 + + + + Договор со спецификацией + account.move + qweb-pdf + l10n_ru_contract.report_contract_customer_invoice + l10n_ru_contract.report_contract_customer_invoice + 'Договор со спецификацией - %s' % (object.name) + + + report + + diff --git a/l10n_ru_contract_account/security/ir.model.access.csv b/l10n_ru_contract_account/security/ir.model.access.csv new file mode 100644 index 00000000..bdde9da3 --- /dev/null +++ b/l10n_ru_contract_account/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_contract_profile,access_contract_profile,model_contract_profile,,1,1,1,1 diff --git a/l10n_ru_contract_account/tests/__init__.py b/l10n_ru_contract_account/tests/__init__.py new file mode 100644 index 00000000..4a857c9f --- /dev/null +++ b/l10n_ru_contract_account/tests/__init__.py @@ -0,0 +1 @@ +from . import test_contract_account diff --git a/l10n_ru_contract_account/tests/test_contract_account.py b/l10n_ru_contract_account/tests/test_contract_account.py new file mode 100644 index 00000000..9c5eed0c --- /dev/null +++ b/l10n_ru_contract_account/tests/test_contract_account.py @@ -0,0 +1,228 @@ +# -*- coding: utf-8 -*- +""" +Tests for l10n_ru_contract_account — invoice field validation against contract. + +Validates: Requirements 15.1, 15.2, 15.3, 15.4 +""" +from odoo.tests.common import TransactionCase +from odoo.exceptions import ValidationError + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + +def _get_or_create_partner(env, parent=None): + """Return or create a company partner, optionally with a parent.""" + partner = env['res.partner'].create({ + 'name': 'Test Partner CA', + 'is_company': True, + 'parent_id': parent.id if parent else False, + }) + return partner + + +def _get_or_create_accounts(env): + """Return a receivable and payable account for the current company.""" + receivable = env['account.account'].search([ + ('account_type', '=', 'asset_receivable'), + ('company_ids', 'in', env.company.id), + ], limit=1) + payable = env['account.account'].search([ + ('account_type', '=', 'liability_payable'), + ('company_ids', 'in', env.company.id), + ], limit=1) + return receivable, payable + + +def _get_or_create_journal(env, name='Test Sales Journal CA'): + """Return or create a sales journal.""" + journal = env['account.journal'].search([ + ('type', '=', 'sale'), + ('company_id', '=', env.company.id), + ], limit=1) + if not journal: + journal = env['account.journal'].create({ + 'name': name, + 'type': 'sale', + 'code': 'TSCA', + 'company_id': env.company.id, + }) + return journal + + +def _get_or_create_payment_term(env): + """Return or create a payment term.""" + term = env['account.payment.term'].search([], limit=1) + if not term: + term = env['account.payment.term'].create({'name': 'Immediate CA'}) + return term + + +def _make_profile(env, journal, payment_term, receivable, payable): + """Create a contract.profile with all required account fields.""" + return env['contract.profile'].create({ + 'name': 'Test Profile CA', + 'journal_id': journal.id, + 'payment_term_id': payment_term.id, + 'receivable_account_id': receivable.id, + 'payable_account_id': payable.id, + 'max_receivable_id': 100000.0, + }) + + +def _make_contract(env, partner, profile): + """Create a minimal partner.contract.customer.""" + return env['partner.contract.customer'].create({ + 'date_start': '2024-01-01', + 'date_end': '2024-12-31', + 'type': 'customer', + 'profile_id': profile.id, + 'partner_id': partner.id, + 'partner_type': 'company', + 'company_id': env.company.id, + }) + + +def _make_invoice(env, partner, journal, payment_term, contract, receivable_account): + """Create a draft out_invoice linked to a contract.""" + product = env['product.product'].search([], limit=1) + income_account = env['account.account'].search([ + ('account_type', '=', 'income'), + ('company_ids', 'in', env.company.id), + ], limit=1) + if not income_account: + income_account = receivable_account # fallback + + move = env['account.move'].create({ + 'move_type': 'out_invoice', + 'partner_id': partner.id, + 'journal_id': journal.id, + 'invoice_payment_term_id': payment_term.id, + 'mt_contract_id': contract.id, + 'invoice_line_ids': [(0, 0, { + 'name': 'Test line', + 'quantity': 1.0, + 'price_unit': 100.0, + 'account_id': income_account.id, + })], + }) + return move + + +# --------------------------------------------------------------------------- +# TestContractAccountMove +# --------------------------------------------------------------------------- + +class TestContractAccountMove(TransactionCase): + """ + Tests for invoice field validation against contract profile. + + Validates: Requirements 15.1, 15.2, 15.3, 15.4 + """ + + def setUp(self): + super().setUp() + self.receivable, self.payable = _get_or_create_accounts(self.env) + self.journal = _get_or_create_journal(self.env) + self.payment_term = _get_or_create_payment_term(self.env) + self.partner = _get_or_create_partner(self.env) + self.profile = _make_profile( + self.env, self.journal, self.payment_term, + self.receivable, self.payable, + ) + self.contract = _make_contract(self.env, self.partner, self.profile) + + # ------------------------------------------------------------------ + # Requirement 15.1 — journal mismatch raises ValidationError on post + # ------------------------------------------------------------------ + + def test_invoice_posted_journal_mismatch_raises(self): + """ + Req 15.1 — posting an invoice whose journal differs from the contract's + profile journal raises ValidationError. + """ + other_journal = self.env['account.journal'].create({ + 'name': 'Other Journal CA', + 'type': 'sale', + 'code': 'OJCA', + 'company_id': self.env.company.id, + }) + invoice = _make_invoice( + self.env, self.partner, other_journal, + self.payment_term, self.contract, self.receivable, + ) + with self.assertRaises(ValidationError): + invoice.action_post() + + # ------------------------------------------------------------------ + # Requirement 15.2 — payment term mismatch raises ValidationError on post + # ------------------------------------------------------------------ + + def test_invoice_posted_payment_term_mismatch_raises(self): + """ + Req 15.2 — posting an invoice whose payment term differs from the + contract's profile payment term raises ValidationError. + """ + other_term = self.env['account.payment.term'].create({ + 'name': 'Other Term CA', + }) + invoice = _make_invoice( + self.env, self.partner, self.journal, + other_term, self.contract, self.receivable, + ) + with self.assertRaises(ValidationError): + invoice.action_post() + + # ------------------------------------------------------------------ + # Requirement 15.3 — matching fields post without errors + # ------------------------------------------------------------------ + + def test_invoice_posted_matching_contract_ok(self): + """ + Req 15.3 — posting an invoice whose journal and payment term match + the contract profile succeeds without errors. + """ + invoice = _make_invoice( + self.env, self.partner, self.journal, + self.payment_term, self.contract, self.receivable, + ) + # Should not raise + invoice.action_post() + self.assertEqual(invoice.state, 'posted', + "Invoice should be in posted state after action_post") + + # ------------------------------------------------------------------ + # Requirement 15.4 — sec_partner_id computed field + # ------------------------------------------------------------------ + + def test_compute_sec_partner_id_with_parent(self): + """ + Req 15.4 — sec_partner_id equals partner_id.parent_id when parent exists. + """ + parent = _get_or_create_partner(self.env) + child = _get_or_create_partner(self.env, parent=parent) + + invoice = self.env['account.move'].create({ + 'move_type': 'out_invoice', + 'partner_id': child.id, + 'journal_id': self.journal.id, + }) + self.assertEqual( + invoice.sec_partner_id, parent, + "sec_partner_id should be partner_id.parent_id when parent exists", + ) + + def test_compute_sec_partner_id_without_parent(self): + """ + Req 15.4 — sec_partner_id equals partner_id when partner has no parent. + """ + invoice = self.env['account.move'].create({ + 'move_type': 'out_invoice', + 'partner_id': self.partner.id, + 'journal_id': self.journal.id, + }) + self.assertEqual( + invoice.sec_partner_id, self.partner, + "sec_partner_id should equal partner_id when no parent exists", + ) diff --git a/l10n_ru_contract_account/views/account_move_views.xml b/l10n_ru_contract_account/views/account_move_views.xml new file mode 100644 index 00000000..7c95a986 --- /dev/null +++ b/l10n_ru_contract_account/views/account_move_views.xml @@ -0,0 +1,20 @@ + + + view_invoice_form + account.move + + + + + + + + + + + + + + \ No newline at end of file diff --git a/l10n_ru_contract_account/views/contract_customer_account_views.xml b/l10n_ru_contract_account/views/contract_customer_account_views.xml new file mode 100644 index 00000000..eb88e4dc --- /dev/null +++ b/l10n_ru_contract_account/views/contract_customer_account_views.xml @@ -0,0 +1,27 @@ + + + + partner.contract.customer.form.account + partner.contract.customer + + + + + + + + + + + + + + + + + + + + + + diff --git a/l10n_ru_contract_account/views/contract_profile.xml b/l10n_ru_contract_account/views/contract_profile.xml new file mode 100644 index 00000000..7908bbcf --- /dev/null +++ b/l10n_ru_contract_account/views/contract_profile.xml @@ -0,0 +1,22 @@ + + + contract.profile.form.account + contract.profile + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/l10n_ru_contract_purchase/__init__.py b/l10n_ru_contract_purchase/__init__.py new file mode 100644 index 00000000..9a7e03ed --- /dev/null +++ b/l10n_ru_contract_purchase/__init__.py @@ -0,0 +1 @@ +from . import models \ No newline at end of file diff --git a/l10n_ru_contract_purchase/__manifest__.py b/l10n_ru_contract_purchase/__manifest__.py new file mode 100644 index 00000000..886030ed --- /dev/null +++ b/l10n_ru_contract_purchase/__manifest__.py @@ -0,0 +1,19 @@ +{ + 'name': 'Российская локализация - Договоры Закупки', + 'summary': """ + Создание договоров, их видов и печать. Адаптация под модуль закупок + """, + 'description': """ + Создание договоров с клиентами и поставщиками. Адаптация под модуль закупок. + """, + 'version': '19.0.1.0.0', + 'sequence': 0, + 'author': 'MK.Lab', + 'website': 'https://www.inf-centre.ru/', + 'depends': ['l10n_ru_contract_account', 'purchase'], + 'data': [ + 'views/contract_customer_account_views.xml', + 'views/purchase_order_views.xml', + ], + 'installable': True, +} diff --git a/l10n_ru_contract_purchase/models/__init__.py b/l10n_ru_contract_purchase/models/__init__.py new file mode 100644 index 00000000..c91c4dac --- /dev/null +++ b/l10n_ru_contract_purchase/models/__init__.py @@ -0,0 +1 @@ +from . import purchase_order \ No newline at end of file diff --git a/l10n_ru_contract_purchase/models/purchase_order.py b/l10n_ru_contract_purchase/models/purchase_order.py new file mode 100644 index 00000000..5fb754fb --- /dev/null +++ b/l10n_ru_contract_purchase/models/purchase_order.py @@ -0,0 +1,13 @@ +from odoo import api, fields, models, _ + + +class PurchaseOrder(models.Model): + _inherit = 'purchase.order' + + mt_contract_id = fields.Many2one('partner.contract.customer', string=_('Номер договора')) + sec_partner_id = fields.Many2one('res.partner', string=_('Контрагент'), store=True, compute='_compute_get_pid') + + @api.depends('partner_id') + def _compute_get_pid(self): + for s in self: + s.sec_partner_id = s.partner_id.parent_id if s.partner_id.parent_id else s.partner_id diff --git a/l10n_ru_contract_purchase/views/contract_customer_account_views.xml b/l10n_ru_contract_purchase/views/contract_customer_account_views.xml new file mode 100644 index 00000000..33219eb6 --- /dev/null +++ b/l10n_ru_contract_purchase/views/contract_customer_account_views.xml @@ -0,0 +1,29 @@ + + + + + + Договоры + ir.actions.act_window + partner.contract.customer + kanban,list,form + [('type', '=', 'supplier')] + + +

+ Нет созданных контрактов +

+

+

+
+
+ + + + + + +
diff --git a/l10n_ru_contract_purchase/views/purchase_order_views.xml b/l10n_ru_contract_purchase/views/purchase_order_views.xml new file mode 100644 index 00000000..c77c10be --- /dev/null +++ b/l10n_ru_contract_purchase/views/purchase_order_views.xml @@ -0,0 +1,15 @@ + + + view_purchaseorder_formcontr + purchase.order + + + + + + + + + \ No newline at end of file diff --git a/l10n_ru_contract_sale/__init__.py b/l10n_ru_contract_sale/__init__.py new file mode 100644 index 00000000..a4882d10 --- /dev/null +++ b/l10n_ru_contract_sale/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import report \ No newline at end of file diff --git a/l10n_ru_contract_sale/__manifest__.py b/l10n_ru_contract_sale/__manifest__.py new file mode 100644 index 00000000..ba792bc7 --- /dev/null +++ b/l10n_ru_contract_sale/__manifest__.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +{ + 'name': 'Российская локализация - Договоры Продажи', + 'summary': """ + Создание договоров, их видов и печать + """, + + 'description': """ + Создание договоров с клиентами и поставщиками. Адаптация под модуль продаж. + """, + + 'version': '19.0.1.0.0', + 'sequence': 0, + 'author': 'MK.Lab', + 'website': 'https://www.inf-centre.ru/', + 'depends': ['l10n_ru_contract_account','sale', 'sale_management'], + 'data': [ + 'views/contract_customer_account_views.xml', + 'views/sale_order_views.xml', + 'report/report_contract_order.xml', + 'report/report_contract_order1.xml', + ], + 'installable': True, + 'demo': [ + 'demo/demo.xml', + ], +} diff --git a/l10n_ru_contract_sale/demo/demo.xml b/l10n_ru_contract_sale/demo/demo.xml new file mode 100644 index 00000000..dce2626d --- /dev/null +++ b/l10n_ru_contract_sale/demo/demo.xml @@ -0,0 +1,21 @@ + + + + + + + + + + 2026-02-01 10:00:00 + + + + + + 5.0 + 15000.0 + + + + diff --git a/l10n_ru_contract_sale/models/__init__.py b/l10n_ru_contract_sale/models/__init__.py new file mode 100644 index 00000000..d3ce4d0a --- /dev/null +++ b/l10n_ru_contract_sale/models/__init__.py @@ -0,0 +1,3 @@ +from . import sale_make_invoice_advance +from . import sale_order +from . import partner_contract_customer \ No newline at end of file diff --git a/l10n_ru_contract_sale/models/partner_contract_customer.py b/l10n_ru_contract_sale/models/partner_contract_customer.py new file mode 100644 index 00000000..6884b447 --- /dev/null +++ b/l10n_ru_contract_sale/models/partner_contract_customer.py @@ -0,0 +1,17 @@ +from odoo import api, fields, models, exceptions, _ + +class PartnerContractCustomer(models.Model): + _inherit = "partner.contract.customer" + + sale_order_id = fields.Many2one( + "sale.order", + string=_("Заказ/Сделка"), + ) + manager_id = fields.Many2one( + "res.users", + string=_("Менеджер по продажам"), + ) + team_id = fields.Many2one( + "crm.team", + string=_("Команда продаж"), + ) diff --git a/l10n_ru_contract_sale/models/sale_make_invoice_advance.py b/l10n_ru_contract_sale/models/sale_make_invoice_advance.py new file mode 100644 index 00000000..5fb593e8 --- /dev/null +++ b/l10n_ru_contract_sale/models/sale_make_invoice_advance.py @@ -0,0 +1,11 @@ +from odoo import models + + +class ContractCreateInvoice(models.TransientModel): + _inherit = 'sale.advance.payment.inv' + + def _prepare_invoice_values(self, order, so_lines, accounts): + invoice_vals = super()._prepare_invoice_values(order, so_lines, accounts) + if order.mt_contract_id: + invoice_vals['mt_contract_id'] = order.mt_contract_id.id + return invoice_vals \ No newline at end of file diff --git a/l10n_ru_contract_sale/models/sale_order.py b/l10n_ru_contract_sale/models/sale_order.py new file mode 100644 index 00000000..517d4817 --- /dev/null +++ b/l10n_ru_contract_sale/models/sale_order.py @@ -0,0 +1,57 @@ +from odoo import api, fields, models, exceptions, _ +from datetime import datetime + +class SaleOrder(models.Model): + _inherit = 'sale.order' + + mt_contract_id = fields.Many2one('partner.contract.customer', string=_('Номер договора')) + sec_partner_id = fields.Many2one('res.partner', string=_('Контрагент'), store=True, compute='_compute_get_pid') + stamp = fields.Boolean(string=_('Печать и подпись'), related='mt_contract_id.stamp') + + @api.depends('partner_id') + def _compute_get_pid(self): + for s in self: + s.sec_partner_id = s.partner_id.parent_id if s.partner_id.parent_id else s.partner_id + + @api.onchange('mt_contract_id') + def set_ons(self): + for s in self: + if s.mt_contract_id: + s.payment_term_id = s.mt_contract_id.payment_term_id + + @api.constrains('state') + def late_payment_check(self): + for s in self: + if s.mt_contract_id: + if s.state == 'sale': + late_invoices_count = 0 + max_receivable = s.mt_contract_id.profile_id.max_receivable_id + + invoices_obj = self.env['account.move'].search([('partner_id', '=', s.partner_id.id), + ('state', '=', 'posted'), + ('payment_state', 'not in', ['paid', 'reversed']), + ('move_type', 'in', ['out_invoice']), + ('invoice_date_due', '<', datetime.now().date())]) + + for invoice in invoices_obj: + late_invoices_count += invoice.amount_residual + + if late_invoices_count > max_receivable: + raise exceptions.ValidationError( + f'Нельзя подтвердить заказ, так как у контрагента {s.sec_partner_id.name} нарушено ' + f'условие по дебиторской задолженности.\n\n' + f'Контрагент {s.sec_partner_id.name} должен {late_invoices_count}руб.\n' + f'Максимальная дебиторская задолженность указанная в ' + f'договоре №{s.mt_contract_id.name} - {max_receivable}руб.\n\n' + f'Проверьте следующие неоплаченные счета контрагента:\n' + f'{", ".join([invoice.name for invoice in invoices_obj])}') + + + def _prepare_invoice(self): + invoice_vals = super(SaleOrder, self)._prepare_invoice() + for s in self: + if s.mt_contract_id: + invoice_vals['mt_contract_id'] = s.mt_contract_id.id + invoice_vals['osnovanie'] = 'Договор № ' + s.mt_contract_id.name + ' от ' + fields.Datetime.from_string( + s.mt_contract_id.date_start).strftime("%d.%m.%Y") + return invoice_vals \ No newline at end of file diff --git a/l10n_ru_contract_sale/report/__init__.py b/l10n_ru_contract_sale/report/__init__.py new file mode 100644 index 00000000..c204bf79 --- /dev/null +++ b/l10n_ru_contract_sale/report/__init__.py @@ -0,0 +1,2 @@ +from . import report_contract_order + diff --git a/l10n_ru_contract_sale/report/report_contract_order.py b/l10n_ru_contract_sale/report/report_contract_order.py new file mode 100644 index 00000000..42a679de --- /dev/null +++ b/l10n_ru_contract_sale/report/report_contract_order.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +from odoo import api, models + + +class ContractCustomerReportOrder(models.AbstractModel): + _name = 'contract.customer.report_order' + + + def get_report_values(self, docids, data=None): + docs = self.env['sale.order'].browse(docids) + return { + 'doc_ids': docs.ids, + 'doc_model': 'sale.order', + 'docs': docs, + } + + + diff --git a/l10n_ru_contract_sale/report/report_contract_order.xml b/l10n_ru_contract_sale/report/report_contract_order.xml new file mode 100644 index 00000000..df23d59a --- /dev/null +++ b/l10n_ru_contract_sale/report/report_contract_order.xml @@ -0,0 +1,594 @@ + + + + + + A4 + + A4 + 0 + 0 + Portrait + 15 + 30 + 7 + 7 + + 10 + 90 + + + + Договор со спецификацией + sale.order + qweb-pdf + l10n_ru_contract_sale.report_contract_customer_order + l10n_ru_contract_sale.report_contract_customer_order + 'Договор со спецификацией - %s' % (object.name) + + + report + + diff --git a/l10n_ru_contract_sale/report/report_contract_order1.xml b/l10n_ru_contract_sale/report/report_contract_order1.xml new file mode 100644 index 00000000..4bee4dab --- /dev/null +++ b/l10n_ru_contract_sale/report/report_contract_order1.xml @@ -0,0 +1,406 @@ + + + + + + A4 + + A4 + 0 + 0 + Portrait + 15 + 30 + 7 + 7 + + 10 + 90 + + + + Спецификация + sale.order + qweb-pdf + l10n_ru_contract_sale.report_contract_customer_order1 + l10n_ru_contract_sale.report_contract_customer_order1 + 'Спецификация - %s' % (object.name) + + + report + + diff --git a/l10n_ru_contract_sale/tests/__init__.py b/l10n_ru_contract_sale/tests/__init__.py new file mode 100644 index 00000000..ea35715b --- /dev/null +++ b/l10n_ru_contract_sale/tests/__init__.py @@ -0,0 +1 @@ +from . import test_contract_sale diff --git a/l10n_ru_contract_sale/tests/test_contract_sale.py b/l10n_ru_contract_sale/tests/test_contract_sale.py new file mode 100644 index 00000000..ba3b1128 --- /dev/null +++ b/l10n_ru_contract_sale/tests/test_contract_sale.py @@ -0,0 +1,250 @@ +# -*- coding: utf-8 -*- +""" +Tests for l10n_ru_contract_sale — overdue debt check on sale order confirmation +and invoice preparation with contract fields. + +Validates: Requirements 16.1, 16.2, 16.3 +""" +from datetime import date, timedelta + +from odoo.tests.common import TransactionCase +from odoo.exceptions import ValidationError + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + +def _get_or_create_accounts(env): + """Return a receivable and income account for the current company.""" + receivable = env['account.account'].search([ + ('account_type', '=', 'asset_receivable'), + ('company_ids', 'in', env.company.id), + ], limit=1) + payable = env['account.account'].search([ + ('account_type', '=', 'liability_payable'), + ('company_ids', 'in', env.company.id), + ], limit=1) + income = env['account.account'].search([ + ('account_type', '=', 'income'), + ('company_ids', 'in', env.company.id), + ], limit=1) + return receivable, payable, income + + +def _get_or_create_journal(env): + """Return or create a sales journal.""" + journal = env['account.journal'].search([ + ('type', '=', 'sale'), + ('company_id', '=', env.company.id), + ], limit=1) + if not journal: + journal = env['account.journal'].create({ + 'name': 'Test Sales Journal CS', + 'type': 'sale', + 'code': 'TSCS', + 'company_id': env.company.id, + }) + return journal + + +def _get_or_create_payment_term(env): + """Return or create a payment term.""" + term = env['account.payment.term'].search([], limit=1) + if not term: + term = env['account.payment.term'].create({'name': 'Immediate CS'}) + return term + + +def _make_profile(env, journal, payment_term, receivable, payable, max_receivable=10000.0): + """Create a contract.profile.""" + return env['contract.profile'].create({ + 'name': 'Test Profile CS', + 'journal_id': journal.id, + 'payment_term_id': payment_term.id, + 'receivable_account_id': receivable.id, + 'payable_account_id': payable.id, + 'max_receivable_id': max_receivable, + }) + + +def _make_partner(env): + """Create a company partner.""" + return env['res.partner'].create({ + 'name': 'Test Partner CS', + 'is_company': True, + }) + + +def _make_contract(env, partner, profile): + """Create a minimal partner.contract.customer.""" + return env['partner.contract.customer'].create({ + 'date_start': '2024-01-01', + 'date_end': '2024-12-31', + 'type': 'customer', + 'profile_id': profile.id, + 'partner_id': partner.id, + 'partner_type': 'company', + 'company_id': env.company.id, + }) + + +def _make_product(env): + """Return or create a storable product.""" + product = env['product.product'].search([ + ('type', '=', 'service'), + ], limit=1) + if not product: + product = env['product.product'].create({ + 'name': 'Test Product CS', + 'type': 'service', + }) + return product + + +def _make_sale_order(env, partner, contract, product): + """Create a confirmed-ready sale order linked to a contract.""" + order = env['sale.order'].create({ + 'partner_id': partner.id, + 'mt_contract_id': contract.id, + 'order_line': [(0, 0, { + 'product_id': product.id, + 'product_uom_qty': 1.0, + 'price_unit': 500.0, + })], + }) + return order + + +def _make_overdue_invoice(env, partner, journal, income_account, amount, days_overdue=10): + """Create a posted out_invoice that is overdue and unpaid.""" + due_date = date.today() - timedelta(days=days_overdue) + invoice = env['account.move'].create({ + 'move_type': 'out_invoice', + 'partner_id': partner.id, + 'journal_id': journal.id, + 'invoice_date': due_date, + 'invoice_date_due': due_date, + 'invoice_line_ids': [(0, 0, { + 'name': 'Overdue line', + 'quantity': 1.0, + 'price_unit': amount, + 'account_id': income_account.id, + })], + }) + invoice.action_post() + return invoice + + +# --------------------------------------------------------------------------- +# TestContractSaleOrder +# --------------------------------------------------------------------------- + +class TestContractSaleOrder(TransactionCase): + """ + Tests for sale order confirmation with overdue debt check and + invoice preparation with contract fields. + + Validates: Requirements 16.1, 16.2, 16.3 + """ + + def setUp(self): + super().setUp() + self.receivable, self.payable, self.income = _get_or_create_accounts(self.env) + self.journal = _get_or_create_journal(self.env) + self.payment_term = _get_or_create_payment_term(self.env) + self.partner = _make_partner(self.env) + self.product = _make_product(self.env) + + # ------------------------------------------------------------------ + # Requirement 16.1 — overdue debt > max_receivable raises ValidationError + # ------------------------------------------------------------------ + + def test_confirm_with_overdue_debt_raises(self): + """ + Req 16.1 — confirming a sale order when the partner has overdue debt + exceeding max_receivable raises ValidationError. + """ + profile = _make_profile( + self.env, self.journal, self.payment_term, + self.receivable, self.payable, + max_receivable=100.0, + ) + contract = _make_contract(self.env, self.partner, profile) + + # Create an overdue posted invoice with amount > max_receivable + _make_overdue_invoice( + self.env, self.partner, self.journal, self.income, + amount=500.0, # 500 > 100 (max_receivable) + ) + + order = _make_sale_order(self.env, self.partner, contract, self.product) + + with self.assertRaises(ValidationError): + order.action_confirm() + + # ------------------------------------------------------------------ + # Requirement 16.2 — debt within limit confirms without errors + # ------------------------------------------------------------------ + + def test_confirm_within_debt_limit_ok(self): + """ + Req 16.2 — confirming a sale order when overdue debt is within + max_receivable succeeds without errors. + """ + profile = _make_profile( + self.env, self.journal, self.payment_term, + self.receivable, self.payable, + max_receivable=10000.0, + ) + contract = _make_contract(self.env, self.partner, profile) + + # Create an overdue invoice with amount well below max_receivable + _make_overdue_invoice( + self.env, self.partner, self.journal, self.income, + amount=50.0, # 50 < 10000 (max_receivable) + ) + + order = _make_sale_order(self.env, self.partner, contract, self.product) + + # Should not raise + order.action_confirm() + self.assertEqual(order.state, 'sale', + "Order should be confirmed (state='sale') when debt is within limit") + + # ------------------------------------------------------------------ + # Requirement 16.3 — _prepare_invoice copies mt_contract_id and osnovanie + # ------------------------------------------------------------------ + + def test_prepare_invoice_copies_contract(self): + """ + Req 16.3 — _prepare_invoice transfers mt_contract_id and osnovanie + from the sale order's contract to the invoice values dict. + """ + profile = _make_profile( + self.env, self.journal, self.payment_term, + self.receivable, self.payable, + max_receivable=10000.0, + ) + contract = _make_contract(self.env, self.partner, profile) + order = _make_sale_order(self.env, self.partner, contract, self.product) + order.action_confirm() + + invoice_vals = order._prepare_invoice() + + self.assertEqual( + invoice_vals.get('mt_contract_id'), contract.id, + "_prepare_invoice should copy mt_contract_id from the contract", + ) + self.assertIn( + 'osnovanie', invoice_vals, + "_prepare_invoice should set 'osnovanie' in invoice values", + ) + self.assertTrue( + invoice_vals['osnovanie'], + "'osnovanie' should be a non-empty string", + ) + self.assertIn( + contract.name, invoice_vals['osnovanie'], + "'osnovanie' should contain the contract name", + ) diff --git a/l10n_ru_contract_sale/views/contract_customer_account_views.xml b/l10n_ru_contract_sale/views/contract_customer_account_views.xml new file mode 100644 index 00000000..d83bea07 --- /dev/null +++ b/l10n_ru_contract_sale/views/contract_customer_account_views.xml @@ -0,0 +1,49 @@ + + + + partner.contract.customer.form.sale + partner.contract.customer + + + + + + + + + + + + + + + + + + + + Договоры + ir.actions.act_window + partner.contract.customer + kanban,list,form + [('type', '=', 'customer')] + + +

+ Нет созданных контрактов +

+

+

+
+
+ + + + + + + +
diff --git a/l10n_ru_contract_sale/views/sale_order_views.xml b/l10n_ru_contract_sale/views/sale_order_views.xml new file mode 100644 index 00000000..a0c2c29e --- /dev/null +++ b/l10n_ru_contract_sale/views/sale_order_views.xml @@ -0,0 +1,15 @@ + + + view_saleorder_form + sale.order + + + + + + + + + \ No newline at end of file diff --git a/l10n_ru_contract_templates/__init__.py b/l10n_ru_contract_templates/__init__.py new file mode 100644 index 00000000..9a7e03ed --- /dev/null +++ b/l10n_ru_contract_templates/__init__.py @@ -0,0 +1 @@ +from . import models \ No newline at end of file diff --git a/l10n_ru_contract_templates/__manifest__.py b/l10n_ru_contract_templates/__manifest__.py new file mode 100644 index 00000000..124f0b17 --- /dev/null +++ b/l10n_ru_contract_templates/__manifest__.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +{ + "name": "Russian Contracts – DOCX Templates", + "summary": "Связка договоров и DOCX-шаблонов для l10n_ru_contract", + "version": "19.0.1.0.0", + "category": "Accounting", + "author": "MK.Lab", + "depends": [ + "web", + "l10n_ru_contract", + "docx_report", + ], + "data": [ + "views/partner_contract_customer_views.xml", + "views/contract_profile_views.xml", + ], + "installable": True, +} diff --git a/l10n_ru_contract_templates/models/__init__.py b/l10n_ru_contract_templates/models/__init__.py new file mode 100644 index 00000000..b58a25f0 --- /dev/null +++ b/l10n_ru_contract_templates/models/__init__.py @@ -0,0 +1,2 @@ +from . import partner_contract_customer +from . import contract_profile diff --git a/l10n_ru_contract_templates/models/contract_profile.py b/l10n_ru_contract_templates/models/contract_profile.py new file mode 100644 index 00000000..a13c7f48 --- /dev/null +++ b/l10n_ru_contract_templates/models/contract_profile.py @@ -0,0 +1,6 @@ +from odoo import models + + +class ContractProfile(models.Model): + _name = 'contract.profile' + _inherit = ["contract.profile", "docx.template.mixin"] diff --git a/l10n_ru_contract_templates/models/partner_contract_customer.py b/l10n_ru_contract_templates/models/partner_contract_customer.py new file mode 100644 index 00000000..d3b418be --- /dev/null +++ b/l10n_ru_contract_templates/models/partner_contract_customer.py @@ -0,0 +1,12 @@ +from odoo import api, models + + +class PartnerContractCustomer(models.Model): + _name = "partner.contract.customer" + _inherit = ["partner.contract.customer", "docx.template.mixin"] + + @api.onchange("profile_id") + def _onchange_profile_id_set_docx_template(self): + for rec in self: + if rec.profile_id and not rec.docx_template_id and rec.profile_id.docx_template_id: + rec.docx_template_id = rec.profile_id.docx_template_id diff --git a/l10n_ru_contract_templates/views/contract_profile_views.xml b/l10n_ru_contract_templates/views/contract_profile_views.xml new file mode 100644 index 00000000..b78bdd2b --- /dev/null +++ b/l10n_ru_contract_templates/views/contract_profile_views.xml @@ -0,0 +1,18 @@ + + + contract.profile.form.docx.template + contract.profile + + + + + + + + + + + + + + \ No newline at end of file diff --git a/l10n_ru_contract_templates/views/partner_contract_customer_views.xml b/l10n_ru_contract_templates/views/partner_contract_customer_views.xml new file mode 100644 index 00000000..7839d7f1 --- /dev/null +++ b/l10n_ru_contract_templates/views/partner_contract_customer_views.xml @@ -0,0 +1,16 @@ + + + contract.customer.form.docx.template + partner.contract.customer + + + + + + + + + + + + diff --git a/l10n_ru_doc/README.md b/l10n_ru_doc/README.md new file mode 100644 index 00000000..adc684e7 --- /dev/null +++ b/l10n_ru_doc/README.md @@ -0,0 +1,38 @@ +# Российская локализация - Документы +name: l10n_ru_doc + +## Описание +Модуль для печати документов в соответствии с законодательством России. + +## Возможности: +* Товарная накладная (ТОРГ-12) +* Счет на оплату (по форме 1С) +* Счет-фактура +* Акт выполненных работ +* Универсальный передаточный документ + +### Товарная накладная (ТОРГ-12) +#### Для печати: +1. Меню Бухгалтерия - Клиенты - Счета (account.move); +2. Отчет "Товарная накладная (ТОРГ-12)". + +### Счет на оплату (по форме 1С) +1. Меню Продажи - Заказ продаж (sale.order)); +2. Отчет "Счет по форме 1С". + +### Счет-фактура +1. Меню Бухгалтерия - Клиенты - Счета (account.move); +2. Отчет "Счет-фактура". + +### Акт выполненных работ +1. Меню Бухгалтерия - Клиенты - Счета (account.move); +2. Отчет "Акт выполненных работ". + +### Универсальный передаточный документ +1. Меню Бухгалтерия - Клиенты - Счета (account.move); +2. В двух вариантах:отчет "Универсальный передаточный документ(УПД)" + + 2.1. Отчет "Универсальный передаточный документ(УПД)"; + + 2.2. Отчет "УПД без печатей"; + diff --git a/l10n_ru_doc/__init__.py b/l10n_ru_doc/__init__.py new file mode 100644 index 00000000..10a94a5b --- /dev/null +++ b/l10n_ru_doc/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- + +from . import models +from . import report_helper +from . import report diff --git a/l10n_ru_doc/__manifest__.py b/l10n_ru_doc/__manifest__.py new file mode 100644 index 00000000..27d73ccf --- /dev/null +++ b/l10n_ru_doc/__manifest__.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- +{ + 'name': "Российская локализация - Документы", + + 'summary': "Первичные документы", + + 'description': """ +Модуль для печати документов в соответствии с законодательством России. +============================================================ +Возможности: + * Товарная накладная (ТОРГ-12) + * Счет на оплату (по форме 1С) + * Счет-фактура + * Акт выполненных работ + * Универсальный передаточный документ + +Для печати: + Товарная накладная (ТОРГ-12) + 1. Меню Бухгалтерия - Клиенты - Счета (account.move); + 2. Отчет "Товарная накладная (ТОРГ-12)". + + Счет на оплату (по форме 1С) + 1. Меню Продажи - Заказ продаж (sale.order)); + 2. Отчет "Счет по форме 1С". + + Счет-фактура + 1. Меню Бухгалтерия - Клиенты - Счета (account.move); + 2. Отчет "Счет-фактура". + + Акт выполненных работ + 1. Меню Бухгалтерия - Клиенты - Счета (account.move); + 2. Отчет "Акт выполненных работ". + + Универсальный передаточный документ + 1. Меню Бухгалтерия - Клиенты - Счета (account.move); + 2. В двух вариантах:отчет "Универсальный передаточный документ(УПД)" + 2.1. Отчет "Универсальный передаточный документ(УПД)"; + 2.2. Отчет "УПД без печатей"; + + """, + + 'author': "CodeUP and MK.Lab", + 'website': "https://www.inf-centre.ru/", + + 'license': 'AGPL-3', + 'category': 'Localization', + 'version': '19.0.2025.11.11', + + 'depends': ['base', 'sale', 'account', 'sale_stock', 'uom', 'l10n_ru_base', 'docx_report_generation'], + + 'external_dependencies': {'python': ['pytils']}, + + 'data': [ + 'views/account_invoice_view.xml', + 'views/res_partner_view.xml', + 'views/res_company_view.xml', + 'views/res_users_view.xml', + 'views/res_bank_view.xml', + 'views/uom.xml', + 'views/tax.xml', + 'views/product.xml', + 'views/l10n_ru_doc_data.xml', + 'report/l10n_ru_doc_report.xml', + 'report/report_order.xml', + 'report/report_invoice.xml', + 'report/report_bill.xml', + 'report/report_act.xml', + 'report/report_upd.xml', + 'report/report_updn.xml', + ], + + 'demo': [ + 'demo/l10n_ru_doc_demo.xml', + 'demo/l10n_ru_doc_demo_extra.xml', + ], +} diff --git a/l10n_ru_doc/demo/l10n_ru_doc_demo.xml b/l10n_ru_doc/demo/l10n_ru_doc_demo.xml new file mode 100644 index 00000000..8a94dc94 --- /dev/null +++ b/l10n_ru_doc/demo/l10n_ru_doc_demo.xml @@ -0,0 +1,63 @@ + + + + + + ОАО "СБЕРБАНК РОССИИ" + г.Москва + 044525225 + 30101810400000000225 + + + + 40707810600025341231 + + + + + + + iVBORw0KGgoAAAANSUhEUgAAALQAAABACAYAAACzzl09AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2lpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoxMGE3N2JhNy01MThlLTMwNGEtODcxOC0wMmQ5MWYzYTdiNTUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjQ2QTI3QjdCQ0JCMTFFMzgwRTQ4NjcwRjlEM0QyMTAiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjQ2QTI3QjZCQ0JCMTFFMzgwRTQ4NjcwRjlEM0QyMTAiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkYzOTcwMjU2QkNCOTExRTM5OEZFRDU5OUQxQUU3MUUzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkYzOTcwMjU3QkNCOTExRTM5OEZFRDU5OUQxQUU3MUUzIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+LLXcsQAAAjFJREFUeNrs3TFKM0EUB3BXv+QAgqViYWflBQLbWNhZKwE7QQSPkCMIItgJQW+gtjmCBxLZr34zsMPDiCK/X6c7swPxz/B4zJhuGIYN+Cs2fQQINAg0fL9/5S+6o6NUUT28v3dh/s1NnP/5OT7/7i7Ov7qK83d24vjFoht7X/f4GOfv78f5fd/5s9uhQaBBoGGdNXSzRs7W2GWNfH09On+4v4/jF4vcehcXcf5qpdFuhwaBBoEGgQaBRqBBoOHnNPvQ2b7zxtZWnF+e7SieV+uVZzkOD0efV33r8ixH38f5RV/a2Q47NAg0CDQkde4UYocGgQaBhpT6TuF8Hovq7e3w43B7O36nr+9z55dXq9hHXi7j/N3dOL7RN+6Oj8fXn07j+15e9KHt0CDQINDwpRp6WC5TdwDTNXKjxh7m8zB+mr0TOJnE972+xvVPTzXe7dAg0CDQsNYa+rf58DfCDo1Ag0DDL6+hu7Oz2Kc9OIjPi7MeZd+6/H/Q3WyW6vtWZzlms/j86Smuf34e1/+IVXd1tqM4y4EdGgQaBBqS3CnEDg0CDQINOXUf+u0tdyfw5CSeN354iPP39kbHV+snz19X3+FS9tHLO5HFeOzQINAg0PDVGrpZIzdq7OHyMjU+XSO3vufw+XmtdyKxQ4NAg0BDq4aeNCZMfGbYoUGgQaBRQ4+aJvvI1VmO8k5g8bzsW1fvS/aRm3cii/c522GHBoEGgYYkdwqxQ4NAg0BDzn8BBgBlrqW6k1gn5wAAAABJRU5ErkJggg== + codup-test@mail.ru + www.codup.com + 0000000000 + 000000000 + 00000000 + + + + ООО "CodUP" + ул.Земляничная + дом № 13 + 123456 + г.Москва + + + + 1 + 1 + iVBORw0KGgoAAAANSUhEUgAAAOYAAADmCAMAAAD2tAmJAAAC2VBMVEUWAGH///8WAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGEWAGF7Mdv3AAAA83RSTlMAAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0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 + + + + Иванов Иван Петрович + codup-test@mail.ru + + + + Иванов Иван Петрович + iVBORw0KGgoAAAANSUhEUgAAAZQAAAETCAMAAAAmrgDyAAAC61BMVEUOF9r///8OF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9oOF9r/ATCgAAAA+HRSTlMAAAECAwQFBgcICQoLDA0ODxAREhQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJj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 + + + + Сидоров Семен Иванович + codup-test@mail.ru + + + + Сидоров Семен Иванович + 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 + + + + diff --git a/l10n_ru_doc/demo/l10n_ru_doc_demo_extra.xml b/l10n_ru_doc/demo/l10n_ru_doc_demo_extra.xml new file mode 100644 index 00000000..e9bfe08a --- /dev/null +++ b/l10n_ru_doc/demo/l10n_ru_doc_demo_extra.xml @@ -0,0 +1,60 @@ + + + + + + + + 101000 + + + + + 190000 + + + + + Иванов Иван Иванович + + contact + + + 101000 + 4510 123456 + + + + + Товар + TOV-001 + 4607001234567 + 8471300000 + 15000.0 + 9000.0 + + consu + + + + + out_invoice + + + 2026-02-10 + + + 547 + Договор поставки + + + + + + 3.0 + 15000.0 + Товар + + + + diff --git a/l10n_ru_doc/i18n/ru.po b/l10n_ru_doc/i18n/ru.po new file mode 100644 index 00000000..59d03de4 --- /dev/null +++ b/l10n_ru_doc/i18n/ru.po @@ -0,0 +1,116 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_ru_doc +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-08-19 09:27+0000\n" +"PO-Revision-Date: 2020-08-19 09:27+0000\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: l10n_ru_doc +#: model:ir.actions.report,name:l10n_ru_doc.report_account_invoice_act +msgid "Act" +msgstr "Акт об оказании услуг" + +#. module: l10n_ru_doc +#: model:ir.actions.report,name:l10n_ru_doc.report_account_invoice_bill +msgid "Bill" +msgstr "Товарная накладная (ТОРГ-12)" + +#. module: l10n_ru_doc +#: model:ir.model.fields,help:l10n_ru_doc.field_res_company__print_facsimile +#: model:ir.model.fields,help:l10n_ru_doc.field_res_users__print_facsimile +msgid "Check this for adding Facsimiles of responsible persons to documents." +msgstr "Отметьте, для вставки подписей ответственных лиц в документы." + +#. module: l10n_ru_doc +#: model:ir.model.fields,help:l10n_ru_doc.field_res_company__print_stamp +msgid "Check this for adding Stamp of company to documents." +msgstr "Отметьте, для вставки печати организации в документы." + +#. module: l10n_ru_doc +#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_company__chief_id +msgid "Chief" +msgstr "Руководитель организации" + +#. module: l10n_ru_doc +#: model:ir.model.fields,field_description:l10n_ru_doc.field_account_setup_bank_manual_config__bank_corr_acc +#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_bank__corr_acc +#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_partner_bank__bank_corr_acc +msgid "Corresponding account" +msgstr "Корр. счет" + +#. module: l10n_ru_doc +#: model_terms:ir.ui.view,arch_db:l10n_ru_doc.view_company_ru_form +msgid "Documents" +msgstr "Документы" + +#. module: l10n_ru_doc +#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_users__facsimile +msgid "Facsimile" +msgstr "Подпись" + +#. module: l10n_ru_doc +#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_company__inn +#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_partner__inn +#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_users__inn +msgid "INN" +msgstr "ИНН" + +#. module: l10n_ru_doc +#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_company__kpp +#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_partner__kpp +#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_users__kpp +msgid "KPP" +msgstr "КПП" + +#. module: l10n_ru_doc +#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_company__okpo +#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_partner__okpo +#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_users__okpo +msgid "OKPO" +msgstr "ОКПО" + +#. module: l10n_ru_doc +#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_company__print_anywhere +msgid "Print Anywhere" +msgstr "Документы" + +#. module: l10n_ru_doc +#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_company__print_facsimile +#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_users__print_facsimile +msgid "Print Facsimile" +msgstr "Выводить подписи" + +#. module: l10n_ru_doc +#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_company__print_stamp +msgid "Print Stamp" +msgstr "Выводить печать" + +#. module: l10n_ru_doc +#: model_terms:ir.ui.view,arch_db:l10n_ru_doc.view_company_ru_form +msgid "Responsible Persons" +msgstr "Ответственные лица" + +#. module: l10n_ru_doc +#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_company__stamp +msgid "Stamp" +msgstr "Печать" + +#. module: l10n_ru_doc +#: model:ir.model.fields,help:l10n_ru_doc.field_res_company__print_anywhere +msgid "Uncheck this, if you want add Facsimile and Stamp only in email." +msgstr "Снимите отметку, если хотите добавлять подписи и печать только в email." + +#. module: l10n_ru_doc +#: model:ir.actions.report,name:l10n_ru_doc.report_account_invoice_upd +msgid "Upd" +msgstr "Универсальный платежный документ (УПД)" diff --git a/l10n_ru_doc/models/__init__.py b/l10n_ru_doc/models/__init__.py new file mode 100644 index 00000000..d3785302 --- /dev/null +++ b/l10n_ru_doc/models/__init__.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- + +from . import res_partner +from . import res_company +from . import res_users +from . import res_bank +from . import account_invoice +from . import account_move_line +from . import sale +from . import uom +from . import tax +from . import product diff --git a/l10n_ru_doc/models/account_invoice.py b/l10n_ru_doc/models/account_invoice.py new file mode 100644 index 00000000..7ecade04 --- /dev/null +++ b/l10n_ru_doc/models/account_invoice.py @@ -0,0 +1,150 @@ +from datetime import datetime +from odoo import api, fields, models + +class AccountInvoice(models.Model): + _inherit = 'account.move' + kladov=fields.Many2one('res.users', string='Ответственный за передачу товаров/услуг') + gruzopol=fields.Many2one('res.partner', string='Грузополучатель') + gruzootpr=fields.Many2one('res.partner', string='Грузоотправитель') + transport=fields.Char('Данные о транспортировке и грузе') + osnovanie=fields.Char('Основание') + payment_text=fields.Char('Текст для платежек в УПД', compute='_compute_get_txtpayment') + payment_num=fields.Char('Номер платежки в УПД', compute='_compute_get_txtpayment') + payment_date = fields.Char('Дата платежки в УПД', compute='_compute_get_txtpayment') + only_service = fields.Boolean('Только услуги', compute='_compute_get_check_service') + + @api.depends('invoice_line_ids') + def _compute_get_check_service(self): + for s in self: + s.only_service = all((line.product_id.type=='service') for line in s.invoice_line_ids) + + def _compute_get_txtpayment(self): + for s in self: + payments = s._get_reconciled_payments() + payment_text = '' + + for payment in payments: + if payment.date: + payment_text += payment.name + ' от ' + \ + fields.Datetime.from_string(payment.date).strftime("%d.%m.%Y") + if payments[-1]!=payment: + payment_text += ', ' + if payments: + s.payment_num = payments[0].name + s.payment_date = fields.Datetime.from_string(payments[0].date).strftime("%d.%m.%Y") + else: + s.payment_num = '' + s.payment_text = '' + s.payment_date = '' + + s.payment_text = payment_text + + # def action_bill_sent(self): + # assert len(self) == 1, 'This option should only be used for a single id at a time.' + # template = self.env.ref('account.email_template_edi_invoice', False) + # compose_form = self.env.ref('mail.email_compose_message_wizard_form', False) + # ctx = { + # 'default_model': 'account.move', + # 'default_res_id': self.id, + # 'default_use_template': bool(template), + # 'default_template_id': template.id, + # 'default_composition_mode': 'comment', + # 'mark_invoice_as_sent': True, + # } + # return { + # 'name': 'Compose Email', + # 'type': 'ir.actions.act_window', + # 'view_type': 'form', + # 'view_mode': 'form', + # 'res_model': 'mail.compose.message', + # 'views': [(compose_form.id, 'form')], + # 'view_id': compose_form.id, + # 'target': 'new', + # 'context': ctx, + # } + + def bill_print(self): + assert len(self) == 1, 'This option should only be used for a single id at a time.' + return self.env['report'].get_action(self, 'l10n_ru_doc.report_upd') + + def get_delivery_doc_name(self): + for s in self: + if s: + pickings = [] + pickings_list = '0' + orders = self.env['sale.order'].sudo().search([('name','=',s.invoice_origin)]) if s.invoice_origin else [] + for o in orders: + if o.picking_ids: + for p in o.picking_ids: + pickings.append(p.name) + if len(pickings)>0: + pickings_list = ';'.join(pickings) + if pickings_list != '0': + return pickings_list + if s.name and s.name.find('/') > -1: + return 'УПД № ' + s.name[len(s.name) - 4:] + return 'УПД № ' + str(s.name) if s.name else '' + + + def get_delivery_doc_date(self): + for s in self: + if s: + delivery_dates = [] + pickings = [] + orders = self.env['sale.order'].sudo().search([('name', '=', s.invoice_origin)]) + for o in orders: + if o.picking_ids: + for p in o.picking_ids: + if p.date_done: + formatted_date = datetime.strftime(p.date, '%d.%m.%Y') + pickings.append(formatted_date) + if pickings and len(pickings)>0: + delivery_dates.append(';'.join(pickings)) + else: + if s.date: + delivery_dates.append(datetime.strftime(s.date, '%d.%m.%Y')) + return delivery_dates + + def get_function_partner(self, partner=False, type='director'): + if partner: + if partner.parent_id: + partner = partner.parent_id + director = self.env['res.partner'].search([('parent_id', '=', partner.id), + ('type', '=', type)], limit=1) + if director: + if director.function: + return director.function + return '' + + def get_name_partner(self, partner=False, type='director'): + if partner: + if partner.parent_id: + partner = partner.parent_id + director = self.env['res.partner'].search([('parent_id', '=', partner.id), + ('type', '=', type)], limit=1) + if director: + if director.name: + return director.name + return '' + + def get_facsimile_partner(self, partner=False, type='director'): + if partner: + if partner.parent_id: + partner = partner.parent_id + director = self.env['res.partner'].search([('parent_id', '=', partner.id), + ('type', '=', type)], + limit=1) + if director: + if director.facsimile: + return director.facsimile + return '' + + def get_stamp_partner(self, partner=False): + if partner: + if partner.parent_id: + partner = partner.parent_id + if partner.stamp: + return partner.stamp + return False + + diff --git a/l10n_ru_doc/models/account_move_line.py b/l10n_ru_doc/models/account_move_line.py new file mode 100644 index 00000000..06e0f5ec --- /dev/null +++ b/l10n_ru_doc/models/account_move_line.py @@ -0,0 +1,29 @@ +from datetime import datetime +from odoo import api, fields, models + +class AccountMoveLine(models.Model): + _inherit = 'account.move.line' + + price_total_pf = fields.Monetary( + string='TotalPF', + compute='_compute_totals', + currency_field='currency_id', + ) + + @api.depends('quantity', 'discount', 'price_unit', 'tax_ids', 'currency_id') + def _compute_totals(self): + super(AccountMoveLine,self)._compute_totals() + for line in self: + line_discount_price_unit = line.price_unit * (1 - (line.discount / 100.0)) + if line.tax_ids.filtered(lambda tax: tax.invisiblePF == False): + taxes_res = line.tax_ids.filtered(lambda tax: tax.invisiblePF == False).compute_all( + line_discount_price_unit, + quantity=line.quantity, + currency=line.currency_id, + product=line.product_id, + partner=line.partner_id, + is_refund=line.is_refund, + ) + line.price_total_pf = taxes_res['total_included'] + else: + line.price_total_pf = line.price_total \ No newline at end of file diff --git a/l10n_ru_doc/models/product.py b/l10n_ru_doc/models/product.py new file mode 100644 index 00000000..c230841c --- /dev/null +++ b/l10n_ru_doc/models/product.py @@ -0,0 +1,5 @@ +from odoo import fields, models + +class ProductTnved(models.Model): + _inherit = 'product.product' + kod_tnved = fields.Char('Код ТНВЭД') diff --git a/l10n_ru_doc/models/res_bank.py b/l10n_ru_doc/models/res_bank.py new file mode 100644 index 00000000..f22d4308 --- /dev/null +++ b/l10n_ru_doc/models/res_bank.py @@ -0,0 +1,19 @@ +from odoo import api, fields, models + +class Bank(models.Model): + _inherit = 'res.bank' + + corr_acc = fields.Char('Corresponding account', size=64) + + +class ResPartnerBank(models.Model): + _inherit = 'res.partner.bank' + + bank_corr_acc = fields.Char('Corresponding account', size=64) + + @api.onchange('bank_id') + def onchange_bank_id(self): + for s in self: + s.bank_name = s.bank_id.name + s.bank_bic = s.bank_id.bic + s.bank_corr_acc = s.bank_id.corr_acc diff --git a/l10n_ru_doc/models/res_company.py b/l10n_ru_doc/models/res_company.py new file mode 100644 index 00000000..9ca4ae72 --- /dev/null +++ b/l10n_ru_doc/models/res_company.py @@ -0,0 +1,18 @@ +from odoo import fields, models + +class Company(models.Model): + _inherit = 'res.company' + + inn = fields.Char(related='partner_id.inn', readonly=False) + kpp = fields.Char(related='partner_id.kpp', readonly=False) + okpo = fields.Char(related='partner_id.okpo', readonly=False) + chief_id = fields.Many2one('res.users', 'Chief') + accountant_id = fields.Many2one('res.users', 'General Accountant') + print_facsimile = fields.Boolean(string='Print Facsimile', + help="Check this for adding Facsimiles of responsible persons to documents.") + print_stamp = fields.Boolean(string='Print Stamp', + help="Check this for adding Stamp of company to documents.") + stamp = fields.Binary("Stamp") + print_anywhere = fields.Boolean(string='Print Anywhere', + help="Uncheck this, if you want add Facsimile and Stamp only in email.", + default=True) diff --git a/l10n_ru_doc/models/res_partner.py b/l10n_ru_doc/models/res_partner.py new file mode 100644 index 00000000..e918a392 --- /dev/null +++ b/l10n_ru_doc/models/res_partner.py @@ -0,0 +1,11 @@ +from odoo import fields, models +class ResPartner(models.Model): + _inherit = 'res.partner' + + inn = fields.Char('INN', related='vat') + kpp = fields.Char('KPP', size=9) + okpo = fields.Char('OKPO', size=14) + ogrn = fields.Char('ОГРН') + type = fields.Selection(selection_add=[('director', 'Директор'), ('accountant', 'Бухгалтер')]) + facsimile = fields.Binary("Подпись") + stamp = fields.Binary("Печать") diff --git a/l10n_ru_doc/models/res_users.py b/l10n_ru_doc/models/res_users.py new file mode 100644 index 00000000..aaf70cba --- /dev/null +++ b/l10n_ru_doc/models/res_users.py @@ -0,0 +1,7 @@ +from odoo import fields, models + +class Users(models.Model): + _inherit = 'res.users' + + print_facsimile = fields.Boolean(related='company_id.print_facsimile') + facsimile = fields.Binary() diff --git a/l10n_ru_doc/models/sale.py b/l10n_ru_doc/models/sale.py new file mode 100644 index 00000000..83008e74 --- /dev/null +++ b/l10n_ru_doc/models/sale.py @@ -0,0 +1,73 @@ +from odoo import models, fields, api +from datetime import datetime +import re +from pytils import numeral, dt +from odoo.tools import pycompat + + +class SaleOrder(models.Model): + _inherit = 'sale.order' + + amount_total_words = fields.Char( + string='Сумма прописью', + compute='_compute_amount_total_words', + store=True + ) + + chief_initials = fields.Char( + string='Инициалы руководителя', + compute='_compute_chief_initials', + store=True + ) + + accountant_initials = fields.Char( + string='Инициалы бухгалтера', + compute='_compute_accountant_initials', + store=True + ) + + @api.depends('company_id.chief_id.name') + def _compute_chief_initials(self): + for order in self: + if order.company_id and order.company_id.chief_id: + order.chief_initials = self._get_initials(order.company_id.chief_id.name) + else: + order.chief_initials = '' + + @api.depends('company_id.accountant_id.name') + def _compute_accountant_initials(self): + for order in self: + if order.company_id and order.company_id.accountant_id: + order.accountant_initials = self._get_initials(order.company_id.accountant_id.name) + else: + order.accountant_initials = '' + + def _get_initials(self, fio): + if fio: + # fio.split()[0] + # [fio[0:1]+'.' for fio in fio.split()[1:]] + return (fio.split()[0] + ' ' + ''.join([part[0:1] + '.' for part in fio.split()[1:]])).strip() + return '' + + @api.depends('amount_total') + def _compute_amount_total_words(self): + for order in self: + if order.amount_total: + order.amount_total_words = self.rubles(order.amount_total) + else: + order.amount_total_words = '' + + def rubles(self, sum_amount): + rub = int(sum_amount) + kop = int(round((sum_amount - rub) * 100)) + + text_rubles = numeral.rubles(rub) + text_copeck = numeral.choose_plural(kop, ("копейка", "копейки", "копеек")) + text_rubles = text_rubles[0].upper() + text_rubles[1:] + + return ("%s %02d %s") % (text_rubles, kop, text_copeck) + + def print_quotation(self): + self.filtered(lambda s: s.state == 'draft').write({'state': 'sent'}) + return self.env['report'].get_action(self, 'l10n_ru_doc.report_order') + diff --git a/l10n_ru_doc/models/tax.py b/l10n_ru_doc/models/tax.py new file mode 100644 index 00000000..081adb1b --- /dev/null +++ b/l10n_ru_doc/models/tax.py @@ -0,0 +1,6 @@ +from odoo import fields, models + +class TaxInherit(models.Model): + _inherit = 'account.tax' + + invisiblePF = fields.Boolean('Не видно в ПФ') diff --git a/l10n_ru_doc/models/uom.py b/l10n_ru_doc/models/uom.py new file mode 100644 index 00000000..1de1e3b7 --- /dev/null +++ b/l10n_ru_doc/models/uom.py @@ -0,0 +1,4 @@ +from odoo import fields, models +class UomInherit(models.Model): + _inherit = 'uom.uom' + kod = fields.Char('Код единицы измерения') diff --git a/l10n_ru_doc/report/__init__.py b/l10n_ru_doc/report/__init__.py new file mode 100644 index 00000000..b058f02e --- /dev/null +++ b/l10n_ru_doc/report/__init__.py @@ -0,0 +1,5 @@ +from . import report_order +from . import report_invoice +from . import report_bill +from . import report_act +from . import report_upd diff --git a/l10n_ru_doc/report/l10n_ru_doc_report.xml b/l10n_ru_doc/report/l10n_ru_doc_report.xml new file mode 100644 index 00000000..fcc29a8e --- /dev/null +++ b/l10n_ru_doc/report/l10n_ru_doc_report.xml @@ -0,0 +1,179 @@ + + + + + A4 + + A4 + 0 + 0 + Portrait + 7 + 7 + 7 + 7 + + 35 + 75 + + + A4 Landscape + + A4 + 0 + 0 + Landscape + 7 + 7 + 7 + 7 + + 75 + 60 + + + + Счет по форме 1С + sale.order + qweb-pdf + l10n_ru_doc.report_order + l10n_ru_doc.report_order + 'Счет - %s ' % ((object.name or '')+' '+(object.partner_id.parent_id.name if object.partner_id.parent_id else object.partner_id.name)) + + + report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Универсальный передаточный документ(УПД) + account.move + qweb-pdf + l10n_ru_doc.report_upd + l10n_ru_doc.report_upd + 'УПД' + + + report + + + + + + + + + + + + + + + + УПД без печатей + account.move + qweb-pdf + l10n_ru_doc.report_updn + l10n_ru_doc.report_updn + 'УПД без печатей' + + + report + + + + + + + + + + + + + + + diff --git a/l10n_ru_doc/report/report_act.py b/l10n_ru_doc/report/report_act.py new file mode 100644 index 00000000..133336e1 --- /dev/null +++ b/l10n_ru_doc/report/report_act.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- + +from odoo import models +from odoo.addons.l10n_ru_doc.report_helper import QWebHelper + +class RuActReport(models.AbstractModel): + _name = 'report.l10n_ru_doc.report_act' + + def _get_report_values(self, docids, data=None): + docs = self.env['account.move'].browse(docids) + return { + 'helper': QWebHelper(), + 'doc_ids': docs.ids, + 'doc_model': 'account.move', + 'docs': docs + } diff --git a/l10n_ru_doc/report/report_act.xml b/l10n_ru_doc/report/report_act.xml new file mode 100644 index 00000000..4af4ce3c --- /dev/null +++ b/l10n_ru_doc/report/report_act.xml @@ -0,0 +1,203 @@ + + + + + + diff --git a/l10n_ru_doc/report/report_bill.py b/l10n_ru_doc/report/report_bill.py new file mode 100644 index 00000000..400d3ad2 --- /dev/null +++ b/l10n_ru_doc/report/report_bill.py @@ -0,0 +1,14 @@ +from odoo import models +from odoo.addons.l10n_ru_doc.report_helper import QWebHelper + +class RuBillReport(models.AbstractModel): + _name = 'report.l10n_ru_doc.report_bill' + + def _get_report_values(self, docids, data=None): + docs = self.env['account.move'].browse(docids) + return { + 'helper': QWebHelper(), + 'doc_ids': docs.ids, + 'doc_model': 'account.move', + 'docs': docs + } diff --git a/l10n_ru_doc/report/report_bill.xml b/l10n_ru_doc/report/report_bill.xml new file mode 100644 index 00000000..c7f55687 --- /dev/null +++ b/l10n_ru_doc/report/report_bill.xml @@ -0,0 +1,758 @@ + + + + + + diff --git a/l10n_ru_doc/report/report_invoice.py b/l10n_ru_doc/report/report_invoice.py new file mode 100644 index 00000000..a71c09a7 --- /dev/null +++ b/l10n_ru_doc/report/report_invoice.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- +from odoo import models +from odoo.addons.l10n_ru_doc.report_helper import QWebHelper +class RuInvoiceReport(models.AbstractModel): + _name = 'report.l10n_ru_doc.report_invoice' + def _get_report_values(self, docids, data=None): + docs = self.env['account.move'].browse(docids) + return { + 'helper': QWebHelper(), + 'doc_ids': docs.ids, + 'doc_model': 'account.move', + 'docs': docs + } diff --git a/l10n_ru_doc/report/report_invoice.xml b/l10n_ru_doc/report/report_invoice.xml new file mode 100644 index 00000000..78b8b213 --- /dev/null +++ b/l10n_ru_doc/report/report_invoice.xml @@ -0,0 +1,329 @@ + + + + + + diff --git a/l10n_ru_doc/report/report_order.py b/l10n_ru_doc/report/report_order.py new file mode 100644 index 00000000..eb94acae --- /dev/null +++ b/l10n_ru_doc/report/report_order.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- +from odoo import models +from odoo.addons.l10n_ru_doc.report_helper import QWebHelper +class RuSaleOrderReport(models.AbstractModel): + _name = 'report.l10n_ru_doc.report_order' + def _get_report_values(self, docids, data=None): + docs = self.env['sale.order'].browse(docids) + return { + 'helper': QWebHelper(), + 'doc_ids': docs.ids, + 'doc_model': 'sale.order', + 'docs': docs + } diff --git a/l10n_ru_doc/report/report_order.xml b/l10n_ru_doc/report/report_order.xml new file mode 100644 index 00000000..e14c07b9 --- /dev/null +++ b/l10n_ru_doc/report/report_order.xml @@ -0,0 +1,336 @@ + + + + + + diff --git a/l10n_ru_doc/report/report_upd.py b/l10n_ru_doc/report/report_upd.py new file mode 100644 index 00000000..1537ba82 --- /dev/null +++ b/l10n_ru_doc/report/report_upd.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from odoo import models +from odoo.addons.l10n_ru_doc.report_helper import QWebHelper + +class RuUpdReport(models.AbstractModel): + _name = 'report.l10n_ru_doc.report_upd' + def _get_report_values(self, docids, data=None): + docs = self.env['account.move'].browse(docids) + return { + 'helper': QWebHelper(), + 'doc_ids': docs.ids, + 'doc_model': 'account.move', + 'docs': docs + } +class RuUpdReportn(models.AbstractModel): + _name = 'report.l10n_ru_doc.report_updn' + def _get_report_values(self, docids, data=None): + docs = self.env['account.move'].browse(docids) + return { + 'helper': QWebHelper(), + 'doc_ids': docs.ids, + 'doc_model': 'account.move', + 'docs': docs + } diff --git a/l10n_ru_doc/report/report_upd.xml b/l10n_ru_doc/report/report_upd.xml new file mode 100644 index 00000000..1825c873 --- /dev/null +++ b/l10n_ru_doc/report/report_upd.xml @@ -0,0 +1,1108 @@ + + + + + + diff --git a/l10n_ru_doc/report/report_updn.xml b/l10n_ru_doc/report/report_updn.xml new file mode 100644 index 00000000..b3013c49 --- /dev/null +++ b/l10n_ru_doc/report/report_updn.xml @@ -0,0 +1,1177 @@ + + + + + + diff --git a/l10n_ru_doc/report_helper.py b/l10n_ru_doc/report_helper.py new file mode 100644 index 00000000..f87c4ccd --- /dev/null +++ b/l10n_ru_doc/report_helper.py @@ -0,0 +1,112 @@ +from datetime import datetime +import re +from pytils import numeral, dt +from odoo.tools import pycompat + + +class QWebHelper(object): + + def img(self, img, type='png', width=0, height=0) : + if width : + width = "width='%spx'"%(width) + else : + width = " " + if height : + height = "height='%spx'"%(height) + else : + height = " " + toreturn = ""%( + width, + height, + type, + str(pycompat.to_text(img))) + return toreturn + + def numer(self, name): + if name: + numeration = re.findall(r'\d+$', name) + if numeration: + return numeration[0] + return '' + + def ru_date(self, date): + if date and date != 'False': + return dt.ru_strftime('"%d" %B %Y года', date=datetime.strptime(str(date), + "%Y-%m-%d"), inflected=True) + return '' + + def ru_date2(self, date): + if date and date != 'False': + return dt.ru_strftime('%d %B %Y г.', date=datetime.strptime(str(date), + "%Y-%m-%d %H:%M:%S"), inflected=True) + return '' + + def in_words(self, number): + return numeral.in_words(number) + + def rubles(self, sum): + text_rubles = numeral.rubles(int(sum)) + copeck = round((sum - int(sum))*100) + text_copeck = numeral.choose_plural(int(copeck), ("копейка", "копейки", "копеек")) + return ("%s %02d %s")%(text_rubles, copeck, text_copeck) + + def initials(self, fio): + if fio: + return (fio.split()[0]+' '+''.join([fio[0:1]+'.' for fio in fio.split()[1:]])).strip() + return '' + + def address(self, partner): + repr = [] + if partner.zip: + repr.append(partner.zip) + if partner.country_id: + repr.append(partner.country_id.name) + if partner.state_id: + repr.append(partner.state_id.name) + if partner.city: + repr.append(partner.city) + if partner.street: + repr.append(partner.street) + if partner.street2: + repr.append(partner.street2) + return ', '.join(repr) + + def representation(self, partner): + repr = [] + if partner.name: + repr.append(partner.name) + if partner.inn: + repr.append("ИНН " + partner.inn) + if partner.kpp: + repr.append("КПП " + partner.kpp) + repr.append(self.address(partner)) + return ', '.join(repr) + + def full_representation(self, partner): + repr = [self.representation(partner)] + if partner.phone: + repr.append("тел.: " + partner.phone) + elif partner.parent_id.phone: + repr.append("тел.: " + partner.parent_id.phone) + bank = None + if partner.bank_ids: + bank = partner.bank_ids[0] + elif partner.parent_id.bank_ids: + bank = partner.parent_id.bank_ids[0] + if bank and bank.acc_number: + repr.append("р/сч " + bank.acc_number) + if bank and bank.bank_name: + repr.append("в банке " + bank.bank_name) + if bank and bank.bank_bic: + repr.append("БИК " + bank.bank_bic) + if bank and bank.bank_corr_acc: + repr.append("к/с " + bank.bank_corr_acc) + return ', '.join(repr) + + def representation_small(self, partner): + repr = [] + if partner.name: + repr.append(partner.name) + + repr.append(self.address(partner)) + return ', '.join(repr) diff --git a/l10n_ru_doc/static/description/docs.png b/l10n_ru_doc/static/description/docs.png new file mode 100644 index 00000000..7cc91a81 Binary files /dev/null and b/l10n_ru_doc/static/description/docs.png differ diff --git a/l10n_ru_doc/static/description/icon.png b/l10n_ru_doc/static/description/icon.png new file mode 100644 index 00000000..5b3a94e5 Binary files /dev/null and b/l10n_ru_doc/static/description/icon.png differ diff --git a/l10n_ru_doc/static/description/index.html b/l10n_ru_doc/static/description/index.html new file mode 100644 index 00000000..d4c9e96d --- /dev/null +++ b/l10n_ru_doc/static/description/index.html @@ -0,0 +1,45 @@ +
+
+

Первичные документы РФ

+
+

+Модуль для печати первичных документов в соответствии с законами РФ. +

+

+Возможности: +

    +
  • Товарная накладная (ТОРГ-12)
  • +
  • Счет на оплату
  • +
  • Счет-фактура
  • +
  • Акт выполненных работ
  • +
  • Вывод подписей и печати
  • +
+

+
+
+
+ +
+
+
+
+ +
+
+

Помощь и поддержка

+
+
+ +
+
+ +
+
\ No newline at end of file diff --git a/l10n_ru_doc/static/description/support.png b/l10n_ru_doc/static/description/support.png new file mode 100644 index 00000000..2805ec72 Binary files /dev/null and b/l10n_ru_doc/static/description/support.png differ diff --git a/l10n_ru_doc/static/description/waybill.png b/l10n_ru_doc/static/description/waybill.png new file mode 100644 index 00000000..8bab6182 Binary files /dev/null and b/l10n_ru_doc/static/description/waybill.png differ diff --git a/l10n_ru_doc/static/src/css/l10n_ru_doc.css b/l10n_ru_doc/static/src/css/l10n_ru_doc.css new file mode 100644 index 00000000..d77b69a6 --- /dev/null +++ b/l10n_ru_doc/static/src/css/l10n_ru_doc.css @@ -0,0 +1,7 @@ +@charset "utf-8"; +.openerp .codup_sign > img { + width: 235px; + height: 65px; + max-width: 235px; + max-height: 65px; +} \ No newline at end of file diff --git a/l10n_ru_doc/static/src/docx/report_account_invoice_act_new_templates.docx b/l10n_ru_doc/static/src/docx/report_account_invoice_act_new_templates.docx new file mode 100644 index 00000000..4c34f8c6 Binary files /dev/null and b/l10n_ru_doc/static/src/docx/report_account_invoice_act_new_templates.docx differ diff --git a/l10n_ru_doc/static/src/docx/report_account_invoice_bill_new_templates.docx b/l10n_ru_doc/static/src/docx/report_account_invoice_bill_new_templates.docx new file mode 100644 index 00000000..5a873a7b Binary files /dev/null and b/l10n_ru_doc/static/src/docx/report_account_invoice_bill_new_templates.docx differ diff --git a/l10n_ru_doc/static/src/docx/report_account_invoice_upd_new_templates.docx b/l10n_ru_doc/static/src/docx/report_account_invoice_upd_new_templates.docx new file mode 100644 index 00000000..e10546c9 Binary files /dev/null and b/l10n_ru_doc/static/src/docx/report_account_invoice_upd_new_templates.docx differ diff --git a/l10n_ru_doc/static/src/docx/report_account_invoice_updn_templates.docx b/l10n_ru_doc/static/src/docx/report_account_invoice_updn_templates.docx new file mode 100644 index 00000000..4f57a564 Binary files /dev/null and b/l10n_ru_doc/static/src/docx/report_account_invoice_updn_templates.docx differ diff --git a/l10n_ru_doc/static/src/docx/report_account_invoices_new_templates.docx b/l10n_ru_doc/static/src/docx/report_account_invoices_new_templates.docx new file mode 100644 index 00000000..fab65eb4 Binary files /dev/null and b/l10n_ru_doc/static/src/docx/report_account_invoices_new_templates.docx differ diff --git a/l10n_ru_doc/static/src/docx/report_saleorder_new_template.docx b/l10n_ru_doc/static/src/docx/report_saleorder_new_template.docx new file mode 100644 index 00000000..7414c772 Binary files /dev/null and b/l10n_ru_doc/static/src/docx/report_saleorder_new_template.docx differ diff --git a/l10n_ru_doc/tests/__init__.py b/l10n_ru_doc/tests/__init__.py new file mode 100644 index 00000000..cc89eaf6 --- /dev/null +++ b/l10n_ru_doc/tests/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import test_ru_doc diff --git a/l10n_ru_doc/tests/test_ru_doc.py b/l10n_ru_doc/tests/test_ru_doc.py new file mode 100644 index 00000000..6c3c233d --- /dev/null +++ b/l10n_ru_doc/tests/test_ru_doc.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- +""" +Tests for l10n_ru_doc report generation. + +Validates: Requirement 12.1 +""" +from odoo.tests.common import TransactionCase +from odoo.tests import tagged + + +def _make_out_invoice(env): + """Create a minimal out_invoice account.move for report testing.""" + partner = env['res.partner'].search([('is_company', '=', True)], limit=1) + if not partner: + partner = env['res.partner'].create({'name': 'Test Partner RU', 'is_company': True}) + + journal = env['account.journal'].search( + [('type', '=', 'sale'), ('company_id', '=', env.company.id)], limit=1 + ) + if not journal: + journal = env['account.journal'].create({ + 'name': 'Test Sales Journal', + 'type': 'sale', + 'code': 'TSALE', + }) + + move = env['account.move'].create({ + 'move_type': 'out_invoice', + 'partner_id': partner.id, + 'journal_id': journal.id, + 'invoice_date': '2024-01-15', + }) + return move + + +@tagged('post_install', '-at_install') +class TestRuDoc(TransactionCase): + """ + Validates: Requirement 12.1 — ТОРГ-12 report generation for out_invoice + returns non-empty binary content without exceptions. + """ + + def setUp(self): + super().setUp() + self.invoice = _make_out_invoice(self.env) + + def test_torg12_report_values_no_exception(self): + """ + Req 12.1 — calling _get_report_values on the ТОРГ-12 report model + for an out_invoice returns a non-empty dict without exceptions. + """ + report_model = self.env['report.l10n_ru_doc.report_bill'] + result = report_model._get_report_values([self.invoice.id]) + self.assertIsInstance(result, dict, "Report values should be a dict") + self.assertIn('docs', result, "Report values should contain 'docs' key") + self.assertTrue(result['docs'], "Report docs should be non-empty") + + def test_torg12_html_render_returns_binary_content(self): + """ + Req 12.1 — rendering the ТОРГ-12 QWeb template for an out_invoice + returns non-empty binary content without exceptions. + """ + html_content, content_type = self.env['ir.actions.report']._render_qweb_html( + 'l10n_ru_doc.report_bill', [self.invoice.id] + ) + self.assertTrue(html_content, "ТОРГ-12 HTML render should return non-empty binary content") + self.assertIsInstance(html_content, bytes, "Rendered content should be bytes") + self.assertGreater(len(html_content), 0, "Rendered content should have non-zero length") + + def test_torg12_report_values_contains_helper(self): + """ + Req 12.1 — report values include the QWebHelper instance for formatting. + """ + report_model = self.env['report.l10n_ru_doc.report_bill'] + result = report_model._get_report_values([self.invoice.id]) + self.assertIn('helper', result, "Report values should contain 'helper' key") + self.assertIsNotNone(result['helper'], "Helper should not be None") diff --git a/l10n_ru_doc/views/account_invoice_view.xml b/l10n_ru_doc/views/account_invoice_view.xml new file mode 100644 index 00000000..891dcc15 --- /dev/null +++ b/l10n_ru_doc/views/account_invoice_view.xml @@ -0,0 +1,36 @@ + + + + + + account.invoice.ru.form + account.move + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/l10n_ru_doc/views/l10n_ru_doc_data.xml b/l10n_ru_doc/views/l10n_ru_doc_data.xml new file mode 100644 index 00000000..169bcd74 --- /dev/null +++ b/l10n_ru_doc/views/l10n_ru_doc_data.xml @@ -0,0 +1,14 @@ + + + + + + + 1 + + + + + + + diff --git a/l10n_ru_doc/views/product.xml b/l10n_ru_doc/views/product.xml new file mode 100644 index 00000000..7fea41d1 --- /dev/null +++ b/l10n_ru_doc/views/product.xml @@ -0,0 +1,16 @@ + + + + + tnved_product + product.product + + + + + + + + + + diff --git a/l10n_ru_doc/views/res_bank_view.xml b/l10n_ru_doc/views/res_bank_view.xml new file mode 100644 index 00000000..7468aac3 --- /dev/null +++ b/l10n_ru_doc/views/res_bank_view.xml @@ -0,0 +1,18 @@ + + + + + + res.bank.ru.form + res.bank + form + + + + + + + + + + diff --git a/l10n_ru_doc/views/res_company_view.xml b/l10n_ru_doc/views/res_company_view.xml new file mode 100644 index 00000000..bb56f295 --- /dev/null +++ b/l10n_ru_doc/views/res_company_view.xml @@ -0,0 +1,42 @@ + + + + + + res.companyruform + res.company + + + + + + + + + + ИНН + + + ОГРН + + + + + + + + + + + + + + + + + + + + + + diff --git a/l10n_ru_doc/views/res_partner_view.xml b/l10n_ru_doc/views/res_partner_view.xml new file mode 100644 index 00000000..2e0c2fcd --- /dev/null +++ b/l10n_ru_doc/views/res_partner_view.xml @@ -0,0 +1,36 @@ + + + + + + res.partner.ru.form + res.partner + + + + + + + + + + ИНН + + + + + + + + + + + + + + + + + + + diff --git a/l10n_ru_doc/views/res_users_view.xml b/l10n_ru_doc/views/res_users_view.xml new file mode 100644 index 00000000..e26c3a16 --- /dev/null +++ b/l10n_ru_doc/views/res_users_view.xml @@ -0,0 +1,33 @@ + + + + + + res.users.signature.form + res.users + + + + + + + + + + + + res.users.simple.form + res.users + + + + + + + + + + + + + diff --git a/l10n_ru_doc/views/tax.xml b/l10n_ru_doc/views/tax.xml new file mode 100644 index 00000000..3cefac62 --- /dev/null +++ b/l10n_ru_doc/views/tax.xml @@ -0,0 +1,17 @@ + + + + + view_taxiher_form + account.tax + + + + + + + + + + + diff --git a/l10n_ru_doc/views/uom.xml b/l10n_ru_doc/views/uom.xml new file mode 100644 index 00000000..d502879f --- /dev/null +++ b/l10n_ru_doc/views/uom.xml @@ -0,0 +1,16 @@ + + + + + view_uomiher_form + uom.uom + + + + + + + + + + diff --git a/l10n_ru_upd_xml/README.md b/l10n_ru_upd_xml/README.md new file mode 100644 index 00000000..4f5cc452 --- /dev/null +++ b/l10n_ru_upd_xml/README.md @@ -0,0 +1,9 @@ +# Российская локализация - УПД в xml-формате +name: l10n_ru_upd_xml + +## Описание +Формирует универсальный передаточный документ в формате XML. + +###Для печати: +1. Меню Бухгалтерия - Клиенты - Счета (account.move); +2. Кнопка "Печать УПД в xml-формате". diff --git a/l10n_ru_upd_xml/__init__.py b/l10n_ru_upd_xml/__init__.py new file mode 100644 index 00000000..9a4992b8 --- /dev/null +++ b/l10n_ru_upd_xml/__init__.py @@ -0,0 +1,3 @@ +from . import controllers +from . import models +from . import reports diff --git a/l10n_ru_upd_xml/__manifest__.py b/l10n_ru_upd_xml/__manifest__.py new file mode 100644 index 00000000..e1ee6654 --- /dev/null +++ b/l10n_ru_upd_xml/__manifest__.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +{ + 'name': "Российская локализация - УПД в xml-формате", + + 'summary': """ + Формирует УПД в формате XML, формат 5.01""", + + 'description': """ + Формирует УПД в формате XML. + + Для печати: + 1. Меню Бухгалтерия - Клиенты - Счета (account.move); + 2. Кнопка "Печать УПД в xml-формате". + """, + + 'author': "MK.Lab", + 'website': "https://www.inf-centre.ru/", + + 'category': 'Uncategorized', + 'version': '19.0.2025.12.11', + "depends": ["web", "base", "account", "account_payment", "l10n_ru_doc", "l10n_ru_base", "uom"], + "data": [ + "views/ir_actions_report_view.xml", + "views/res_partner_view.xml", + "views/res_company_view.xml", + "views/res_users_view.xml", + "views/views_uom_okei.xml", + "views/view_account_move.xml", + "reports/report.xml", + "reports/upd_report.xml", + ], + + "assets": { + "web.assets_backend": [ + "l10n_ru_upd_xml/static/src/js/report/action_manager_report.js", + ], + }, + + "external_dependencies": { + "python": [ + "lxml" + ] + }, + "demo": [ + "demo/demo.xml", + ], +} diff --git a/l10n_ru_upd_xml/controllers/__init__.py b/l10n_ru_upd_xml/controllers/__init__.py new file mode 100644 index 00000000..65a8c120 --- /dev/null +++ b/l10n_ru_upd_xml/controllers/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import main diff --git a/l10n_ru_upd_xml/controllers/main.py b/l10n_ru_upd_xml/controllers/main.py new file mode 100644 index 00000000..d5e9a658 --- /dev/null +++ b/l10n_ru_upd_xml/controllers/main.py @@ -0,0 +1,91 @@ +# Copyright (C) 2014-2015 Grupo ESOC +# License AGPL-3.0 or later (https://www.gnuorg/licenses/agpl.html). + +import json +import logging + +from werkzeug.urls import url_parse + +from odoo.http import content_disposition, request, route, serialize_exception +from odoo.tools import html_escape +from odoo.tools.safe_eval import safe_eval, time + +from odoo.addons.web.controllers import report + +_logger = logging.getLogger(__name__) + + +class ReportController(report.ReportController): + @route() + def report_routes( + self, reportname, docids=None, converter=None, options=None, **kwargs + ): + if converter != "xml": + return super().report_routes( + reportname, + docids=docids, + converter=converter, + options=options, + **kwargs, + ) + if docids: + docids = [int(_id) for _id in docids.split(",")] + data = {**json.loads(options or "{}"), **kwargs} + context = dict(request.env.context) + if "context" in data: + data["context"] = json.loads(data["context"] or "{}") + # Ignore 'lang' here, because the context in data is the one from the + # webclient *but* if the user explicitely wants to change the lang, this + # mechanism overwrites it. + if "lang" in data["context"]: + del data["context"]["lang"] + context.update(data["context"]) + report_Obj = request.env["ir.actions.report"] + xml = report_Obj.with_context(**context)._render_qweb_xml( + reportname, docids, data=data + )[0] + xmlhttpheaders = [("Content-Type", "text/xml"), ("Content-Length", len(xml))] + return request.make_response(xml, headers=xmlhttpheaders) + + @route() + def report_download(self, data, context=None, token=None): + requestcontent = json.loads(data) + url, report_type = requestcontent[0], requestcontent[1] + reportname = "???" + if report_type != "qweb-xml": + return super().report_download(data, context=context, token=token) + try: + reportname = url.split("/report/xml/")[1].split("?")[0] + docids = None + if "/" in reportname: + reportname, docids = reportname.split("/") + report = request.env["ir.actions.report"]._get_report_from_name(reportname) + filename = None + if docids: + response = self.report_routes( + reportname, docids=docids, converter="xml", context=context + ) + ids = [int(x) for x in docids.split(",")] + obj = request.env[report.model].browse(ids) + if report.print_report_name and not len(obj) > 1: + report_name = safe_eval( + report.print_report_name, {"object": obj, "time": time} + ) + filename = f"{report_name}.{report.xml_extension}" + else: + data = url_parse(url).decode_query(cls=dict) + if "context" in data: + context = json.loads(context or "{}") + data_context = json.loads(data.pop("context")) + context = json.dumps({**context, **data_context}) + response = self.report_routes( + reportname, converter="xml", context=context, **data + ) + filename = filename or f"{report.name}.{report.xml_extension}" + response.headers.add("Content-Disposition", content_disposition(filename)) + return response + except Exception as e: + _logger.exception(f"Error while generating report {reportname}") + se = serialize_exception(e) + error = {"code": 200, "message": "Odoo Server Error", "data": se} + return request.make_response(html_escape(json.dumps(error))) diff --git a/l10n_ru_upd_xml/demo/demo.xml b/l10n_ru_upd_xml/demo/demo.xml new file mode 100644 index 00000000..6b456569 --- /dev/null +++ b/l10n_ru_upd_xml/demo/demo.xml @@ -0,0 +1,11 @@ + + + + + + + 796 + + + + diff --git a/l10n_ru_upd_xml/models/__init__.py b/l10n_ru_upd_xml/models/__init__.py new file mode 100644 index 00000000..b1c835fc --- /dev/null +++ b/l10n_ru_upd_xml/models/__init__.py @@ -0,0 +1,7 @@ +from . import ir_actions_report +from . import res_company +from . import res_partner +from . import res_users +from . import uom_uom +from . import account_move +from . import account_move_line diff --git a/l10n_ru_upd_xml/models/account_move.py b/l10n_ru_upd_xml/models/account_move.py new file mode 100644 index 00000000..d7aae5c3 --- /dev/null +++ b/l10n_ru_upd_xml/models/account_move.py @@ -0,0 +1,207 @@ +from odoo import api, fields, models, _ +import hashlib +from odoo.exceptions import UserError + + +class AccountMove(models.Model): + _inherit = 'account.move' + + edi = fields.Char(string=_('ID EDI'), compute='_compute_sh1_edi') + kpp = fields.Char(string=_('КПП'), compute='_compute_get_kpp') + + def _compute_get_kpp(self): + for s in self: + pid = self.partner_id.parent_id or self.partner_id + + s.kpp = pid.kpp if (s.partner_id == s.partner_shipping_id or not s.partner_shipping_id) else s.partner_shipping_id.kpp + + @api.depends('name') + def _compute_sh1_edi(self): + hash_object = hashlib.sha1((self.name).encode('utf-8')) + pid = self.partner_id.parent_id or self.partner_id + self.edi = 'ON_NSCHFDOPPR_2BM-' + str(pid.edi) + '_' + str(self.company_id.edi) + '_' + hash_object.hexdigest() + + def print_upd(self): + for s in self: + mes = str(s.check_correct_upd()).strip() + if mes != "": + raise UserError(_(u"Не удалось сформировать УПД. Выявлены следующие ошибки:\n{}".format(mes))) + else: + return self.env.ref('l10n_ru_upd_xml.upd_xml_report').sudo().report_action(s.id) # render_qweb_xml(s.id) + + def check_correct_upd(self, manually=True): + for s in self: + mes = "" + company = s.company_id + if s.name == '/': + mes += u"Отсутствует наименование документа. Проверидите документ, чтобы назваие сформировалось автоматически.\n" + if not s.only_service and s.get_delivery_doc_name() == '0': + mes += u"Отсутствуют связанные отгрузки.\n" + if not company: + company = self.env.company + if not company: + mes += u"Не указана компания.\n" + else: + if not company.edi: + mes += u"Не указан идентификатор компании для Diadoc.\n" + if not company.name: + mes += u"Не указано наименование компании.\n" + if not company.okpo: + mes += u"Не указано ОКПО компании.\n" + if not company.inn: + mes += u"Не указан ИНН компании.\n" + else: + if len(company.inn) == 12: + if not company.partner_id.last_name_IP: + mes += u"Не указана фамилия ИП для вашей компании.\n" + if not company.partner_id.first_name_IP: + mes += u"Не указано имя ИП для вашей компании.\n" + if not company.partner_id.middle_name_IP: + mes += u"Не указано отчество ИП для вашей компании.\n" + elif len(company.inn) == 10: + if not company.kpp: + mes += u"Не указан КПП компании.\n" + else: + mes += u"Некорректный ИНН компании.\n" + if not company.city: + mes += u"Не указан город компании.\n" + if not company.street: + mes += u"Не указан адрес компании.\n" + if not company.chief_id: + mes += u"Не указан руководитель компании.\n" + else: + if not company.chief_id.function: + mes += u"Не указана должность руководителя компании.\n" + if not company.chief_id.last_name: + mes += u"Не указана фамилия руководителя компании.\n" + if not company.chief_id.first_name: + mes += u"Не указано имя руководителя компании.\n" + if not company.chief_id.second_name: + mes += u"Не указано отчество руководителя компании.\n" + pid = s.partner_id.parent_id + if not pid: + pid = s.partner_id + if not pid: + mes += u"Не указан контрагент.\n" + else: + if not pid.edi: + mes += u"Не указан идентификатор контрагента для Diadoc.\n" + if not pid.name: + mes += u"Не указано наименование контрагента.\n" + if not pid.okpo: + mes += u"Не указано ОКПО контрагента.\n" + if not pid.inn: + mes += u"Не указан ИНН контрагента.\n" + else: + if len(pid.inn) == 12: + if not pid.last_name_IP: + mes += u"Не указана фамилия ИП для контрагента.\n" + if not pid.first_name_IP: + mes += u"Не указано имя ИП для контрагента.\n" + if not pid.middle_name_IP: + mes += u"Не указано отчество ИП для контрагента.\n" + elif len(pid.inn) == 10: + if not pid.kpp: + mes += u"Не указан КПП контрагента.\n" + else: + mes += u"Некорректный ИНН контрагента.\n" + if not pid.city: + mes += u"Не указан город контрагента.\n" + if not pid.street: + mes += u"Не указан адрес контрагента.\n" + if manually: + if not s.edi: + mes += u"Не указан идентификатор документа для Diadoc.\n" + if not s.name: + mes += u"Не указано наименование документа\n" + if not s.invoice_date: + mes += u"Не указана дата документа\n" + if not s.only_service: + gruzootpr = s.gruzootpr + if not gruzootpr: + gruzootpr = pid + if gruzootpr.parent_id: + gruzootpr = gruzootpr.parent_id + if not gruzootpr: + mes += u"Не указан грузоотправитель.\n" + else: + if not gruzootpr.name: + mes += u"Не указано наименование грузоотправителя.\n" + if not gruzootpr.okpo: + mes += u"Не указано ОКПО грузоотправителя.\n" + if not gruzootpr.inn: + mes += u"Не указан ИНН грузоотправителя.\n" + else: + if len(gruzootpr.inn) == 12: + if not gruzootpr.last_name_IP: + mes += u"Не указана фамилия ИП для грузоотправителя.\n" + if not gruzootpr.first_name_IP: + mes += u"Не указано имя ИП для грузоотправителя.\n" + if not gruzootpr.middle_name_IP: + mes += u"Не указано отчество ИП для грузоотправителя.\n" + elif len(gruzootpr.inn) == 10: + if not gruzootpr.kpp: + mes += u"Не указан КПП грузоотправителя.\n" + else: + mes += u"Некорректный ИНН грузоотправителя.\n" + if not gruzootpr.city: + mes += u"Не указан город грузоотправителя.\n" + if not gruzootpr.street: + mes += u"Не указан адрес грузоотправителя.\n" + gruzopol = s.gruzopol + if not gruzopol: + gruzopol = pid + if gruzopol.parent_id: + gruzopol = gruzopol.parent_id + if not gruzopol: + mes += u"Не указан грузополучатель.\n" + else: + if not gruzopol.name: + mes += u"Не указано наименование грузополучателя.\n" + if not gruzopol.okpo: + mes += u"Не указано ОКПО грузополучателя.\n" + if not gruzopol.inn: + mes += u"Не указан ИНН грузополучателя.\n" + else: + if len(gruzopol.inn) == 12: + if not gruzopol.last_name_IP: + mes += u"Не указана фамилия ИП для грузополучателя.\n" + if not gruzopol.first_name_IP: + mes += u"Не указано имя ИП для грузополучателя.\n" + if not gruzopol.middle_name_IP: + mes += u"Не указано отчество ИП для грузополучателя.\n" + elif len(gruzopol.inn) == 10: + if not gruzopol.kpp: + mes += u"Не указан КПП грузополучателя.\n" + else: + mes += u"Некорректный ИНН грузополучателя.\n" + if not gruzopol.city: + mes += u"Не указан город грузополучателя.\n" + if not gruzopol.street: + mes += u"Не указан адрес грузополучателя.\n" + if s.payment_num: + if not s.payment_date: + mes += u"Не указана дата платежки в УПД.\n" + if not s.invoice_line_ids: + mes += u"Отсутствуют строки заказа.\n" + else: + for line in s.invoice_line_ids: + if not line.price_unit: + mes += u"Не указана цена за единицу для товара {}.\n".format(line.name) + if not line.quantity: + mes += u"Не указано количество для товара {}.\n".format(line.name) + if not line.product_uom_id.okei: + mes += u"Не указан код ОКЕИ для единицы измерения {}.\n".format(line.product_uom_id.name) + if not s.mt_contract_id: + mes += u"Не указан договор.\n" + else: + if not s.mt_contract_id.name: + mes += u"Не указано наименование договора.\n" + if not s.mt_contract_id.date_start: + mes += u"Не указана дата договора.\n" + if not s.kladov: + mes += u"Не указано лицо, ответственное за передачу товаров/услуг.\n" + else: + if not s.kladov.partner_id.function: + mes += u"Не указана должность лица, ответственного за передачу товаров/услуг.\n" + return str(mes) diff --git a/l10n_ru_upd_xml/models/account_move_line.py b/l10n_ru_upd_xml/models/account_move_line.py new file mode 100644 index 00000000..ae892d1e --- /dev/null +++ b/l10n_ru_upd_xml/models/account_move_line.py @@ -0,0 +1,7 @@ +from odoo import models, fields, api, _ + + +class AccountMoveLine(models.Model): + _inherit = "account.move.line" + + uom_okei = fields.Char(string=_('Код ОКЕИ'), related='product_uom_id.okei') diff --git a/l10n_ru_upd_xml/models/ir_actions_report.py b/l10n_ru_upd_xml/models/ir_actions_report.py new file mode 100644 index 00000000..8ba5d600 --- /dev/null +++ b/l10n_ru_upd_xml/models/ir_actions_report.py @@ -0,0 +1,62 @@ +from odoo import fields, models, api + + +class IrActionsReport(models.Model): + _inherit = "ir.actions.report" + + report_type = fields.Selection( + selection_add=[("qweb-xml", "XML")], ondelete={"qweb-xml": "set default"} + ) + xsd_schema = fields.Binary( + string="XSD Validation Schema", + attachment=True, + help="File with XSD Schema for checking content of result report. Can be empty " + "if validation is not required.", + ) + xml_encoding = fields.Selection( + selection=[ + ("WINDOWS-1251", "WINDOWS-1251") # will be used as default even if nothing is selected + ], + string="XML Encoding", + help=( + "Encoding for XML reports. If nothing is selected, " + "then UTF-8 will be applied." + ), + ) + xml_declaration = fields.Boolean( + string="XML Declaration", + help=( + """Add `` at the start """ + """of final report file.""" + ), + default=True, + ) + xml_extension = fields.Char( + default="xml", + help="Extension for XML Reports, by default is `xml`", + ) + + @api.model + def _render_qweb_xml(self, report_ref, res_ids, data=None): + """ + Call `generate_report` method of report abstract class + `report.` or of standard class for XML report + rendering - `report.report_xml.abstract` + + Args: + * docids(list) - IDs of instances for those report will be generated + * data(dict, None) - variables for report rendering + + Returns: + * str - result content of report + * str - type of result content + """ + report = self._get_report(report_ref) + report_model = self.env.get( + f"report.{report.report_name}", self.env["report.upd_xml.abstract"] + ) + return report_model.generate_report( + ir_report=report, # will be used to get settings of report + docids=res_ids, + data=data or {}, + ) diff --git a/l10n_ru_upd_xml/models/res_company.py b/l10n_ru_upd_xml/models/res_company.py new file mode 100644 index 00000000..91619d64 --- /dev/null +++ b/l10n_ru_upd_xml/models/res_company.py @@ -0,0 +1,11 @@ +from odoo import fields, models, _ + + +class ResCompany(models.Model): + _inherit = 'res.company' + + inn = fields.Char(related='partner_id.inn', readonly=False, string=_('ИНН')) + kpp = fields.Char(related='partner_id.kpp', readonly=False, string=_('КПП')) + okpo = fields.Char(related='partner_id.okpo', readonly=False, string=_('ОКПО')) + edi = fields.Char(string='ID EDI', readonly=False) + chief_id = fields.Many2one('res.users', string=_('Управляющий')) diff --git a/l10n_ru_upd_xml/models/res_partner.py b/l10n_ru_upd_xml/models/res_partner.py new file mode 100644 index 00000000..4dbf28b4 --- /dev/null +++ b/l10n_ru_upd_xml/models/res_partner.py @@ -0,0 +1,36 @@ +from odoo import api, fields, models, _ + +class ResPartner(models.Model): + _inherit = 'res.partner' + + inn = fields.Char(_('ИНН'), size=12) + kpp = fields.Char(_('КПП'), size=9) + okpo = fields.Char(_('ОКПО'), size=14) + edi = fields.Char(_('ID EDI')) + house = fields.Char(_('Дом')) + office = fields.Char(_('Квартира, офис')) + fias_id = fields.Char(_('Код ФИАС')) + last_name_IP = fields.Char(_('Фамилия ИП'), compute='_compute_get_fio', readonly=False) + first_name_IP = fields.Char(_('Имя ИП'), compute='_compute_get_fio', readonly=False) + middle_name_IP = fields.Char(_('Отчество ИП'), compute='_compute_get_fio', readonly=False) + + @api.depends('name') + def _compute_get_fio(self): + for s in self: + if s.name: + name = s.name + if name.find('ИП ') != -1: + name = name[name.find(' ') + 1:] + s.last_name_IP = name[:name.find(' ')] + name = name[name.find(' ') + 1:] + s.first_name_IP = name[:name.find(' ')] + name = name[name.find(' ') + 1:] + s.middle_name_IP = name + else: + s.last_name_IP = "" + s.first_name_IP = "" + s.middle_name_IP = "" + else: + s.last_name_IP = "" + s.first_name_IP = "" + s.middle_name_IP = "" diff --git a/l10n_ru_upd_xml/models/res_users.py b/l10n_ru_upd_xml/models/res_users.py new file mode 100644 index 00000000..4ac723bf --- /dev/null +++ b/l10n_ru_upd_xml/models/res_users.py @@ -0,0 +1,25 @@ +from odoo import api, fields, models, _ + +class ResUsers(models.Model): + _inherit = 'res.users' + + last_name = fields.Char(string=_('Фамилия'), compute='_compute_update_name') + first_name = fields.Char(string=_('Имя'), compute='_compute_update_name') + second_name = fields.Char(string=_('Отчество'), compute='_compute_update_name') + + @api.depends('name') + def _compute_update_name(self): + for s in self: + s.last_name = '' + s.first_name = '' + s.second_name = '' + if s.name: + s.last_name = s.name + s.first_name = '' + s.second_name = '' + if len(s.name.split(' ')) == 3: + s.last_name, s.first_name, s.second_name = s.name.split(' ') + if len(s.name.split(' ')) == 4: + s.last_name, s.first_name, second_name1, second_name2 = s.name.split(' ') + s.second_name = second_name1 + ' ' + second_name2 + diff --git a/l10n_ru_upd_xml/models/uom_uom.py b/l10n_ru_upd_xml/models/uom_uom.py new file mode 100644 index 00000000..88cd122f --- /dev/null +++ b/l10n_ru_upd_xml/models/uom_uom.py @@ -0,0 +1,7 @@ +from odoo import fields, models, _ + + +class UomUom(models.Model): + _inherit = "uom.uom" + + okei = fields.Char(string="Код ОКЕИ") diff --git a/l10n_ru_upd_xml/reports/__init__.py b/l10n_ru_upd_xml/reports/__init__.py new file mode 100644 index 00000000..fff0f44d --- /dev/null +++ b/l10n_ru_upd_xml/reports/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnuorg/licenses/agpl.html). + +from . import report_report_xml_abstract diff --git a/l10n_ru_upd_xml/reports/demo_report.xml b/l10n_ru_upd_xml/reports/demo_report.xml new file mode 100644 index 00000000..5eae7775 --- /dev/null +++ b/l10n_ru_upd_xml/reports/demo_report.xml @@ -0,0 +1,76 @@ + + + + diff --git a/l10n_ru_upd_xml/reports/report.xml b/l10n_ru_upd_xml/reports/report.xml new file mode 100644 index 00000000..e6c6fcf5 --- /dev/null +++ b/l10n_ru_upd_xml/reports/report.xml @@ -0,0 +1,14 @@ + + + + + УПД xml + account.move + qweb-xml + l10n_ru_upd_xml.demo_report_xml_view + l10n_ru_upd_xml.demo_report_xml_view + '%s' % (object.edi) + + report + + diff --git a/l10n_ru_upd_xml/reports/report_report_xml_abstract.py b/l10n_ru_upd_xml/reports/report_report_xml_abstract.py new file mode 100644 index 00000000..71e8e32d --- /dev/null +++ b/l10n_ru_upd_xml/reports/report_report_xml_abstract.py @@ -0,0 +1,177 @@ +# License AGPL-3.0 or later (https://www.gnuorg/licenses/agpl.html). + +from xml.dom import minidom +from odoo.exceptions import UserError +from odoo.tools.translate import _ +from lxml import etree + +from odoo import api, models + + +class ReportXmlAbstract(models.AbstractModel): + _name = "report.upd_xml.abstract" + _description = "Abstract XML Report" + + @api.model + def generate_report(self, ir_report, docids, data=None): + data = data or {} + data.setdefault("report_type", "text") + + records = self.env[ir_report.model].browse(docids) + + for s in records: + mes = "" + company = s.company_id or self.env.company + + # --- базовые проверки --- + if s.name == '/': + mes += "Отсутствует наименование документа. Проведите документ.\n" + + if not s.only_service: + get_delivery = getattr(s, "get_delivery_doc_name", lambda: '0') + if get_delivery() == '0': + mes += "Отсутствуют связанные отгрузки.\n" + + # --- компания --- + if not company: + mes += "Не указана компания.\n" + else: + if not company.edi: + mes += "Не указан идентификатор компании для Diadoc.\n" + if not company.name: + mes += "Не указано наименование компании.\n" + if not company.okpo: + mes += "Не указано ОКПО компании.\n" + + if not company.inn: + mes += "Не указан ИНН компании.\n" + else: + if len(company.inn) == 12: + if not company.partner_id.last_name_IP: + mes += "Не указана фамилия ИП компании.\n" + if not company.partner_id.first_name_IP: + mes += "Не указано имя ИП компании.\n" + if not company.partner_id.middle_name_IP: + mes += "Не указано отчество ИП компании.\n" + elif len(company.inn) == 10: + if not company.kpp: + mes += "Не указан КПП компании.\n" + else: + mes += "Некорректный ИНН компании.\n" + + if not company.city: + mes += "Не указан город компании.\n" + if not company.street: + mes += "Не указан адрес компании.\n" + + if not company.chief_id: + mes += "Не указан руководитель компании.\n" + else: + if not company.chief_id.function: + mes += "Не указана должность руководителя.\n" + if not company.chief_id.last_name: + mes += "Не указана фамилия руководителя.\n" + if not company.chief_id.first_name: + mes += "Не указано имя руководителя.\n" + if not company.chief_id.second_name: + mes += "Не указано отчество руководителя.\n" + + # --- контрагент --- + pid = s.partner_id.parent_id or s.partner_id + + if not pid: + mes += "Не указан контрагент.\n" + else: + if not pid.edi: + mes += "Не указан идентификатор контрагента.\n" + if not pid.name: + mes += "Не указано наименование контрагента.\n" + if not pid.okpo: + mes += "Не указано ОКПО контрагента.\n" + + if not pid.inn: + mes += "Не указан ИНН контрагента.\n" + else: + if len(pid.inn) == 12: + if not pid.last_name_IP: + mes += "Не указана фамилия ИП контрагента.\n" + if not pid.first_name_IP: + mes += "Не указано имя ИП контрагента.\n" + if not pid.middle_name_IP: + mes += "Не указано отчество ИП контрагента.\n" + elif len(pid.inn) == 10: + if not pid.kpp: + mes += "Не указан КПП контрагента.\n" + else: + mes += "Некорректный ИНН контрагента.\n" + + if not pid.city: + mes += "Не указан город контрагента.\n" + if not pid.street: + mes += "Не указан адрес контрагента.\n" + + # --- документ --- + if not s.edi: + mes += "Не указан идентификатор документа.\n" + if not s.name: + mes += "Не указано наименование документа.\n" + if not s.invoice_date: + mes += "Не указана дата документа.\n" + + # --- строки --- + if not s.invoice_line_ids: + mes += "Отсутствуют строки.\n" + else: + for line in s.invoice_line_ids: + if not line.price_unit: + mes += f"Нет цены: {line.name}\n" + if not line.quantity: + mes += f"Нет количества: {line.name}\n" + if not line.product_uom_id.okei: + mes += f"Нет ОКЕИ: {line.product_uom_id.name}\n" + + # --- договор --- + # if not s.mt_contract_id: + # mes += "Не указан договор.\n" + # else: + # if not s.mt_contract_id.name: + # mes += "Нет названия договора.\n" + # if not s.mt_contract_id.date_start: + # mes += "Нет даты договора.\n" + + # --- ответственный --- + if not s.kladov: + mes += "Не указано ответственное лицо.\n" + else: + if not s.kladov.partner_id.function: + mes += "Не указана должность ответственного.\n" + + # ❗ если есть ошибки → стоп + if mes: + raise UserError(_( + "Не удалось сформировать УПД. Выявлены следующие ошибки:\n%s" + ) % mes) + + data = ir_report._get_rendering_context(ir_report, docids, data) + + result_bin = ir_report._render_template(ir_report.report_name, data) + + parsed_result_bin = minidom.parseString(result_bin) + result = parsed_result_bin.toprettyxml(indent=" ") + + result = "\n".join( + line for line in result.splitlines() if line and not line.isspace() + ).encode("utf8") + + content = etree.tostring( + etree.fromstring(result), + encoding=ir_report.xml_encoding or "WINDOWS-1251", + xml_declaration=True, + pretty_print=True, + ) + + return content, "xml" + + @api.model + def _get_report_values(self, docids, data=None): + return data or {} diff --git a/l10n_ru_upd_xml/reports/upd_report.xml b/l10n_ru_upd_xml/reports/upd_report.xml new file mode 100644 index 00000000..7dd9798c --- /dev/null +++ b/l10n_ru_upd_xml/reports/upd_report.xml @@ -0,0 +1,344 @@ + + + + \ No newline at end of file diff --git a/l10n_ru_upd_xml/security/ir.model.access.csv b/l10n_ru_upd_xml/security/ir.model.access.csv new file mode 100644 index 00000000..7a894804 --- /dev/null +++ b/l10n_ru_upd_xml/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_upd_xml_upd_xml,upd_xml.upd_xml,model_upd_xml_upd_xml,base.group_user,1,1,1,1 diff --git a/l10n_ru_upd_xml/static/src/js/report/action_manager_report.js b/l10n_ru_upd_xml/static/src/js/report/action_manager_report.js new file mode 100644 index 00000000..c35cec85 --- /dev/null +++ b/l10n_ru_upd_xml/static/src/js/report/action_manager_report.js @@ -0,0 +1,56 @@ +/** @odoo-module **/ + +import {download} from "@web/core/network/download"; +import {registry} from "@web/core/registry"; + +function getReportUrl(action) { + + let url = `/report/xml/${action.report_name}`; + + const actionContext = action.context || {}; + + if (action.data && JSON.stringify(action.data) !== "{}") { + + const encodedOptions = encodeURIComponent( + JSON.stringify(action.data) + ); + + const encodedContext = encodeURIComponent( + JSON.stringify(actionContext) + ); + + return `${url}?options=${encodedOptions}&context=${encodedContext}`; + } + + if (actionContext.active_ids) { + url += `/${actionContext.active_ids.join(",")}`; + } + + return `${url}?context=${encodeURIComponent(JSON.stringify(actionContext))}`; +} +async function triggerDownload(action) { + + const data = JSON.stringify([ + getReportUrl(action), + action.report_type, + ]); + + const context = JSON.stringify(action.context || {}); + + await download({ + url: "/report/download", + data: { data, context }, + }); +} +registry + .category("ir.actions.report handlers") + .add("xml_handler", async function (action, options) { + + if (action.report_type !== "qweb-xml") { + return false; + } + + await triggerDownload(action); + + return true; + }); \ No newline at end of file diff --git a/l10n_ru_upd_xml/tests/__init__.py b/l10n_ru_upd_xml/tests/__init__.py new file mode 100644 index 00000000..7c58709f --- /dev/null +++ b/l10n_ru_upd_xml/tests/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import test_upd_xml diff --git a/l10n_ru_upd_xml/tests/test_upd_xml.py b/l10n_ru_upd_xml/tests/test_upd_xml.py new file mode 100644 index 00000000..763138cd --- /dev/null +++ b/l10n_ru_upd_xml/tests/test_upd_xml.py @@ -0,0 +1,173 @@ +# -*- coding: utf-8 -*- +""" +Tests for l10n_ru_upd_xml — УПД XML generation. + +Validates: Requirements 12.2, 12.4 +""" +from odoo.tests.common import TransactionCase +from odoo.tests import tagged +from odoo.exceptions import UserError + + +def _make_company_partner(env): + """Return or create a company partner with INN (10 digits) and KPP.""" + partner = env['res.partner'].search( + [('is_company', '=', True), ('inn', '!=', False), ('kpp', '!=', False)], + limit=1, + ) + if not partner: + partner = env['res.partner'].create({ + 'name': 'ООО Тест УПД', + 'is_company': True, + 'inn': '7700000001', + 'kpp': '770001001', + 'okpo': '12345678', + 'city': 'Москва', + 'street': 'ул. Тестовая, 1', + }) + return partner + + +def _make_out_invoice(env): + """Create a minimal out_invoice with all fields required for УПД.""" + partner = _make_company_partner(env) + + journal = env['account.journal'].search( + [('type', '=', 'sale'), ('company_id', '=', env.company.id)], limit=1 + ) + if not journal: + journal = env['account.journal'].create({ + 'name': 'Test Sales Journal UPD', + 'type': 'sale', + 'code': 'TUPD', + }) + + move = env['account.move'].create({ + 'move_type': 'out_invoice', + 'partner_id': partner.id, + 'journal_id': journal.id, + 'invoice_date': '2024-06-01', + }) + return move + + +@tagged('post_install', '-at_install') +class TestUpdXml(TransactionCase): + """ + Tests for УПД XML generation. + + Validates: Requirements 12.2, 12.4 + """ + + def setUp(self): + super().setUp() + self.invoice = _make_out_invoice(self.env) + + # ------------------------------------------------------------------ + # Requirement 12.2 — XML generation returns a valid XML document + # ------------------------------------------------------------------ + + def test_upd_xml_render_returns_valid_xml(self): + """ + Req 12.2 — rendering the УПД XML QWeb template for an account.move + returns non-empty bytes that parse as valid XML. + """ + import xml.etree.ElementTree as ET + + xml_content, content_type = self.env['ir.actions.report']._render_qweb_xml( + 'l10n_ru_upd_xml.demo_report_xml_view', [self.invoice.id] + ) + self.assertTrue(xml_content, "УПД XML render should return non-empty content") + self.assertIsInstance(xml_content, bytes, "Rendered content should be bytes") + + # Must parse without exception — proves it is valid XML + try: + root = ET.fromstring(xml_content) + except ET.ParseError as exc: + self.fail(f"Rendered УПД is not valid XML: {exc}") + + self.assertIsNotNone(root, "Parsed XML root element should not be None") + + # ------------------------------------------------------------------ + # Requirement 12.4 — missing INN/KPP raises UserError + # ------------------------------------------------------------------ + + def test_check_correct_upd_missing_inn_returns_error_message(self): + """ + Req 12.4 — check_correct_upd on an account.move whose partner has no INN + returns a non-empty error string mentioning the missing field. + """ + partner_no_inn = self.env['res.partner'].create({ + 'name': 'Партнёр без ИНН', + 'is_company': True, + # inn intentionally omitted + }) + journal = self.env['account.journal'].search( + [('type', '=', 'sale'), ('company_id', '=', self.env.company.id)], limit=1 + ) + move = self.env['account.move'].create({ + 'move_type': 'out_invoice', + 'partner_id': partner_no_inn.id, + 'journal_id': journal.id, + 'invoice_date': '2024-06-01', + }) + + error_msg = move.check_correct_upd(manually=False) + self.assertTrue( + error_msg.strip(), + "check_correct_upd should return a non-empty error string when INN is missing", + ) + self.assertIn('ИНН', error_msg, "Error message should mention ИНН") + + def test_print_upd_missing_inn_raises_user_error(self): + """ + Req 12.4 — print_upd on an account.move whose partner has no INN + raises UserError describing the missing fields. + """ + partner_no_inn = self.env['res.partner'].create({ + 'name': 'Партнёр без ИНН для print_upd', + 'is_company': True, + # inn intentionally omitted + }) + journal = self.env['account.journal'].search( + [('type', '=', 'sale'), ('company_id', '=', self.env.company.id)], limit=1 + ) + move = self.env['account.move'].create({ + 'move_type': 'out_invoice', + 'partner_id': partner_no_inn.id, + 'journal_id': journal.id, + 'invoice_date': '2024-06-01', + }) + + with self.assertRaises(UserError) as ctx: + move.print_upd() + + self.assertIn('ИНН', str(ctx.exception), + "UserError message should mention ИНН") + + def test_print_upd_missing_kpp_raises_user_error(self): + """ + Req 12.4 — print_upd on an account.move whose partner has INN (10 digits) + but no KPP raises UserError describing the missing КПП. + """ + partner_no_kpp = self.env['res.partner'].create({ + 'name': 'Партнёр без КПП', + 'is_company': True, + 'inn': '7700000099', + # kpp intentionally omitted + }) + journal = self.env['account.journal'].search( + [('type', '=', 'sale'), ('company_id', '=', self.env.company.id)], limit=1 + ) + move = self.env['account.move'].create({ + 'move_type': 'out_invoice', + 'partner_id': partner_no_kpp.id, + 'journal_id': journal.id, + 'invoice_date': '2024-06-01', + }) + + with self.assertRaises(UserError) as ctx: + move.print_upd() + + self.assertIn('КПП', str(ctx.exception), + "UserError message should mention КПП") diff --git a/l10n_ru_upd_xml/views/ir_actions_report_view.xml b/l10n_ru_upd_xml/views/ir_actions_report_view.xml new file mode 100644 index 00000000..1a22f939 --- /dev/null +++ b/l10n_ru_upd_xml/views/ir_actions_report_view.xml @@ -0,0 +1,24 @@ + + + + ir.actions.report.view.form.report.xml + ir.actions.report + + + + + + + + + + + + + diff --git a/l10n_ru_upd_xml/views/res_company_view.xml b/l10n_ru_upd_xml/views/res_company_view.xml new file mode 100644 index 00000000..6168f0dd --- /dev/null +++ b/l10n_ru_upd_xml/views/res_company_view.xml @@ -0,0 +1,14 @@ + + + + res.company.ru.form + res.company + + + + + + + + + diff --git a/l10n_ru_upd_xml/views/res_partner_view.xml b/l10n_ru_upd_xml/views/res_partner_view.xml new file mode 100644 index 00000000..9db8c9eb --- /dev/null +++ b/l10n_ru_upd_xml/views/res_partner_view.xml @@ -0,0 +1,21 @@ + + + + res.partner.ru.form + res.partner + + + + + + + + + + + + + + + + diff --git a/l10n_ru_upd_xml/views/res_users_view.xml b/l10n_ru_upd_xml/views/res_users_view.xml new file mode 100644 index 00000000..d2aa9be6 --- /dev/null +++ b/l10n_ru_upd_xml/views/res_users_view.xml @@ -0,0 +1,17 @@ + + + + res.users.signature.form + res.users + + + + + + + + + + + + diff --git a/l10n_ru_upd_xml/views/view_account_move.xml b/l10n_ru_upd_xml/views/view_account_move.xml new file mode 100644 index 00000000..1d0fc0dc --- /dev/null +++ b/l10n_ru_upd_xml/views/view_account_move.xml @@ -0,0 +1,19 @@ + + + + account.move.form.upd.button.header + account.move + + + +