diff --git a/sign_oca/README.rst b/sign_oca/README.rst new file mode 100644 index 00000000..73ca58b6 --- /dev/null +++ b/sign_oca/README.rst @@ -0,0 +1,174 @@ +======== +Sign Oca +======== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:4cd44f4785da01198064822b367bcbe928fe915080976d5b1f5f2d8671812e51 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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-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%2Fsign-lightgray.png?logo=github + :target: https://github.com/OCA/sign/tree/17.0/sign_oca + :alt: OCA/sign +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/sign-17-0/sign-17-0-sign_oca + :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/sign&target_branch=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows to create documents for signature inside Odoo using +OWL. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +There is a wizard (sign.oca.template.generate.multi) that can be used +for any model needed. If there is a template without a linked model or +linked to a model (res.partner for example) an action will be +automatically displayed in the tree and form view (only for users with +Sign permissions). + +Usage +===== + +Creation of templates +--------------------- + +- Access Sign / Templates +- Create a new template +- Add a PDF File +- Access the configuration menu +- You can add a field by doing a right click inside a page +- Click on the field in order to delete or edit some configuration of + it +- The template is autosaved + +Sign role +--------- + +- Access Sign / Settings / Roles +- Create a new role (Equipment employee for example) +- You can set the Partner type you need (empty, default or expression). +- With the expression option you can set: ${object.field_name.id} +- If you create a sign request from template signer will be auto-create + according to roles + +Sign a document from template +----------------------------- + +- Access Sign / Templates +- Press the Sign button from a template +- Fill all the possible partners that will sign the document +- You can link the template to a model (maintenance.equipment for + example) +- The signature action will be opened. +- There, you can fill all the data you need. +- Once you finish, press the sign button on the top +- When the last signer signs it, the final file will be generated as a + PDF + +Sign a pending document +----------------------- + +- Go to the pencil icon in the upper right corner (systray) of the sign + request to access the pending signatures. +- Press the Sign button from signer request +- The signature action will be opened. +- There, you can fill all the data you need. +- Once you finish, press the sign button on the top +- When the last signer signs it, the final file will be generated as a + PDF + +Sign from template +------------------ + +- Go to any list view or form view (except sign.oca models), e.g.: + Contacts +- Select multiple records (3 for example). +- The "Sign from template" action will be available if there are any + sign templates created that are not linked to any model and/or any + linked to the corresponding model. +- Select a template. +- Click on the "Generate" button. +- 3 requests will be created (each linked to each selected record) BUT + no signer will be set. +- Some extra modules (e.g. maintenance_sign_oca) will automatically set + the signers for each request. + +Known issues / Roadmap +====================== + +Tasks +----- + +- Ensure that the signature is inalterable. Maybe we might need to use + some tools like endevise or pyHanko with a certificate. Signer can be + authenticated using OTP. + +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 +------- + +* Dixmit + +Contributors +------------ + +- Enric Tobella (`www.dixmit.com `__) +- `Tecnativa `__: + + - Víctor Martínez + +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-etobella| image:: https://github.com/etobella.png?size=40px + :target: https://github.com/etobella + :alt: etobella + +Current `maintainer `__: + +|maintainer-etobella| + +This module is part of the `OCA/sign `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/sign_oca/__init__.py b/sign_oca/__init__.py new file mode 100644 index 00000000..ada0b87b --- /dev/null +++ b/sign_oca/__init__.py @@ -0,0 +1,3 @@ +from . import controllers +from . import models +from . import wizards diff --git a/sign_oca/__manifest__.py b/sign_oca/__manifest__.py new file mode 100644 index 00000000..abd930c5 --- /dev/null +++ b/sign_oca/__manifest__.py @@ -0,0 +1,71 @@ +# Copyright 2023 Dixmit +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Sign Oca", + "summary": """ + Allow to sign documents inside Odoo CE""", + "version": "17.0.1.0.0", + "license": "AGPL-3", + "author": "Dixmit,Odoo Community Association (OCA)", + "website": "https://github.com/OCA/sign", + "depends": ["web_editor", "portal", "base_sparse_field"], + "data": [ + "security/security.xml", + "views/menu.xml", + "data/data.xml", + "wizards/res_config_settings_views.xml", + "data/ir_sequence_data.xml", + "wizards/sign_oca_template_generate.xml", + "wizards/sign_oca_template_generate_multi.xml", + "views/res_partner_views.xml", + "views/sign_oca_request_log.xml", + "views/sign_oca_request.xml", + "security/ir.model.access.csv", + "views/sign_oca_field.xml", + "views/sign_oca_role.xml", + "views/sign_oca_template.xml", + "templates/assets.xml", + ], + "demo": [ + "demo/sign_oca_template.xml", + ], + "assets": { + "web.assets_backend": [ + "sign_oca/static/src/components/sign_oca_pdf_common/sign_oca_pdf_common.xml", + "sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml", + "sign_oca/static/src/components/sign_oca_pdf/sign_oca_pdf.xml", + "sign_oca/static/src/elements/elements.xml", + "sign_oca/static/src/scss/sign_oca.scss", + "sign_oca/static/src/components/sign_oca_pdf_common/sign_oca_pdf_common.esm.js", + "sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.esm.js", + "sign_oca/static/src/elements/text.esm.js", + "sign_oca/static/src/elements/signature.esm.js", + "sign_oca/static/src/elements/check.esm.js", + "sign_oca/static/src/components/sign_oca_pdf/sign_oca_pdf.esm.js", + "sign_oca/static/src/components/" "sign_oca/static/src/js/*.js", + "sign_oca/static/src/xml/*.xml", + ], + "web.assets_frontend": [ + "sign_oca/static/src/components/sign_oca_pdf_common/sign_oca_pdf_common.xml", + "sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml", + "sign_oca/static/src/components/sign_oca_pdf/sign_oca_pdf.xml", + "sign_oca/static/src/elements/elements.xml", + "sign_oca/static/src/scss/sign_oca.scss", + "sign_oca/static/src/components/sign_oca_pdf_common/sign_oca_pdf_common.esm.js", + "sign_oca/static/src/elements/text.esm.js", + "sign_oca/static/src/elements/signature.esm.js", + "sign_oca/static/src/elements/check.esm.js", + "sign_oca/static/src/components/sign_oca_pdf/sign_oca_pdf.esm.js", + "sign_oca/static/src/components/sign_oca_pdf_portal/sign_oca_pdf_portal.esm.js", + "sign_oca/static/src/components/sign_oca_pdf_portal/sign_oca_pdf_portal.xml", + "sign_oca/static/src/scss/portal.scss", + "sign_oca/static/src/xml/*.xml", + ], + "sign_oca.sign_assets": [ + "sign_oca/static/src/scss/sign.scss", + "web/static/src/libs/fontawesome/css/font-awesome.css", + ], + }, + "maintainers": ["etobella"], +} diff --git a/sign_oca/controllers/__init__.py b/sign_oca/controllers/__init__.py new file mode 100644 index 00000000..12a7e529 --- /dev/null +++ b/sign_oca/controllers/__init__.py @@ -0,0 +1 @@ +from . import main diff --git a/sign_oca/controllers/main.py b/sign_oca/controllers/main.py new file mode 100644 index 00000000..4d61d537 --- /dev/null +++ b/sign_oca/controllers/main.py @@ -0,0 +1,111 @@ +from odoo import http +from odoo.exceptions import AccessError, MissingError +from odoo.http import request + +from odoo.addons.base.models.assetsbundle import AssetsBundle +from odoo.addons.portal.controllers.portal import CustomerPortal + + +class SignController(http.Controller): + @http.route("/sign_oca/get_assets.", type="http", auth="public") + def get_sign_resources(self, ext): + bundle = "sign_oca.sign_assets" + files, _ = request.env["ir.qweb"]._get_asset_content(bundle) + asset = AssetsBundle(bundle, files) + mock_attachment = getattr(asset, ext)() + if isinstance( + mock_attachment, list + ): # suppose that CSS asset will not required to be split in pages + mock_attachment = mock_attachment[0] + stream = request.env["ir.binary"]._get_stream_from(mock_attachment) + response = stream.get_response() + return response + + +class PortalSign(CustomerPortal): + @http.route( + ["/sign_oca/document//"], + type="http", + auth="public", + website=True, + ) + def get_sign_oca_access(self, signer_id, access_token, **kwargs): + try: + signer_sudo = self._document_check_access( + "sign.oca.request.signer", signer_id, access_token + ) + except (AccessError, MissingError): + return request.redirect("/my") + if signer_sudo.signed_on: + return request.render( + "sign_oca.portal_sign_document_signed", + { + "signer": signer_sudo, + "company": signer_sudo.request_id.company_id, + }, + ) + return request.render( + "sign_oca.portal_sign_document", + { + "doc": signer_sudo.request_id, + "partner": signer_sudo.partner_id, + "signer": signer_sudo, + "access_token": access_token, + "sign_oca_backend_info": { + "access_token": access_token, + "signer_id": signer_sudo.id, + "lang": signer_sudo.partner_id.lang, + }, + }, + ) + + @http.route( + ["/sign_oca/content//"], + type="http", + auth="public", + website=True, + ) + def get_sign_oca_content_access(self, signer_id, access_token): + try: + signer_sudo = self._document_check_access( + "sign.oca.request.signer", signer_id, access_token + ) + except (AccessError, MissingError): + return request.redirect("/my") + return http.Stream.from_binary_field( + signer_sudo.request_id, "data" + ).get_response(mimetype="application/pdf") + + @http.route( + ["/sign_oca/info//"], + type="json", + auth="public", + website=True, + ) + def get_sign_oca_info_access(self, signer_id, access_token): + try: + signer_sudo = self._document_check_access( + "sign.oca.request.signer", signer_id, access_token + ) + except (AccessError, MissingError): + return request.redirect("/my") + return signer_sudo.get_info(access_token=access_token) + + @http.route( + ["/sign_oca/sign//"], + type="json", + auth="public", + website=True, + ) + def get_sign_oca_sign_access( + self, signer_id, access_token, items, latitude=False, longitude=False + ): + try: + signer_sudo = self._document_check_access( + "sign.oca.request.signer", signer_id, access_token + ) + except (AccessError, MissingError): + return request.redirect("/my") + return signer_sudo.action_sign( + items, access_token=access_token, latitude=latitude, longitude=longitude + ) diff --git a/sign_oca/data/data.xml b/sign_oca/data/data.xml new file mode 100644 index 00000000..0b7a6393 --- /dev/null +++ b/sign_oca/data/data.xml @@ -0,0 +1,37 @@ + + + + Name + text + name + + + Email + text + email + + + Phone + text + phone + + + Text + text + + + Signature + signature + + + Check + check + + + Customer + [] + + + Employee + + diff --git a/sign_oca/data/ir_sequence_data.xml b/sign_oca/data/ir_sequence_data.xml new file mode 100644 index 00000000..a8188be0 --- /dev/null +++ b/sign_oca/data/ir_sequence_data.xml @@ -0,0 +1,12 @@ + + + + Securization of Signature + SECUR_SIGN + no_gap + + + 0 + + + diff --git a/sign_oca/demo/sign_oca_template.xml b/sign_oca/demo/sign_oca_template.xml new file mode 100644 index 00000000..82a9fdb1 --- /dev/null +++ b/sign_oca/demo/sign_oca_template.xml @@ -0,0 +1,16 @@ + + + + + + + Supervisor + default + + + diff --git a/sign_oca/i18n/es.po b/sign_oca/i18n/es.po new file mode 100644 index 00000000..088bb23d --- /dev/null +++ b/sign_oca/i18n/es.po @@ -0,0 +1,1390 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sign_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-10-14 08:06+0000\n" +"Last-Translator: Víctor Martínez \n" +"Language-Team: none\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.6.2\n" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "%(name)s (%(email)s) has sent the signed document." +msgstr "%(name)s (%(email)s) ha enviado el documento firmado." + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_mail +msgid "" +")\n" +" has requested your signature on a document." +msgstr "" +")\n" +" ha solicitado su firma en un documento." + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/xml/systray.xml:0 +#, python-format +msgid "0 Pending" +msgstr "0 Pendiente" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +msgid " Signed" +msgstr " Firmado" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_mail +msgid "" +"Warning do not forward this email to other people!
\n" +" They will be able to access this document and sign it as " +"yourself.
" +msgstr "" +"Advertencia ¡No reenvíe este correo electrónico a otras " +"personas!
\n" +" Podrán acceder a este documento y firmarlo como usted " +"mismo.
" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__access_token +msgid "Access Token" +msgstr "Token de acceso" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__access_warning +msgid "Access warning" +msgstr "Advertencia de acceso" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__action +msgid "Action" +msgstr "Acción" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_needaction +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_needaction +msgid "Action Needed" +msgstr "Acción requerida" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__active +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__active +msgid "Active" +msgstr "Activo" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_ids +msgid "Activities" +msgstr "Actividades" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "Decoración de excepción de actividad" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +msgid "Activity Log" +msgstr "Registro de actividades" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_state +msgid "Activity State" +msgstr "Estado de actividad" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_type_icon +msgid "Activity Type Icon" +msgstr "Icono de tipo de actividad" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__add_field +msgid "Add field" +msgstr "Agregue campo" + +#. module: sign_oca +#: model:res.groups,name:sign_oca.sign_oca_group_admin +msgid "Administrator" +msgstr "Administrador" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__altered_hash +msgid "Altered Hash" +msgstr "" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "" +"An error occurred when computing the inalterability. Impossible to get the " +"unique previous signer information." +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_kanban_view +msgid "Archive" +msgstr "Archivo" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Archived" +msgstr "Archivado" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.portal_sign_document_signed +msgid "" +"As soon as all signers have signed the document, you will receive an email " +"with the full document" +msgstr "" +"Tan pronto como todos los firmantes hayan firmado el documento, recibirá un " +"correo electrónico con el documento completo" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__ask_location +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__ask_location +msgid "Ask Location" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_attachment_count +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_attachment_count +msgid "Attachment Count" +msgstr "Cantidad de adjuntos" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/elements/elements.xml:0 +#, python-format +msgid "" +"By clicking Adopt and Sign, I agree that the chosen signature/initials will " +"be a valid electronic representation of my hand-written signature/initials " +"for all purposes when it is used on documents, including legally binding " +"contracts." +msgstr "" +"Al hacer clic en Adoptar y Firmar, acepto que la firma/iniciales elegidas " +"serán una representación electrónica válida de mi firma/iniciales " +"manuscritas para todos los fines cuando se utilicen en documentos, incluidos " +"contratos legalmente vinculantes." + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.esm.js:0 +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__cancel +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_generate_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_generate_multi_form_view +#, python-format +msgid "Cancel" +msgstr "Cancelar" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Canceled" +msgstr "Cancelado" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request__state__cancel +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +msgid "Cancelled" +msgstr "Cancelado" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_field__field_type__check +msgid "Check" +msgstr "Verificar" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "Click on the field that you want to add" +msgstr "Haga clic en el campo que desea agregar" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_res_company +msgid "Companies" +msgstr "Compañías" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__company_id +msgid "Company" +msgstr "Compañía" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_res_config_settings +msgid "Config Settings" +msgstr "Opciones de configuración" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__configure +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_kanban_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_tree_view +msgid "Configure" +msgstr "Configurar" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_res_partner +msgid "Contact" +msgstr "Contacto" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__create +msgid "Create" +msgstr "Crear" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__current_hash +msgid "Current Hash" +msgstr "Hash actual" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request_signer__access_url +msgid "Customer Portal URL" +msgstr "URL del portal del cliente" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__data +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__data +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__data +msgid "Data" +msgstr "Datos" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "Data is saved automatically when editing" +msgstr "Los datos se guardan automáticamente al editar" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "Data is saved automatically when editing." +msgstr "Los datos se guardan automáticamente al editar." + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__date +msgid "Date" +msgstr "Fecha" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_role__partner_selection_policy__default +msgid "Default" +msgstr "Defecto" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__default_value +msgid "Default Value" +msgstr "Valor por defecto" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__default_partner_id +msgid "Default partner" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.esm.js:0 +#, python-format +msgid "Delete" +msgstr "Borrar" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__delete_field +msgid "Delete field" +msgstr "Eliminar campo" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_kanban_view +msgid "Details" +msgstr "Detalles" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.portal_sign_document_signed +msgid "Document" +msgstr "Documento" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__domain +msgid "Domain" +msgstr "Dominio" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request__state__draft +msgid "Draft" +msgstr "Borrador" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_kanban_view +msgid "Dropdown menu" +msgstr "Menú desplegable" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.esm.js:0 +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__edit_field +#, python-format +msgid "Edit field" +msgstr "Editar campo" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_role__partner_selection_policy__empty +msgid "Empty" +msgstr "Vacío" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_role__expression_partner +msgid "Example: {{object.partner_id.id}}" +msgstr "Ejemplo: {{object.partner_id.id}}" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__expression_partner +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_role__partner_selection_policy__expression +msgid "Expression" +msgstr "Expresión" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__field_id +#, python-format +msgid "Field" +msgstr "Campo" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "Field %s is not filled" +msgstr "El campo %s no está lleno" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__field_type +msgid "Field Type" +msgstr "Tipo de campo" + +#. module: sign_oca +#: model:ir.actions.act_window,name:sign_oca.sign_oca_field_act_window +#: model:ir.ui.menu,name:sign_oca.sign_oca_field_menu +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_form_view +msgid "Fields" +msgstr "Campos" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__filename +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__filename +msgid "Filename" +msgstr "Nombre del archivo" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "Filled by" +msgstr "Llenado por" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_follower_ids +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_follower_ids +msgid "Followers" +msgstr "Seguidores" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_partner_ids +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_partner_ids +msgid "Followers (Partners)" +msgstr "Seguidores (Empresas)" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "Font awesome icon e.g. fa-tasks" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +msgid "Fully Signed" +msgstr "Completamente firmado" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Future Activities" +msgstr "Actividades futuras" + +#. module: sign_oca +#: model:ir.actions.act_window,name:sign_oca.sign_oca_general_settings_act_window +msgid "General Settings" +msgstr "Opciones de configuración" + +#. module: sign_oca +#: model:ir.ui.menu,name:sign_oca.sign_oca_general_settings_menu +msgid "General settings" +msgstr "Opciones de configuración" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_generate_multi_form_view +msgid "Generate" +msgstr "Generar" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_generate_form_view +msgid "Generate & sign" +msgstr "Generar y firmar" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_template_generate +msgid "Generate a signature request" +msgstr "Generar una solicitud de firma" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_template_generate_multi +msgid "Generate signature requests" +msgstr "Generar solicitudes de firma" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Group By" +msgstr "Agrupar por" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__has_message +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__has_message +msgid "Has Message" +msgstr "Tiene mensaje" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__height +msgid "Height" +msgstr "Altura" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "Help" +msgstr "Ayuda" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__id +msgid "ID" +msgstr "ID (Identificación)" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_exception_icon +msgid "Icon" +msgstr "Icono" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "Icono para indicar una actividad de excepción." + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__message_needaction +#: model:ir.model.fields,help:sign_oca.field_sign_oca_template__message_needaction +msgid "If checked, new messages require your attention." +msgstr "Si está marcado, los mensajes nuevos requieren su atención." + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__message_has_error +#: model:ir.model.fields,help:sign_oca.field_sign_oca_template__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "Si está marcado, algunos mensajes tienen un error de entrega." + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "" +"If you do a click over a field, you will be able to change the default " +"configurations of the field" +msgstr "" +"Si hace clic sobre un campo, podrá cambiar las configuraciones " +"predeterminadas del campo" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "" +"In order to add a new field, do a right click over the PDF page. You will be " +"able to select the field that you will import" +msgstr "" +"Para agregar un nuevo campo, haga clic derecho sobre la página PDF. Podrá " +"seleccionar el campo que importará" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "" +"In order to add a new field, do a right click over the PDF page. You will be " +"able to select the field that you will import.\n" +" Then, you can move and resize the fields over the PDF page " +"using the move icons.\n" +" If you do a click over a field, you will be able to change " +"the default configurations of the field" +msgstr "" +"Para agregar un nuevo campo, haga clic derecho sobre la página PDF. Podrá " +"seleccionar el campo que importará.\n" +" Luego, puede mover y cambiar el tamaño de los campos en la " +"página PDF usando los íconos de movimiento.\n" +" Si hace clic sobre un campo, podrá cambiar las " +"configuraciones predeterminadas del campo" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__inalterable_hash +msgid "Inalterability Hash" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__secure_sequence_number +msgid "Inalteralbility No Gap Sequence #" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__ip +msgid "Ip" +msgstr "Ip" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__is_allow_signature +msgid "Is Allow Signature" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_is_follower +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_is_follower +msgid "Is Follower" +msgstr "Es seguidor" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__item_ids +msgid "Item" +msgstr "Elemento" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item____last_update +msgid "Last Modified on" +msgstr "Última modificación el" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__write_uid +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__write_date +msgid "Last Updated on" +msgstr "Última actualización el" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Late Activities" +msgstr "Actividades tardías" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__latitude +msgid "Latitude" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_request_log +msgid "Log access and edition on requests" +msgstr "Acceso y edición de registros según solicitudes" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_pdf_portal/sign_oca_pdf_portal.xml:0 +#: model_terms:ir.ui.view,arch_db:sign_oca.portal_sign_document_signed +#, python-format +msgid "Logo" +msgstr "Logo" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__longitude +msgid "Longitude" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_main_attachment_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_main_attachment_id +msgid "Main Attachment" +msgstr "Adjunto principal" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_pdf/sign_oca_pdf.xml:0 +#, python-format +msgid "Main actions" +msgstr "Acciones principales" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__message +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__message +msgid "Message" +msgstr "Mensaje" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_has_error +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_has_error +msgid "Message Delivery error" +msgstr "Error de entrega de mensaje" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_ids +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_ids +msgid "Messages" +msgstr "Mensajes" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__model +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__model +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__model_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__model +msgid "Model" +msgstr "Modelo" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "Fecha límite de mi actividad" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "My Documents" +msgstr "Mis documentos" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "My Requests" +msgstr "Mis solicitudes" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__partner_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__name +msgid "Name" +msgstr "Nombre" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_pdf_common/sign_oca_pdf_common.esm.js:0 +#, python-format +msgid "Need a valid PDF to add signature fields !" +msgstr "¡Necesita un PDF válido para agregar campos de firma!" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "New document to sign" +msgstr "Nuevo documento para firmar" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "Fecha límite para la próxima actividad" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_summary +msgid "Next Activity Summary" +msgstr "Resumen de la próxima actividad" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_type_id +msgid "Next Activity Type" +msgstr "Siguiente tipo de actividad" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__next_item_id +msgid "Next Item" +msgstr "Proximo elemento" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/xml/systray.xml:0 +#, python-format +msgid "No requests to sign." +msgstr "No hay solicitudes para firmar." + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_needaction_counter +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_needaction_counter +msgid "Number of Actions" +msgstr "Número de acciones" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_has_error_counter +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_has_error_counter +msgid "Number of errors" +msgstr "Número de errores" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__message_needaction_counter +#: model:ir.model.fields,help:sign_oca.field_sign_oca_template__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "Número de mensajes que requieren acción" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__message_has_error_counter +#: model:ir.model.fields,help:sign_oca.field_sign_oca_template__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "Número de mensajes con error de entrega" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__record_ref +msgid "Object" +msgstr "Objeto" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_res_company__sign_oca_send_sign_request_copy +#: model:ir.model.fields,help:sign_oca.field_res_config_settings__sign_oca_send_sign_request_copy +#: model_terms:ir.ui.view,arch_db:sign_oca.res_config_settings_view_form +msgid "" +"Once all signers have signed the request, a copy of the final document will " +"be sent to each of them." +msgstr "" +"Una vez que todos los firmantes hayan firmado la solicitud, se enviará a " +"cada uno de ellos una copia del documento final." + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__page +msgid "Page" +msgstr "Página" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__partner_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__partner_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__partner_id +msgid "Partner" +msgstr "Empresa" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__partner_selection_policy +msgid "Partner Selection Policy" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/xml/systray.xml:0 +#, python-format +msgid "Pending" +msgstr "Pendiente" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__placeholder +#, python-format +msgid "Placeholder" +msgstr "Marcador de posición" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_pdf_portal/sign_oca_pdf_portal.xml:0 +#, python-format +msgid "Please Review And Act On This Document" +msgstr "Por favor revise y actúe según este documento" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__access_url +msgid "Portal Access URL" +msgstr "URL de acceso al portal" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__position_x +msgid "Position X" +msgstr "Posición X" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__position_y +msgid "Position Y" +msgstr "Posición Y" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__request_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__request_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__request_ids +msgid "Request" +msgstr "Pedido" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__request_count +msgid "Request Count" +msgstr "Cantidad de solicitudes" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "Request cannot be signed" +msgstr "La solicitud no se puede firmar" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/xml/systray.xml:0 +#: model:ir.ui.menu,name:sign_oca.sign_oca_request_menu +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_form_view +#, python-format +msgid "Requests" +msgstr "Peticiones" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__required +#, python-format +msgid "Required" +msgstr "Requerido" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__res_id +msgid "Res" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__user_id +msgid "Responsible" +msgstr "Responsable" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_user_id +msgid "Responsible User" +msgstr "Usuario responsable" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_kanban_view +msgid "Restore" +msgstr "Restaurar" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__role_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__role_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__role_id +msgid "Role" +msgstr "Rol" + +#. module: sign_oca +#: model:ir.actions.act_window,name:sign_oca.sign_oca_role_act_window +#: model:ir.ui.menu,name:sign_oca.sign_oca_role_menu +msgid "Roles" +msgstr "Roles" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.esm.js:0 +#, python-format +msgid "Save" +msgstr "Guardar" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__access_token +msgid "Security Token" +msgstr "Token de seguridad" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_kanban_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_tree_view +msgid "Send" +msgstr "Enviar" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_res_company__sign_oca_send_sign_request_copy +#: model:ir.model.fields,field_description:sign_oca.field_res_config_settings__sign_oca_send_sign_request_copy +msgid "Send signers a copy of the final signed document" +msgstr "Enviar a los firmantes una copia del documento final firmado" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_form_view +msgid "Send to sign" +msgstr "Enviar para firmar" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request__state__sent +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Sent" +msgstr "Enviado" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__sequence_id +msgid "Sequence" +msgstr "Secuencia" + +#. module: sign_oca +#: model:ir.ui.menu,name:sign_oca.sign_oca_settings_menu +msgid "Settings" +msgstr "Ajustes" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Show all records which has next action date is before today" +msgstr "" +"Mostrar todos los registros cuya fecha de próxima acción sea anterior a hoy" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_pdf/sign_oca_pdf.xml:0 +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__sign +#: model:ir.module.category,name:sign_oca.sign_oca_module_category +#: model:ir.ui.menu,name:sign_oca.sign_oca_root_menu +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_signer_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_tree_view +#, python-format +msgid "Sign" +msgstr "Firmar" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__sign_now +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_kanban_view +msgid "Sign Now" +msgstr "Firmar ahora" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.res_config_settings_view_form +msgid "Sign Oca" +msgstr "Firma" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_template +msgid "Sign Oca Template" +msgstr "Pantilla de OCA para firmar" + +#. module: sign_oca +#: model:ir.actions.act_window,name:sign_oca.sign_oca_template_generate_act_window +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_generate_form_view +msgid "Sign Oca Template Generate" +msgstr "Generar plantilla de OCA para firmar" + +#. module: sign_oca +#: model:ir.actions.act_window,name:sign_oca.sign_oca_template_generate_multi_act_window +msgid "Sign Oca Template Generate Multi" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_template_item +msgid "Sign Oca Template Item" +msgstr "Firmar elemento de plantilla de OCA" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_request +msgid "Sign Request" +msgstr "Solicitud de firma" + +#. module: sign_oca +#: model:ir.actions.act_window,name:sign_oca.sign_oca_request_signer_act_window +msgid "Sign Request Signers" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_request_signer +msgid "Sign Request Value" +msgstr "Valor de solicitud de firma" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/xml/systray.xml:0 +#: model:ir.actions.act_window,name:sign_oca.sign_oca_request_act_window +#: model:ir.actions.act_window,name:sign_oca.sign_oca_request_log_act_window +#: model:ir.actions.act_window,name:sign_oca.sign_oca_request_template_act_window +#: model_terms:ir.ui.view,arch_db:sign_oca.res_config_settings_view_form +#: model_terms:ir.ui.view,arch_db:sign_oca.view_partner_form +#, python-format +msgid "Sign Requests" +msgstr "Solicitudes de firma" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_role +msgid "Sign Role" +msgstr "Rol de firma" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_mail +msgid "Sign document" +msgstr "Firmar documento" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/js/sign_oca.esm.js:0 +#, python-format +msgid "Sign from template" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_tree_view +msgid "Sign now" +msgstr "Firmar ahora" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__signatory_data +msgid "Signatory Data" +msgstr "Datos del firmante" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_field__field_type__signature +msgid "Signature" +msgstr "Firma" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_field +msgid "Signature Field Type" +msgstr "Tipo de campo de firma" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__signature_hash +msgid "Signature Hash" +msgstr "Hash de firma" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "Signature configuration" +msgstr "Configuración de firma" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_template_generate_signer +msgid "Signature request signers" +msgstr "Firmantes de solicitud de firma" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__signed +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request__state__signed +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Signed" +msgstr "Firmado" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__signed_count +msgid "Signed Count" +msgstr "Recuento firmado" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__signed_on +msgid "Signed On" +msgstr "Firmado" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "Signed document" +msgstr "Documento firmado" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_res_partner__signer_ids +#: model:ir.model.fields,field_description:sign_oca.field_res_users__signer_ids +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__signer_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__signer_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__signer_ids +msgid "Signer" +msgstr "Firmante" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_res_partner__signer_count +#: model:ir.model.fields,field_description:sign_oca.field_res_users__signer_count +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__signer_count +msgid "Signer Count" +msgstr "Cantidad de firmantes" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__signer_ids +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_tree_view +msgid "Signers" +msgstr "Firmantes" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__state +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "State" +msgstr "Estado" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__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 "" +"Estado basado en actividades.\n" +"Vencido: la fecha de vencimiento ya pasó\n" +"Hoy: la fecha de la actividad es hoy.\n" +"Planificado: Actividades futuras." + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__template_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__template_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__template_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__template_id +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_kanban_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Template" +msgstr "Pantilla" + +#. module: sign_oca +#: model:ir.actions.act_window,name:sign_oca.sign_oca_template_act_window +#: model:ir.ui.menu,name:sign_oca.sign_oca_template_menu +msgid "Templates" +msgstr "Plantillas" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_field__field_type__text +msgid "Text" +msgstr "Texto" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.portal_sign_document_signed +msgid "The document has been cancelled" +msgstr "El documento ha sido cancelado" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__signer_id +msgid "The signer related to the active user." +msgstr "El firmante relacionado con el usuario activo." + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "" +"Then, you can move and resize the fields over the PDF page using the move " +"icons." +msgstr "" +"Luego, puede mover y cambiar el tamaño de los campos en la página PDF usando " +"los íconos de movimiento." + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "There are no signers, please fill them before configuring it" +msgstr "No hay firmantes, por favor complételos antes de configurarlo" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_role__partner_selection_policy +msgid "" +"This field is used to define how the partner will be calculated in the " +"different roles of a request. This field will be used when the 'Sign from " +"Template' action is triggered." +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__to_sign +msgid "To Sign" +msgstr "Para firmar" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "To sign" +msgstr "Para firmar" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Today Activities" +msgstr "Actividades de hoy" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "Tipo de actividad de excepción registrada." + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__uid +msgid "Uid" +msgstr "Identificador" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/res_users.py:0 +#, python-format +msgid "Undefined" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_res_users +msgid "User" +msgstr "Usuario" + +#. module: sign_oca +#: model:res.groups,name:sign_oca.sign_oca_group_manager +msgid "User: All Documents" +msgstr "Usuario: Todos los documentos" + +#. module: sign_oca +#: model:res.groups,name:sign_oca.sign_oca_group_user +msgid "User: Own Documents Only" +msgstr "Usuario: Sólo documentos propios" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "Users %s has already signed the document" +msgstr "El usuario %s ya ha firmado el documento" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__validate +msgid "Validate" +msgstr "Validar" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_pdf_portal/sign_oca_pdf_portal.xml:0 +#, python-format +msgid "Validate & Send document" +msgstr "Validar y Enviar documento" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__view +msgid "View Document" +msgstr "Ver documento" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__website_message_ids +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__website_message_ids +msgid "Website Messages" +msgstr "Mensajes del sitio web" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__website_message_ids +#: model:ir.model.fields,help:sign_oca.field_sign_oca_template__website_message_ids +msgid "Website communication history" +msgstr "Historial de comunicación del sitio web" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__width +msgid "Width" +msgstr "Ancho" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__wizard_id +msgid "Wizard" +msgstr "Asistente" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "You are not allowed to sign this document." +msgstr "No está permitido firmar este documento." + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "You can only configure requests in draft state" +msgstr "Solo puede configurar solicitudes en estado de borrador" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.portal_sign_document_signed +msgid "" +"You should have received an email with the final document.
\n" +" Check on your mailbox." +msgstr "" +"Debería haber recibido un correo electrónico con el documento final.
\n" +" Consulte su bandeja de entrada." + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +msgid "" +"You will cancel the request and all the accesses. Are you sure about it?" +msgstr "Cancelará la solicitud y todos los accesos. ¿Está seguro de eso?" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.portal_sign_document_signed +msgid "has already been signed" +msgstr "ya ha sido firmado" diff --git a/sign_oca/i18n/it.po b/sign_oca/i18n/it.po new file mode 100644 index 00000000..fec08304 --- /dev/null +++ b/sign_oca/i18n/it.po @@ -0,0 +1,1393 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sign_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-10-14 08:06+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.6.2\n" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "%(name)s (%(email)s) has sent the signed document." +msgstr "%(name)s (%(email)s) ha inviato il documento firmato." + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_mail +msgid "" +")\n" +" has requested your signature on a document." +msgstr "" +")\n" +" ha richiesto la sua firma su un documento." + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/xml/systray.xml:0 +#, python-format +msgid "0 Pending" +msgstr "0 in attesa" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +msgid " Signed" +msgstr " Firmato" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_mail +msgid "" +"Warning do not forward this email to other people!
\n" +" They will be able to access this document and sign it as " +"yourself.
" +msgstr "" +"Attenzione non inoltrare questa e-mail ad altre persone!
\n" +" Saranno abilitate ad accedere a questo documento e " +"firmarlo a suo nome.
" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__access_token +msgid "Access Token" +msgstr "Token di accesso" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__access_warning +msgid "Access warning" +msgstr "Avviso accesso" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__action +msgid "Action" +msgstr "Azione" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_needaction +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_needaction +msgid "Action Needed" +msgstr "Azione richiesta" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__active +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__active +msgid "Active" +msgstr "Attivo" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_ids +msgid "Activities" +msgstr "Attività" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "Decorazione eccezione attività" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +msgid "Activity Log" +msgstr "Registro attività" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_state +msgid "Activity State" +msgstr "Stato attività" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_type_icon +msgid "Activity Type Icon" +msgstr "Icona tipo attività" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__add_field +msgid "Add field" +msgstr "Aggiungi campo" + +#. module: sign_oca +#: model:res.groups,name:sign_oca.sign_oca_group_admin +msgid "Administrator" +msgstr "Amministratore" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__altered_hash +msgid "Altered Hash" +msgstr "Hash modificato" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "" +"An error occurred when computing the inalterability. Impossible to get the " +"unique previous signer information." +msgstr "" +"Si è verificato un errore nel calcolo dell'inalterabilità. Impossibile " +"ottenere le informazioni univoche del firmatario precedente." + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_kanban_view +msgid "Archive" +msgstr "Archivia" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Archived" +msgstr "In archivio" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.portal_sign_document_signed +msgid "" +"As soon as all signers have signed the document, you will receive an email " +"with the full document" +msgstr "" +"Appena tutti i firmatari avranno firmato il documento, riceverà una e-mail " +"con il documento completo" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__ask_location +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__ask_location +msgid "Ask Location" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_attachment_count +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_attachment_count +msgid "Attachment Count" +msgstr "Conteggio allegati" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/elements/elements.xml:0 +#, python-format +msgid "" +"By clicking Adopt and Sign, I agree that the chosen signature/initials will " +"be a valid electronic representation of my hand-written signature/initials " +"for all purposes when it is used on documents, including legally binding " +"contracts." +msgstr "" +"Facendo clic su \"Adotta e firma\", accetto che la firma/iniziali scelte " +"saranno una rappresentazione elettronica valida della mia firma manuale per " +"qualsiasi scopo quando è utilizzate nei documenti, inclusi contratti legali." + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.esm.js:0 +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__cancel +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_generate_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_generate_multi_form_view +#, python-format +msgid "Cancel" +msgstr "Annulla" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Canceled" +msgstr "Annullata" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request__state__cancel +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +msgid "Cancelled" +msgstr "Annullata" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_field__field_type__check +msgid "Check" +msgstr "Controllo" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "Click on the field that you want to add" +msgstr "Fare clic sul campo che si vuole aggiungere" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_res_company +msgid "Companies" +msgstr "Aziende" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__company_id +msgid "Company" +msgstr "Azienda" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_res_config_settings +msgid "Config Settings" +msgstr "Impostazioni configurazione" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__configure +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_kanban_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_tree_view +msgid "Configure" +msgstr "Configura" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_res_partner +msgid "Contact" +msgstr "Contatto" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__create +msgid "Create" +msgstr "Crea" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__current_hash +msgid "Current Hash" +msgstr "Hash attuale" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request_signer__access_url +msgid "Customer Portal URL" +msgstr "URL portale cliente" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__data +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__data +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__data +msgid "Data" +msgstr "Dati" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "Data is saved automatically when editing" +msgstr "I dati sono salvati automaticamente quando si modifica" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "Data is saved automatically when editing." +msgstr "I dati sono salvati automaticamente quando si modifica." + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__date +msgid "Date" +msgstr "Data" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_role__partner_selection_policy__default +msgid "Default" +msgstr "Predefinito" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__default_value +msgid "Default Value" +msgstr "Valore predefinito" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__default_partner_id +msgid "Default partner" +msgstr "Partner predefinito" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.esm.js:0 +#, python-format +msgid "Delete" +msgstr "Cancella" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__delete_field +msgid "Delete field" +msgstr "Cancella campo" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_kanban_view +msgid "Details" +msgstr "Dettagli" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.portal_sign_document_signed +msgid "Document" +msgstr "Documento" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__domain +msgid "Domain" +msgstr "Dominio" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request__state__draft +msgid "Draft" +msgstr "Bozza" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_kanban_view +msgid "Dropdown menu" +msgstr "Menu a tendina" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.esm.js:0 +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__edit_field +#, python-format +msgid "Edit field" +msgstr "Modifica campo" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_role__partner_selection_policy__empty +msgid "Empty" +msgstr "Vuoto" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_role__expression_partner +msgid "Example: {{object.partner_id.id}}" +msgstr "Esempio: {{object.partner_id.id}}" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__expression_partner +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_role__partner_selection_policy__expression +msgid "Expression" +msgstr "Espressione" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__field_id +#, python-format +msgid "Field" +msgstr "Campo" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "Field %s is not filled" +msgstr "Il campo %s non è compilato" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__field_type +msgid "Field Type" +msgstr "Tipo campo" + +#. module: sign_oca +#: model:ir.actions.act_window,name:sign_oca.sign_oca_field_act_window +#: model:ir.ui.menu,name:sign_oca.sign_oca_field_menu +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_form_view +msgid "Fields" +msgstr "Campi" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__filename +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__filename +msgid "Filename" +msgstr "Nome file" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "Filled by" +msgstr "Compilato da" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_follower_ids +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_follower_ids +msgid "Followers" +msgstr "Seguito da" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_partner_ids +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_partner_ids +msgid "Followers (Partners)" +msgstr "Seguito da (partner)" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "Icona Font Awesome es. fa-tasks" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +msgid "Fully Signed" +msgstr "Completamente firmato" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Future Activities" +msgstr "Attività future" + +#. module: sign_oca +#: model:ir.actions.act_window,name:sign_oca.sign_oca_general_settings_act_window +msgid "General Settings" +msgstr "Impostazioni generali" + +#. module: sign_oca +#: model:ir.ui.menu,name:sign_oca.sign_oca_general_settings_menu +msgid "General settings" +msgstr "Impostazioni generali" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_generate_multi_form_view +msgid "Generate" +msgstr "Genera" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_generate_form_view +msgid "Generate & sign" +msgstr "Genera e firma" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_template_generate +msgid "Generate a signature request" +msgstr "Genera una richiesta di firma" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_template_generate_multi +msgid "Generate signature requests" +msgstr "Genera richieste firma" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Group By" +msgstr "Raggruppa per" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__has_message +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__has_message +msgid "Has Message" +msgstr "Ha un messaggio" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__height +msgid "Height" +msgstr "Altezza" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "Help" +msgstr "Aiuto" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__id +msgid "ID" +msgstr "ID" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_exception_icon +msgid "Icon" +msgstr "Icona" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "Icona per indicare un'attività eccezione." + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__message_needaction +#: model:ir.model.fields,help:sign_oca.field_sign_oca_template__message_needaction +msgid "If checked, new messages require your attention." +msgstr "Se selezionata, nuovi messaggi richiedono attenzione." + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__message_has_error +#: model:ir.model.fields,help:sign_oca.field_sign_oca_template__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "Se selezionata, alcuni messaggi hanno un errore di consegna." + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "" +"If you do a click over a field, you will be able to change the default " +"configurations of the field" +msgstr "" +"Se si fa clic su un campo, si potrà modificare la configurazione predefinita " +"del campo" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "" +"In order to add a new field, do a right click over the PDF page. You will be " +"able to select the field that you will import" +msgstr "" +"Per aggiungere un nuovo campo, fare un clic destro sulla pagina PDF. Si " +"potrà selezionare il campo che si vuole importare" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "" +"In order to add a new field, do a right click over the PDF page. You will be " +"able to select the field that you will import.\n" +" Then, you can move and resize the fields over the PDF page " +"using the move icons.\n" +" If you do a click over a field, you will be able to change " +"the default configurations of the field" +msgstr "" +"Per poter aggiungere un nuovo campo, fare un clic destro sulla pagina PDF. " +"Si potrà selezionare il campo che dovrà essere importato.\n" +" Quindi, si può muovere e ridimensionare i campi nella pagina " +"PDF utilizzando le icone movimento.\n" +" Se si fa un clic su un campo, si potranno modificare le " +"configurazioni predefinite del campo" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__inalterable_hash +msgid "Inalterability Hash" +msgstr "Hash inalterabilità" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__secure_sequence_number +msgid "Inalteralbility No Gap Sequence #" +msgstr "Sequenza senza salti inalterabilità n°" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__ip +msgid "Ip" +msgstr "IP" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__is_allow_signature +msgid "Is Allow Signature" +msgstr "È firma consentita" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_is_follower +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_is_follower +msgid "Is Follower" +msgstr "Segue" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__item_ids +msgid "Item" +msgstr "Elemento" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item____last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Late Activities" +msgstr "Attività in ritardo" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__latitude +msgid "Latitude" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_request_log +msgid "Log access and edition on requests" +msgstr "Registra accesso e modifica alle richieste" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_pdf_portal/sign_oca_pdf_portal.xml:0 +#: model_terms:ir.ui.view,arch_db:sign_oca.portal_sign_document_signed +#, python-format +msgid "Logo" +msgstr "Logo" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__longitude +msgid "Longitude" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_main_attachment_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_main_attachment_id +msgid "Main Attachment" +msgstr "Allegato principale" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_pdf/sign_oca_pdf.xml:0 +#, python-format +msgid "Main actions" +msgstr "Azioni principali" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__message +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__message +msgid "Message" +msgstr "Messaggio" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_has_error +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_has_error +msgid "Message Delivery error" +msgstr "Errore di consegna messaggio" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_ids +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_ids +msgid "Messages" +msgstr "Messaggi" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__model +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__model +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__model_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__model +msgid "Model" +msgstr "Modello" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "Scadenza mia attività" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "My Documents" +msgstr "I miei documenti" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "My Requests" +msgstr "Le mie richieste" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__partner_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__name +msgid "Name" +msgstr "Nome" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_pdf_common/sign_oca_pdf_common.esm.js:0 +#, python-format +msgid "Need a valid PDF to add signature fields !" +msgstr "Serve un PDF valido per aggiungere i campi firma!" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "New document to sign" +msgstr "Nuovo documento da firmare" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "Scadenza prossima attività" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_summary +msgid "Next Activity Summary" +msgstr "Riepilogo prossima attività" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_type_id +msgid "Next Activity Type" +msgstr "Tipo prossima attività" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__next_item_id +msgid "Next Item" +msgstr "Elemento successivo" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/xml/systray.xml:0 +#, python-format +msgid "No requests to sign." +msgstr "Nessuna richiesta di firma." + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_needaction_counter +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_needaction_counter +msgid "Number of Actions" +msgstr "Numero di azioni" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_has_error_counter +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_has_error_counter +msgid "Number of errors" +msgstr "Numero di errori" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__message_needaction_counter +#: model:ir.model.fields,help:sign_oca.field_sign_oca_template__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "Numero di messaggi che richiedono un'azione" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__message_has_error_counter +#: model:ir.model.fields,help:sign_oca.field_sign_oca_template__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "Numero di messaggi con errore di consegna" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__record_ref +msgid "Object" +msgstr "Oggetto" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_res_company__sign_oca_send_sign_request_copy +#: model:ir.model.fields,help:sign_oca.field_res_config_settings__sign_oca_send_sign_request_copy +#: model_terms:ir.ui.view,arch_db:sign_oca.res_config_settings_view_form +msgid "" +"Once all signers have signed the request, a copy of the final document will " +"be sent to each of them." +msgstr "" +"Una volta che tutti i firmatari avranno firmato la richiesta, una copia del " +"documento finale verrà inviata ad ognuno di loro." + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__page +msgid "Page" +msgstr "Pagina" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__partner_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__partner_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__partner_id +msgid "Partner" +msgstr "Partner" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__partner_selection_policy +msgid "Partner Selection Policy" +msgstr "Politica selezione partner" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/xml/systray.xml:0 +#, python-format +msgid "Pending" +msgstr "In attesa" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__placeholder +#, python-format +msgid "Placeholder" +msgstr "Segnaposto" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_pdf_portal/sign_oca_pdf_portal.xml:0 +#, python-format +msgid "Please Review And Act On This Document" +msgstr "Rivedere e operare su questo documento" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__access_url +msgid "Portal Access URL" +msgstr "URL accesso portale" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__position_x +msgid "Position X" +msgstr "Posizione X" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__position_y +msgid "Position Y" +msgstr "Posizione Y" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__request_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__request_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__request_ids +msgid "Request" +msgstr "Richiesta" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__request_count +msgid "Request Count" +msgstr "Conteggio richieste" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "Request cannot be signed" +msgstr "La richiesta non può essere firmata" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/xml/systray.xml:0 +#: model:ir.ui.menu,name:sign_oca.sign_oca_request_menu +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_form_view +#, python-format +msgid "Requests" +msgstr "Richieste" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__required +#, python-format +msgid "Required" +msgstr "Obbligatorio" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__res_id +msgid "Res" +msgstr "Res" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__user_id +msgid "Responsible" +msgstr "Responsabile" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_user_id +msgid "Responsible User" +msgstr "Utente responsabile" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_kanban_view +msgid "Restore" +msgstr "Ripristina" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__role_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__role_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__role_id +msgid "Role" +msgstr "Ruolo" + +#. module: sign_oca +#: model:ir.actions.act_window,name:sign_oca.sign_oca_role_act_window +#: model:ir.ui.menu,name:sign_oca.sign_oca_role_menu +msgid "Roles" +msgstr "Ruoli" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.esm.js:0 +#, python-format +msgid "Save" +msgstr "Salva" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__access_token +msgid "Security Token" +msgstr "Token di sicurezza" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_kanban_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_tree_view +msgid "Send" +msgstr "Invia" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_res_company__sign_oca_send_sign_request_copy +#: model:ir.model.fields,field_description:sign_oca.field_res_config_settings__sign_oca_send_sign_request_copy +msgid "Send signers a copy of the final signed document" +msgstr "Invia ai firmatari una copia del documento firmato" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_form_view +msgid "Send to sign" +msgstr "Invia alla firma" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request__state__sent +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Sent" +msgstr "Inviata" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__sequence_id +msgid "Sequence" +msgstr "Sequenza" + +#. module: sign_oca +#: model:ir.ui.menu,name:sign_oca.sign_oca_settings_menu +msgid "Settings" +msgstr "Impostazioni" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Show all records which has next action date is before today" +msgstr "Visualizza tutte le righe con l'azione successiva antecedente ad oggi" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_pdf/sign_oca_pdf.xml:0 +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__sign +#: model:ir.module.category,name:sign_oca.sign_oca_module_category +#: model:ir.ui.menu,name:sign_oca.sign_oca_root_menu +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_signer_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_tree_view +#, python-format +msgid "Sign" +msgstr "Firma" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__sign_now +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_kanban_view +msgid "Sign Now" +msgstr "Firma adesso" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.res_config_settings_view_form +msgid "Sign Oca" +msgstr "Firma OCA" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_template +msgid "Sign Oca Template" +msgstr "Firma modello OCA" + +#. module: sign_oca +#: model:ir.actions.act_window,name:sign_oca.sign_oca_template_generate_act_window +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_generate_form_view +msgid "Sign Oca Template Generate" +msgstr "Genera firma modello OCA" + +#. module: sign_oca +#: model:ir.actions.act_window,name:sign_oca.sign_oca_template_generate_multi_act_window +msgid "Sign Oca Template Generate Multi" +msgstr "Multi generazione firma modello OCA" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_template_item +msgid "Sign Oca Template Item" +msgstr "Elemento firma modello OCA" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_request +msgid "Sign Request" +msgstr "Firma richiesta" + +#. module: sign_oca +#: model:ir.actions.act_window,name:sign_oca.sign_oca_request_signer_act_window +msgid "Sign Request Signers" +msgstr "Firmatari richiesta firma" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_request_signer +msgid "Sign Request Value" +msgstr "Valore firma richiesta" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/xml/systray.xml:0 +#: model:ir.actions.act_window,name:sign_oca.sign_oca_request_act_window +#: model:ir.actions.act_window,name:sign_oca.sign_oca_request_log_act_window +#: model:ir.actions.act_window,name:sign_oca.sign_oca_request_template_act_window +#: model_terms:ir.ui.view,arch_db:sign_oca.res_config_settings_view_form +#: model_terms:ir.ui.view,arch_db:sign_oca.view_partner_form +#, python-format +msgid "Sign Requests" +msgstr "Firma richieste" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_role +msgid "Sign Role" +msgstr "Ruolo firma" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_mail +msgid "Sign document" +msgstr "Firma documento" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/js/sign_oca.esm.js:0 +#, python-format +msgid "Sign from template" +msgstr "Firma da modello" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_tree_view +msgid "Sign now" +msgstr "Firma adesso" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__signatory_data +msgid "Signatory Data" +msgstr "Data firmatario" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_field__field_type__signature +msgid "Signature" +msgstr "Firma" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_field +msgid "Signature Field Type" +msgstr "Tipo campo firma" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__signature_hash +msgid "Signature Hash" +msgstr "Hash firma" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "Signature configuration" +msgstr "Configurazione firma" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_template_generate_signer +msgid "Signature request signers" +msgstr "Firmatari richiesta firma" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__signed +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request__state__signed +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Signed" +msgstr "Firmato" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__signed_count +msgid "Signed Count" +msgstr "Conteggio firmati" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__signed_on +msgid "Signed On" +msgstr "Firmato il" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "Signed document" +msgstr "Documento firmato" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_res_partner__signer_ids +#: model:ir.model.fields,field_description:sign_oca.field_res_users__signer_ids +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__signer_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__signer_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__signer_ids +msgid "Signer" +msgstr "Firmatario" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_res_partner__signer_count +#: model:ir.model.fields,field_description:sign_oca.field_res_users__signer_count +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__signer_count +msgid "Signer Count" +msgstr "Conteggio firmatari" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__signer_ids +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_tree_view +msgid "Signers" +msgstr "Firmatari" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__state +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "State" +msgstr "Stato" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__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 "" +"Stato in base alle attività\n" +"Scaduto: la data richiesta è trascorsa\n" +"Oggi: la data attività è oggi\n" +"Pianificato: attività future." + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__template_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__template_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__template_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__template_id +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_kanban_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Template" +msgstr "Modello" + +#. module: sign_oca +#: model:ir.actions.act_window,name:sign_oca.sign_oca_template_act_window +#: model:ir.ui.menu,name:sign_oca.sign_oca_template_menu +msgid "Templates" +msgstr "Modelli" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_field__field_type__text +msgid "Text" +msgstr "Testo" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.portal_sign_document_signed +msgid "The document has been cancelled" +msgstr "Il documento è stato cancellato" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__signer_id +msgid "The signer related to the active user." +msgstr "Il firmatario relativo all'utente attivo." + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "" +"Then, you can move and resize the fields over the PDF page using the move " +"icons." +msgstr "" +"Quindi, si può muovere e ridimensionare i campi nella pagina PDF utilizzando " +"le icone movimento." + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "There are no signers, please fill them before configuring it" +msgstr "Non ci sono firmatari, compilarli prima di configurarli" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_role__partner_selection_policy +msgid "" +"This field is used to define how the partner will be calculated in the " +"different roles of a request. This field will be used when the 'Sign from " +"Template' action is triggered." +msgstr "" +"Questo campo è utilizzato per definire come il partner verra calcolato nei " +"diversi ruoli di una richiesta. Questo campo verrà utilizzato quanto è " +"attivata l'azione 'Firma da modello'." + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__to_sign +msgid "To Sign" +msgstr "Da firmare" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "To sign" +msgstr "Da firmare" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Today Activities" +msgstr "Attività odierne" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "Tipo di attività eccezione sul record." + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__uid +msgid "Uid" +msgstr "Uid" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/res_users.py:0 +#, python-format +msgid "Undefined" +msgstr "Non definito" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_res_users +msgid "User" +msgstr "Utente" + +#. module: sign_oca +#: model:res.groups,name:sign_oca.sign_oca_group_manager +msgid "User: All Documents" +msgstr "Utente: tutti i documenti" + +#. module: sign_oca +#: model:res.groups,name:sign_oca.sign_oca_group_user +msgid "User: Own Documents Only" +msgstr "Utente: solo i propri documenti" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "Users %s has already signed the document" +msgstr "L'utente %s ha già firmato il documento" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__validate +msgid "Validate" +msgstr "Valida" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_pdf_portal/sign_oca_pdf_portal.xml:0 +#, python-format +msgid "Validate & Send document" +msgstr "Valida e firma il documento" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__view +msgid "View Document" +msgstr "Visualizza documento" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__website_message_ids +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__website_message_ids +msgid "Website Messages" +msgstr "Messaggi sito web" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__website_message_ids +#: model:ir.model.fields,help:sign_oca.field_sign_oca_template__website_message_ids +msgid "Website communication history" +msgstr "Cronologia comunicazioni sito web" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__width +msgid "Width" +msgstr "Larghezza" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__wizard_id +msgid "Wizard" +msgstr "Procedura guidata" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "You are not allowed to sign this document." +msgstr "Non si è autorizzati alla firma di questo documento." + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "You can only configure requests in draft state" +msgstr "Si possono configurare richieste solo in stato bozza" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.portal_sign_document_signed +msgid "" +"You should have received an email with the final document.
\n" +" Check on your mailbox." +msgstr "" +"Dovrebbe aver ricevuto una e-mail con il documento finale.
\n" +" Controllare la casella postale." + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +msgid "" +"You will cancel the request and all the accesses. Are you sure about it?" +msgstr "Verrà cancellata la richiesta e tutti gli accessi. Si è sicuri?" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.portal_sign_document_signed +msgid "has already been signed" +msgstr "è già stato firmato" diff --git a/sign_oca/i18n/pt_BR.po b/sign_oca/i18n/pt_BR.po new file mode 100644 index 00000000..7492d80f --- /dev/null +++ b/sign_oca/i18n/pt_BR.po @@ -0,0 +1,1355 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sign_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\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: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "%(name)s (%(email)s) has sent the signed document." +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_mail +msgid "" +")\n" +" has requested your signature on a document." +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/xml/systray.xml:0 +#, python-format +msgid "0 Pending" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +msgid " Signed" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_mail +msgid "" +"Warning do not forward this email to other people!
\n" +" They will be able to access this document and sign it as " +"yourself.
" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__access_token +msgid "Access Token" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__access_warning +msgid "Access warning" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__action +msgid "Action" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_needaction +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__active +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__active +msgid "Active" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_ids +msgid "Activities" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +msgid "Activity Log" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_state +msgid "Activity State" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_type_icon +msgid "Activity Type Icon" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__add_field +msgid "Add field" +msgstr "" + +#. module: sign_oca +#: model:res.groups,name:sign_oca.sign_oca_group_admin +msgid "Administrator" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__altered_hash +msgid "Altered Hash" +msgstr "" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "" +"An error occurred when computing the inalterability. Impossible to get the " +"unique previous signer information." +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_kanban_view +msgid "Archive" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Archived" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.portal_sign_document_signed +msgid "" +"As soon as all signers have signed the document, you will receive an email " +"with the full document" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__ask_location +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__ask_location +msgid "Ask Location" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_attachment_count +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/elements/elements.xml:0 +#, python-format +msgid "" +"By clicking Adopt and Sign, I agree that the chosen signature/initials will " +"be a valid electronic representation of my hand-written signature/initials " +"for all purposes when it is used on documents, including legally binding " +"contracts." +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.esm.js:0 +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__cancel +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_generate_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_generate_multi_form_view +#, python-format +msgid "Cancel" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Canceled" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request__state__cancel +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +msgid "Cancelled" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_field__field_type__check +msgid "Check" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "Click on the field that you want to add" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_res_company +msgid "Companies" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__company_id +msgid "Company" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__configure +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_kanban_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_tree_view +msgid "Configure" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_res_partner +msgid "Contact" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__create +msgid "Create" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__create_uid +msgid "Created by" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__create_date +msgid "Created on" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__current_hash +msgid "Current Hash" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request_signer__access_url +msgid "Customer Portal URL" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__data +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__data +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__data +msgid "Data" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "Data is saved automatically when editing" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "Data is saved automatically when editing." +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__date +msgid "Date" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_role__partner_selection_policy__default +msgid "Default" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__default_value +msgid "Default Value" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__default_partner_id +msgid "Default partner" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.esm.js:0 +#, python-format +msgid "Delete" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__delete_field +msgid "Delete field" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_kanban_view +msgid "Details" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__display_name +msgid "Display Name" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.portal_sign_document_signed +msgid "Document" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__domain +msgid "Domain" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request__state__draft +msgid "Draft" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_kanban_view +msgid "Dropdown menu" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.esm.js:0 +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__edit_field +#, python-format +msgid "Edit field" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_role__partner_selection_policy__empty +msgid "Empty" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_role__expression_partner +msgid "Example: {{object.partner_id.id}}" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__expression_partner +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_role__partner_selection_policy__expression +msgid "Expression" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__field_id +#, python-format +msgid "Field" +msgstr "" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "Field %s is not filled" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__field_type +msgid "Field Type" +msgstr "" + +#. module: sign_oca +#: model:ir.actions.act_window,name:sign_oca.sign_oca_field_act_window +#: model:ir.ui.menu,name:sign_oca.sign_oca_field_menu +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_form_view +msgid "Fields" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__filename +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__filename +msgid "Filename" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "Filled by" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_follower_ids +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_partner_ids +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +msgid "Fully Signed" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Future Activities" +msgstr "" + +#. module: sign_oca +#: model:ir.actions.act_window,name:sign_oca.sign_oca_general_settings_act_window +msgid "General Settings" +msgstr "" + +#. module: sign_oca +#: model:ir.ui.menu,name:sign_oca.sign_oca_general_settings_menu +msgid "General settings" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_generate_multi_form_view +msgid "Generate" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_generate_form_view +msgid "Generate & sign" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_template_generate +msgid "Generate a signature request" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_template_generate_multi +msgid "Generate signature requests" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Group By" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__has_message +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__has_message +msgid "Has Message" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__height +msgid "Height" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "Help" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__id +msgid "ID" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_exception_icon +msgid "Icon" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__message_needaction +#: model:ir.model.fields,help:sign_oca.field_sign_oca_template__message_needaction +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__message_has_error +#: model:ir.model.fields,help:sign_oca.field_sign_oca_template__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "" +"If you do a click over a field, you will be able to change the default " +"configurations of the field" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "" +"In order to add a new field, do a right click over the PDF page. You will be " +"able to select the field that you will import" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "" +"In order to add a new field, do a right click over the PDF page. You will be " +"able to select the field that you will import.\n" +" Then, you can move and resize the fields over the PDF page " +"using the move icons.\n" +" If you do a click over a field, you will be able to change " +"the default configurations of the field" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__inalterable_hash +msgid "Inalterability Hash" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__secure_sequence_number +msgid "Inalteralbility No Gap Sequence #" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__ip +msgid "Ip" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__is_allow_signature +msgid "Is Allow Signature" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_is_follower +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__item_ids +msgid "Item" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item____last_update +msgid "Last Modified on" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__write_date +msgid "Last Updated on" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Late Activities" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__latitude +msgid "Latitude" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_request_log +msgid "Log access and edition on requests" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_pdf_portal/sign_oca_pdf_portal.xml:0 +#: model_terms:ir.ui.view,arch_db:sign_oca.portal_sign_document_signed +#, python-format +msgid "Logo" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__longitude +msgid "Longitude" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_main_attachment_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_main_attachment_id +msgid "Main Attachment" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_pdf/sign_oca_pdf.xml:0 +#, python-format +msgid "Main actions" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__message +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__message +msgid "Message" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_has_error +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_ids +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_ids +msgid "Messages" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__model +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__model +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__model_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__model +msgid "Model" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "My Documents" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "My Requests" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__partner_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__name +msgid "Name" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_pdf_common/sign_oca_pdf_common.esm.js:0 +#, python-format +msgid "Need a valid PDF to add signature fields !" +msgstr "" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "New document to sign" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_summary +msgid "Next Activity Summary" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_type_id +msgid "Next Activity Type" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__next_item_id +msgid "Next Item" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/xml/systray.xml:0 +#, python-format +msgid "No requests to sign." +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_needaction_counter +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_has_error_counter +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_has_error_counter +msgid "Number of errors" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__message_needaction_counter +#: model:ir.model.fields,help:sign_oca.field_sign_oca_template__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__message_has_error_counter +#: model:ir.model.fields,help:sign_oca.field_sign_oca_template__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__record_ref +msgid "Object" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_res_company__sign_oca_send_sign_request_copy +#: model:ir.model.fields,help:sign_oca.field_res_config_settings__sign_oca_send_sign_request_copy +#: model_terms:ir.ui.view,arch_db:sign_oca.res_config_settings_view_form +msgid "" +"Once all signers have signed the request, a copy of the final document will " +"be sent to each of them." +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__page +msgid "Page" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__partner_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__partner_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__partner_id +msgid "Partner" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__partner_selection_policy +msgid "Partner Selection Policy" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/xml/systray.xml:0 +#, python-format +msgid "Pending" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__placeholder +#, python-format +msgid "Placeholder" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_pdf_portal/sign_oca_pdf_portal.xml:0 +#, python-format +msgid "Please Review And Act On This Document" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__access_url +msgid "Portal Access URL" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__position_x +msgid "Position X" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__position_y +msgid "Position Y" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__request_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__request_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__request_ids +msgid "Request" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__request_count +msgid "Request Count" +msgstr "" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "Request cannot be signed" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/xml/systray.xml:0 +#: model:ir.ui.menu,name:sign_oca.sign_oca_request_menu +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_form_view +#, python-format +msgid "Requests" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__required +#, python-format +msgid "Required" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__res_id +msgid "Res" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__user_id +msgid "Responsible" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_user_id +msgid "Responsible User" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_kanban_view +msgid "Restore" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__role_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__role_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__role_id +msgid "Role" +msgstr "" + +#. module: sign_oca +#: model:ir.actions.act_window,name:sign_oca.sign_oca_role_act_window +#: model:ir.ui.menu,name:sign_oca.sign_oca_role_menu +msgid "Roles" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.esm.js:0 +#, python-format +msgid "Save" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__access_token +msgid "Security Token" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_kanban_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_tree_view +msgid "Send" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_res_company__sign_oca_send_sign_request_copy +#: model:ir.model.fields,field_description:sign_oca.field_res_config_settings__sign_oca_send_sign_request_copy +msgid "Send signers a copy of the final signed document" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_form_view +msgid "Send to sign" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request__state__sent +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Sent" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__sequence_id +msgid "Sequence" +msgstr "" + +#. module: sign_oca +#: model:ir.ui.menu,name:sign_oca.sign_oca_settings_menu +msgid "Settings" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Show all records which has next action date is before today" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_pdf/sign_oca_pdf.xml:0 +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__sign +#: model:ir.module.category,name:sign_oca.sign_oca_module_category +#: model:ir.ui.menu,name:sign_oca.sign_oca_root_menu +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_signer_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_tree_view +#, python-format +msgid "Sign" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__sign_now +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_kanban_view +msgid "Sign Now" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.res_config_settings_view_form +msgid "Sign Oca" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_template +msgid "Sign Oca Template" +msgstr "" + +#. module: sign_oca +#: model:ir.actions.act_window,name:sign_oca.sign_oca_template_generate_act_window +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_generate_form_view +msgid "Sign Oca Template Generate" +msgstr "" + +#. module: sign_oca +#: model:ir.actions.act_window,name:sign_oca.sign_oca_template_generate_multi_act_window +msgid "Sign Oca Template Generate Multi" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_template_item +msgid "Sign Oca Template Item" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_request +msgid "Sign Request" +msgstr "" + +#. module: sign_oca +#: model:ir.actions.act_window,name:sign_oca.sign_oca_request_signer_act_window +msgid "Sign Request Signers" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_request_signer +msgid "Sign Request Value" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/xml/systray.xml:0 +#: model:ir.actions.act_window,name:sign_oca.sign_oca_request_act_window +#: model:ir.actions.act_window,name:sign_oca.sign_oca_request_log_act_window +#: model:ir.actions.act_window,name:sign_oca.sign_oca_request_template_act_window +#: model_terms:ir.ui.view,arch_db:sign_oca.res_config_settings_view_form +#: model_terms:ir.ui.view,arch_db:sign_oca.view_partner_form +#, python-format +msgid "Sign Requests" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_role +msgid "Sign Role" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_mail +msgid "Sign document" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/js/sign_oca.esm.js:0 +#, python-format +msgid "Sign from template" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_tree_view +msgid "Sign now" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__signatory_data +msgid "Signatory Data" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_field__field_type__signature +msgid "Signature" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_field +msgid "Signature Field Type" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__signature_hash +msgid "Signature Hash" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "Signature configuration" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_template_generate_signer +msgid "Signature request signers" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__signed +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request__state__signed +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Signed" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__signed_count +msgid "Signed Count" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__signed_on +msgid "Signed On" +msgstr "" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "Signed document" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_res_partner__signer_ids +#: model:ir.model.fields,field_description:sign_oca.field_res_users__signer_ids +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__signer_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__signer_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__signer_ids +msgid "Signer" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_res_partner__signer_count +#: model:ir.model.fields,field_description:sign_oca.field_res_users__signer_count +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__signer_count +msgid "Signer Count" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__signer_ids +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_tree_view +msgid "Signers" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__state +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "State" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__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 "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__template_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__template_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__template_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__template_id +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_kanban_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Template" +msgstr "" + +#. module: sign_oca +#: model:ir.actions.act_window,name:sign_oca.sign_oca_template_act_window +#: model:ir.ui.menu,name:sign_oca.sign_oca_template_menu +msgid "Templates" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_field__field_type__text +msgid "Text" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.portal_sign_document_signed +msgid "The document has been cancelled" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__signer_id +msgid "The signer related to the active user." +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "" +"Then, you can move and resize the fields over the PDF page using the move " +"icons." +msgstr "" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "There are no signers, please fill them before configuring it" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_role__partner_selection_policy +msgid "" +"This field is used to define how the partner will be calculated in the " +"different roles of a request. This field will be used when the 'Sign from " +"Template' action is triggered." +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__to_sign +msgid "To Sign" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "To sign" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Today Activities" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__uid +msgid "Uid" +msgstr "" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/res_users.py:0 +#, python-format +msgid "Undefined" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_res_users +msgid "User" +msgstr "" + +#. module: sign_oca +#: model:res.groups,name:sign_oca.sign_oca_group_manager +msgid "User: All Documents" +msgstr "" + +#. module: sign_oca +#: model:res.groups,name:sign_oca.sign_oca_group_user +msgid "User: Own Documents Only" +msgstr "" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "Users %s has already signed the document" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__validate +msgid "Validate" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_pdf_portal/sign_oca_pdf_portal.xml:0 +#, python-format +msgid "Validate & Send document" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__view +msgid "View Document" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__website_message_ids +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__website_message_ids +msgid "Website Messages" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__website_message_ids +#: model:ir.model.fields,help:sign_oca.field_sign_oca_template__website_message_ids +msgid "Website communication history" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__width +msgid "Width" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__wizard_id +msgid "Wizard" +msgstr "" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "You are not allowed to sign this document." +msgstr "" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "You can only configure requests in draft state" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.portal_sign_document_signed +msgid "" +"You should have received an email with the final document.
\n" +" Check on your mailbox." +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +msgid "" +"You will cancel the request and all the accesses. Are you sure about it?" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.portal_sign_document_signed +msgid "has already been signed" +msgstr "" diff --git a/sign_oca/i18n/sign_oca.pot b/sign_oca/i18n/sign_oca.pot new file mode 100644 index 00000000..0ee0ad47 --- /dev/null +++ b/sign_oca/i18n/sign_oca.pot @@ -0,0 +1,1352 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sign_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "%(name)s (%(email)s) has sent the signed document." +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_mail +msgid "" +")\n" +" has requested your signature on a document." +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/xml/systray.xml:0 +#, python-format +msgid "0 Pending" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +msgid " Signed" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_mail +msgid "" +"Warning do not forward this email to other people!
\n" +" They will be able to access this document and sign it as yourself.
" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__access_token +msgid "Access Token" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__access_warning +msgid "Access warning" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__action +msgid "Action" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_needaction +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__active +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__active +msgid "Active" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_ids +msgid "Activities" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +msgid "Activity Log" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_state +msgid "Activity State" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_type_icon +msgid "Activity Type Icon" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__add_field +msgid "Add field" +msgstr "" + +#. module: sign_oca +#: model:res.groups,name:sign_oca.sign_oca_group_admin +msgid "Administrator" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__altered_hash +msgid "Altered Hash" +msgstr "" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "" +"An error occurred when computing the inalterability. Impossible to get the " +"unique previous signer information." +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_kanban_view +msgid "Archive" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Archived" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.portal_sign_document_signed +msgid "" +"As soon as all signers have signed the document, you will receive an email " +"with the full document" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__ask_location +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__ask_location +msgid "Ask Location" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_attachment_count +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/elements/elements.xml:0 +#, python-format +msgid "" +"By clicking Adopt and Sign, I agree that the chosen signature/initials will " +"be a valid electronic representation of my hand-written signature/initials " +"for all purposes when it is used on documents, including legally binding " +"contracts." +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.esm.js:0 +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__cancel +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_generate_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_generate_multi_form_view +#, python-format +msgid "Cancel" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Canceled" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request__state__cancel +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +msgid "Cancelled" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_field__field_type__check +msgid "Check" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "Click on the field that you want to add" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_res_company +msgid "Companies" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__company_id +msgid "Company" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__configure +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_kanban_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_tree_view +msgid "Configure" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_res_partner +msgid "Contact" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__create +msgid "Create" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__create_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__create_uid +msgid "Created by" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__create_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__create_date +msgid "Created on" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__current_hash +msgid "Current Hash" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request_signer__access_url +msgid "Customer Portal URL" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__data +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__data +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__data +msgid "Data" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "Data is saved automatically when editing" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "Data is saved automatically when editing." +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__date +msgid "Date" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_role__partner_selection_policy__default +msgid "Default" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__default_value +msgid "Default Value" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__default_partner_id +msgid "Default partner" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.esm.js:0 +#, python-format +msgid "Delete" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__delete_field +msgid "Delete field" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_kanban_view +msgid "Details" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__display_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__display_name +msgid "Display Name" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.portal_sign_document_signed +msgid "Document" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__domain +msgid "Domain" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request__state__draft +msgid "Draft" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_kanban_view +msgid "Dropdown menu" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.esm.js:0 +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__edit_field +#, python-format +msgid "Edit field" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_role__partner_selection_policy__empty +msgid "Empty" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_role__expression_partner +msgid "Example: {{object.partner_id.id}}" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__expression_partner +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_role__partner_selection_policy__expression +msgid "Expression" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__field_id +#, python-format +msgid "Field" +msgstr "" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "Field %s is not filled" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__field_type +msgid "Field Type" +msgstr "" + +#. module: sign_oca +#: model:ir.actions.act_window,name:sign_oca.sign_oca_field_act_window +#: model:ir.ui.menu,name:sign_oca.sign_oca_field_menu +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_form_view +msgid "Fields" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__filename +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__filename +msgid "Filename" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "Filled by" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_follower_ids +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_partner_ids +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +msgid "Fully Signed" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Future Activities" +msgstr "" + +#. module: sign_oca +#: model:ir.actions.act_window,name:sign_oca.sign_oca_general_settings_act_window +msgid "General Settings" +msgstr "" + +#. module: sign_oca +#: model:ir.ui.menu,name:sign_oca.sign_oca_general_settings_menu +msgid "General settings" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_generate_multi_form_view +msgid "Generate" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_generate_form_view +msgid "Generate & sign" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_template_generate +msgid "Generate a signature request" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_template_generate_multi +msgid "Generate signature requests" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Group By" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__has_message +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__has_message +msgid "Has Message" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__height +msgid "Height" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "Help" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__id +msgid "ID" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_exception_icon +msgid "Icon" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__message_needaction +#: model:ir.model.fields,help:sign_oca.field_sign_oca_template__message_needaction +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__message_has_error +#: model:ir.model.fields,help:sign_oca.field_sign_oca_template__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "" +"If you do a click over a field, you will be able to change the default " +"configurations of the field" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "" +"In order to add a new field, do a right click over the PDF page. You will be" +" able to select the field that you will import" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "" +"In order to add a new field, do a right click over the PDF page. You will be able to select the field that you will import.\n" +" Then, you can move and resize the fields over the PDF page using the move icons.\n" +" If you do a click over a field, you will be able to change the default configurations of the field" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__inalterable_hash +msgid "Inalterability Hash" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__secure_sequence_number +msgid "Inalteralbility No Gap Sequence #" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__ip +msgid "Ip" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__is_allow_signature +msgid "Is Allow Signature" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_is_follower +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__item_ids +msgid "Item" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer____last_update +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item____last_update +msgid "Last Modified on" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__write_uid +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__write_date +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__write_date +msgid "Last Updated on" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Late Activities" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__latitude +msgid "Latitude" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_request_log +msgid "Log access and edition on requests" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_pdf_portal/sign_oca_pdf_portal.xml:0 +#: model_terms:ir.ui.view,arch_db:sign_oca.portal_sign_document_signed +#, python-format +msgid "Logo" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__longitude +msgid "Longitude" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_main_attachment_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_main_attachment_id +msgid "Main Attachment" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_pdf/sign_oca_pdf.xml:0 +#, python-format +msgid "Main actions" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__message +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__message +msgid "Message" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_has_error +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_ids +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_ids +msgid "Messages" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__model +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__model +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__model_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__model +msgid "Model" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "My Documents" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "My Requests" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_field__name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__partner_name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__name +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__name +msgid "Name" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_pdf_common/sign_oca_pdf_common.esm.js:0 +#, python-format +msgid "Need a valid PDF to add signature fields !" +msgstr "" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "New document to sign" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_summary +msgid "Next Activity Summary" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_type_id +msgid "Next Activity Type" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__next_item_id +msgid "Next Item" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/xml/systray.xml:0 +#, python-format +msgid "No requests to sign." +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_needaction_counter +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__message_has_error_counter +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__message_has_error_counter +msgid "Number of errors" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__message_needaction_counter +#: model:ir.model.fields,help:sign_oca.field_sign_oca_template__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__message_has_error_counter +#: model:ir.model.fields,help:sign_oca.field_sign_oca_template__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__record_ref +msgid "Object" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_res_company__sign_oca_send_sign_request_copy +#: model:ir.model.fields,help:sign_oca.field_res_config_settings__sign_oca_send_sign_request_copy +#: model_terms:ir.ui.view,arch_db:sign_oca.res_config_settings_view_form +msgid "" +"Once all signers have signed the request, a copy of the final document will " +"be sent to each of them." +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__page +msgid "Page" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__partner_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__partner_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__partner_id +msgid "Partner" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_role__partner_selection_policy +msgid "Partner Selection Policy" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/xml/systray.xml:0 +#, python-format +msgid "Pending" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__placeholder +#, python-format +msgid "Placeholder" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_pdf_portal/sign_oca_pdf_portal.xml:0 +#, python-format +msgid "Please Review And Act On This Document" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__access_url +msgid "Portal Access URL" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__position_x +msgid "Position X" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__position_y +msgid "Position Y" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__request_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__request_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__request_ids +msgid "Request" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__request_count +msgid "Request Count" +msgstr "" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "Request cannot be signed" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/xml/systray.xml:0 +#: model:ir.ui.menu,name:sign_oca.sign_oca_request_menu +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_form_view +#, python-format +msgid "Requests" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__required +#, python-format +msgid "Required" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__res_id +msgid "Res" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__user_id +msgid "Responsible" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__activity_user_id +msgid "Responsible User" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_kanban_view +msgid "Restore" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__role_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__role_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__role_id +msgid "Role" +msgstr "" + +#. module: sign_oca +#: model:ir.actions.act_window,name:sign_oca.sign_oca_role_act_window +#: model:ir.ui.menu,name:sign_oca.sign_oca_role_menu +msgid "Roles" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.esm.js:0 +#, python-format +msgid "Save" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__access_token +msgid "Security Token" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_kanban_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_tree_view +msgid "Send" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_res_company__sign_oca_send_sign_request_copy +#: model:ir.model.fields,field_description:sign_oca.field_res_config_settings__sign_oca_send_sign_request_copy +msgid "Send signers a copy of the final signed document" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_form_view +msgid "Send to sign" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request__state__sent +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Sent" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__sequence_id +msgid "Sequence" +msgstr "" + +#. module: sign_oca +#: model:ir.ui.menu,name:sign_oca.sign_oca_settings_menu +msgid "Settings" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Show all records which has next action date is before today" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_pdf/sign_oca_pdf.xml:0 +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__sign +#: model:ir.module.category,name:sign_oca.sign_oca_module_category +#: model:ir.ui.menu,name:sign_oca.sign_oca_root_menu +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_signer_form_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_tree_view +#, python-format +msgid "Sign" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__sign_now +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_kanban_view +msgid "Sign Now" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.res_config_settings_view_form +msgid "Sign Oca" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_template +msgid "Sign Oca Template" +msgstr "" + +#. module: sign_oca +#: model:ir.actions.act_window,name:sign_oca.sign_oca_template_generate_act_window +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_generate_form_view +msgid "Sign Oca Template Generate" +msgstr "" + +#. module: sign_oca +#: model:ir.actions.act_window,name:sign_oca.sign_oca_template_generate_multi_act_window +msgid "Sign Oca Template Generate Multi" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_template_item +msgid "Sign Oca Template Item" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_request +msgid "Sign Request" +msgstr "" + +#. module: sign_oca +#: model:ir.actions.act_window,name:sign_oca.sign_oca_request_signer_act_window +msgid "Sign Request Signers" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_request_signer +msgid "Sign Request Value" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/xml/systray.xml:0 +#: code:addons/sign_oca/static/src/xml/systray.xml:0 +#: model:ir.actions.act_window,name:sign_oca.sign_oca_request_act_window +#: model:ir.actions.act_window,name:sign_oca.sign_oca_request_log_act_window +#: model:ir.actions.act_window,name:sign_oca.sign_oca_request_template_act_window +#: model_terms:ir.ui.view,arch_db:sign_oca.res_config_settings_view_form +#: model_terms:ir.ui.view,arch_db:sign_oca.view_partner_form +#, python-format +msgid "Sign Requests" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_role +msgid "Sign Role" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_mail +msgid "Sign document" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/js/sign_oca.esm.js:0 +#, python-format +msgid "Sign from template" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_template_tree_view +msgid "Sign now" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__signatory_data +msgid "Signatory Data" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_field__field_type__signature +msgid "Signature" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_field +msgid "Signature Field Type" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__signature_hash +msgid "Signature Hash" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "Signature configuration" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_sign_oca_template_generate_signer +msgid "Signature request signers" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__signed +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request__state__signed +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Signed" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__signed_count +msgid "Signed Count" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_signer__signed_on +msgid "Signed On" +msgstr "" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "Signed document" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_res_partner__signer_ids +#: model:ir.model.fields,field_description:sign_oca.field_res_users__signer_ids +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__signer_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__signer_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__signer_ids +msgid "Signer" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_res_partner__signer_count +#: model:ir.model.fields,field_description:sign_oca.field_res_users__signer_count +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__signer_count +msgid "Signer Count" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__signer_ids +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_tree_view +msgid "Signers" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__state +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "State" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__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 "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__template_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate__template_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_multi__template_id +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__template_id +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_kanban_view +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Template" +msgstr "" + +#. module: sign_oca +#: model:ir.actions.act_window,name:sign_oca.sign_oca_template_act_window +#: model:ir.ui.menu,name:sign_oca.sign_oca_template_menu +msgid "Templates" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_field__field_type__text +msgid "Text" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.portal_sign_document_signed +msgid "The document has been cancelled" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__signer_id +msgid "The signer related to the active user." +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml:0 +#, python-format +msgid "" +"Then, you can move and resize the fields over the PDF page using the move " +"icons." +msgstr "" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "There are no signers, please fill them before configuring it" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_role__partner_selection_policy +msgid "" +"This field is used to define how the partner will be calculated in the " +"different roles of a request. This field will be used when the 'Sign from " +"Template' action is triggered." +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__to_sign +msgid "To Sign" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "To sign" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_search_view +msgid "Today Activities" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request_log__uid +msgid "Uid" +msgstr "" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/res_users.py:0 +#, python-format +msgid "Undefined" +msgstr "" + +#. module: sign_oca +#: model:ir.model,name:sign_oca.model_res_users +msgid "User" +msgstr "" + +#. module: sign_oca +#: model:res.groups,name:sign_oca.sign_oca_group_manager +msgid "User: All Documents" +msgstr "" + +#. module: sign_oca +#: model:res.groups,name:sign_oca.sign_oca_group_user +msgid "User: Own Documents Only" +msgstr "" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "Users %s has already signed the document" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__validate +msgid "Validate" +msgstr "" + +#. module: sign_oca +#. odoo-javascript +#: code:addons/sign_oca/static/src/components/sign_oca_pdf_portal/sign_oca_pdf_portal.xml:0 +#, python-format +msgid "Validate & Send document" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields.selection,name:sign_oca.selection__sign_oca_request_log__action__view +msgid "View Document" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_request__website_message_ids +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template__website_message_ids +msgid "Website Messages" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,help:sign_oca.field_sign_oca_request__website_message_ids +#: model:ir.model.fields,help:sign_oca.field_sign_oca_template__website_message_ids +msgid "Website communication history" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_item__width +msgid "Width" +msgstr "" + +#. module: sign_oca +#: model:ir.model.fields,field_description:sign_oca.field_sign_oca_template_generate_signer__wizard_id +msgid "Wizard" +msgstr "" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "You are not allowed to sign this document." +msgstr "" + +#. module: sign_oca +#. odoo-python +#: code:addons/sign_oca/models/sign_oca_request.py:0 +#, python-format +msgid "You can only configure requests in draft state" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.portal_sign_document_signed +msgid "" +"You should have received an email with the final document.
\n" +" Check on your mailbox." +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.sign_oca_request_form_view +msgid "" +"You will cancel the request and all the accesses. Are you sure about it?" +msgstr "" + +#. module: sign_oca +#: model_terms:ir.ui.view,arch_db:sign_oca.portal_sign_document_signed +msgid "has already been signed" +msgstr "" diff --git a/sign_oca/models/__init__.py b/sign_oca/models/__init__.py new file mode 100644 index 00000000..1cbaaba0 --- /dev/null +++ b/sign_oca/models/__init__.py @@ -0,0 +1,7 @@ +from . import res_company +from . import res_users +from . import res_partner +from . import sign_oca_template +from . import sign_oca_role +from . import sign_oca_field +from . import sign_oca_request diff --git a/sign_oca/models/res_company.py b/sign_oca/models/res_company.py new file mode 100644 index 00000000..6b21ca54 --- /dev/null +++ b/sign_oca/models/res_company.py @@ -0,0 +1,14 @@ +# Copyright 2024 ForgeFlow S.L. (http://www.forgeflow.com) +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +from odoo import fields, models + + +class ResCompany(models.Model): + _inherit = "res.company" + + sign_oca_send_sign_request_copy = fields.Boolean( + string="Send signers a copy of the final signed document", + help="Once all signers have signed the request, a copy of " + "the final document will be sent to each of them.", + ) diff --git a/sign_oca/models/res_partner.py b/sign_oca/models/res_partner.py new file mode 100644 index 00000000..f39b8ca9 --- /dev/null +++ b/sign_oca/models/res_partner.py @@ -0,0 +1,25 @@ +# Copyright 2024 ForgeFlow S.L. (http://www.forgeflow.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResPartner(models.Model): + _inherit = "res.partner" + + signer_ids = fields.One2many( + comodel_name="sign.oca.request.signer", inverse_name="partner_id" + ) + signer_count = fields.Integer(compute="_compute_signers_count") + + def _compute_signers_count(self): + for rec in self: + rec.signer_count = len(rec.signer_ids) + + def action_show_signer_ids(self): + self.ensure_one() + result = self.env["ir.actions.act_window"]._for_xml_id( + "sign_oca.sign_oca_request_signer_act_window" + ) + result["domain"] = [("id", "in", self.signer_ids.ids)] + return result diff --git a/sign_oca/models/res_users.py b/sign_oca/models/res_users.py new file mode 100644 index 00000000..08285a48 --- /dev/null +++ b/sign_oca/models/res_users.py @@ -0,0 +1,56 @@ +# Copyright 2023-2024 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import _, api, models, modules + + +class ResUsers(models.Model): + _inherit = "res.users" + + @api.model + def sign_oca_request_user_count(self): + requests = {} + domain = [ + ("request_id.state", "=", "sent"), + ( + "partner_id", + "child_of", + [self.env.user.partner_id.commercial_partner_id.id], + ), + ("signed_on", "=", False), + ] + signer_model = self.env["sign.oca.request.signer"] + signer_groups = signer_model.read_group(domain, ["model"], ["model"]) + for signer_group in signer_groups: + if signer_group["model"]: + model = signer_group["model"] + Model = self.env[model].with_user(self.env.user) + signers = signer_model.search(signer_group.get("__domain")) + if signers: + total_records = Model.with_context(active_test=False).search_count( + [("id", "in", signers.mapped("res_id"))] + ) + if total_records > 0: + record = self.env[model] + model_id = ( + self.env["ir.model"].sudo().search([("model", "=", model)]) + ) + requests[model] = { + "id": model_id.id, + "name": record._description, + "model": model, + "icon": modules.module.get_module_icon( + record._original_module + ), + "total_records": total_records, + } + else: + signers = signer_model.search(signer_group.get("__domain")) + requests["undefined"] = { + "id": False, + "name": _("Undefined"), + "model": "sign.oca.request", + "icon": modules.module.get_module_icon("sign_oca"), + "total_records": len(signers), + } + return list(requests.values()) diff --git a/sign_oca/models/sign_oca_field.py b/sign_oca/models/sign_oca_field.py new file mode 100644 index 00000000..05736ff0 --- /dev/null +++ b/sign_oca/models/sign_oca_field.py @@ -0,0 +1,17 @@ +# Copyright 2023 Dixmit +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class SignOcaField(models.Model): + _name = "sign.oca.field" + _description = "Signature Field Type" + + name = fields.Char(required=True) + field_type = fields.Selection( + [("text", "Text"), ("signature", "Signature"), ("check", "Check")], + required=True, + default="text", + ) + default_value = fields.Char() diff --git a/sign_oca/models/sign_oca_request.py b/sign_oca/models/sign_oca_request.py new file mode 100644 index 00000000..811fd148 --- /dev/null +++ b/sign_oca/models/sign_oca_request.py @@ -0,0 +1,678 @@ +# Copyright 2023 Dixmit +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import hashlib +import json +from base64 import b64decode, b64encode +from hashlib import sha256 +from io import BytesIO + +from PyPDF2 import PdfFileReader, PdfFileWriter +from reportlab.graphics.shapes import Drawing, Line, Rect +from reportlab.lib.colors import black, transparent +from reportlab.lib.styles import ParagraphStyle +from reportlab.pdfgen import canvas +from reportlab.platypus import Image, Paragraph + +from odoo import _, api, fields, models +from odoo.exceptions import UserError, ValidationError +from odoo.http import request +from odoo.tools import float_repr + + +class SignOcaRequest(models.Model): + _name = "sign.oca.request" + _inherit = ["mail.thread", "mail.activity.mixin"] + _description = "Sign Request" + + name = fields.Char(required=True) + active = fields.Boolean(default=True) + template_id = fields.Many2one("sign.oca.template") + data = fields.Binary(required=True) + filename = fields.Char() + user_id = fields.Many2one( + comodel_name="res.users", + string="Responsible", + default=lambda self: self.env.user, + required=True, + ) + record_ref = fields.Reference( + lambda self: [ + (m.model, m.name) + for m in self.env["ir.model"] + .sudo() + .search([("transient", "=", False), ("model", "not like", "sign.oca")]) + ], + string="Object", + ) + signed = fields.Boolean(copy=False) + signer_ids = fields.One2many( + "sign.oca.request.signer", + inverse_name="request_id", + auto_join=True, + copy=True, + string="Signers", + ) + signer_id = fields.Many2one( + comodel_name="sign.oca.request.signer", + compute="_compute_signer_id", + help="The signer related to the active user.", + string="Signer", + ) + state = fields.Selection( + [ + ("draft", "Draft"), + ("sent", "Sent"), + ("signed", "Signed"), + ("cancel", "Cancelled"), + ], + default="draft", + required=True, + copy=False, + tracking=True, + ) + signed_count = fields.Integer(compute="_compute_signed_count") + signer_count = fields.Integer(compute="_compute_signer_count") + to_sign = fields.Boolean(compute="_compute_to_sign") + signatory_data = fields.Serialized( + default=lambda r: {}, + copy=False, + ) + current_hash = fields.Char(copy=False) + company_id = fields.Many2one( + "res.company", + default=lambda r: r.env.company.id, + required=True, + ) + next_item_id = fields.Integer(compute="_compute_next_item_id") + ask_location = fields.Boolean() + + @api.depends("signer_ids") + @api.depends_context("uid") + def _compute_signer_id(self): + user = self.env.user + for record in self: + user_diff_roles = record.signer_ids.filtered( + lambda x: x.partner_id == user.partner_id.commercial_partner_id + ) + record.signer_id = ( + fields.first(user_diff_roles.filtered(lambda x: x.is_allow_signature)) + if user_diff_roles.filtered(lambda x: x.is_allow_signature) + else fields.first(user_diff_roles) + ) + + @api.depends( + "signer_ids", + "signer_ids.is_allow_signature", + ) + @api.depends_context("uid") + def _compute_to_sign(self): + for record in self: + record.to_sign = ( + record.signer_id.is_allow_signature if record.signer_id else False + ) + + def sign(self): + self.ensure_one() + if not self.signer_id: + return self.get_formview_action() + return self.signer_id.sign() + + @api.depends("signatory_data") + def _compute_next_item_id(self): + for record in self: + record.next_item_id = ( + record.signatory_data + and max([int(key) for key in record.signatory_data.keys()]) + or 0 + ) + 1 + + def preview(self): + self.ensure_one() + self._set_action_log("view") + return { + "type": "ir.actions.client", + "tag": "sign_oca_preview", + "name": self.name, + "params": { + "res_model": self._name, + "res_id": self.id, + }, + } + + def get_info(self): + self.ensure_one() + return { + "name": self.name, + "items": self.signatory_data, + "roles": [ + {"id": signer.role_id.id, "name": signer.role_id.name} + for signer in self.signer_ids + ], + "fields": [ + {"id": field.id, "name": field.name} + for field in self.env["sign.oca.field"].search([]) + ], + } + + def _ensure_draft(self): + self.ensure_one() + if not self.signer_ids: + raise ValidationError( + _("There are no signers, please fill them before configuring it") + ) + if not self.state == "draft": + raise ValidationError(_("You can only configure requests in draft state")) + + def configure(self): + self._ensure_draft() + self._set_action_log("configure") + return { + "type": "ir.actions.client", + "tag": "sign_oca_configure", + "name": self.name, + "params": { + "res_model": self._name, + "res_id": self.id, + }, + } + + def delete_item(self, item_id): + self._ensure_draft() + data = self.signatory_data + data.pop(str(item_id)) + self.signatory_data = data + self._set_action_log("delete_field") + + def set_item_data(self, item_id, vals): + self._ensure_draft() + data = self.signatory_data + data[str(item_id)].update(vals) + self.signatory_data = data + self._set_action_log("edit_field") + + def add_item(self, item_vals): + self._ensure_draft() + item_id = self.next_item_id + field_id = self.env["sign.oca.field"].browse(item_vals["field_id"]) + signatory_data = self.signatory_data + signatory_data[item_id] = { + "id": item_id, + "field_id": field_id.id, + "field_type": field_id.field_type, + "required": False, + "name": field_id.name, + "role_id": self.signer_ids[0].role_id.id, + "page": 1, + "position_x": 0, + "position_y": 0, + "width": 0, + "height": 0, + "value": False, + "default_value": field_id.default_value, + "placeholder": "", + } + signatory_data[item_id].update(item_vals) + self.signatory_data = signatory_data + self._set_action_log("add_field") + return signatory_data[item_id] + + def cancel(self): + self.write({"state": "cancel"}) + self._set_action_log("cancel") + + @api.depends("signer_ids") + def _compute_signer_count(self): + for record in self: + record.signer_count = len(record.signer_ids) + + @api.depends("signer_ids", "signer_ids.signed_on") + def _compute_signed_count(self): + for record in self: + record.signed_count = len(record.signer_ids.filtered(lambda r: r.signed_on)) + + def open_template(self): + return self.template_id.configure() + + def action_send(self, sign_now=False, message=""): + self.ensure_one() + if self.state != "draft": + return + self._set_action_log("validate") + self.state = "sent" + for signer in self.signer_ids: + signer._portal_ensure_token() + if sign_now and signer.partner_id == self.env.user.partner_id: + continue + render_result = self.env["ir.qweb"]._render( + "sign_oca.sign_oca_template_mail", + {"record": signer, "body": message, "link": signer.access_url}, + engine="ir.qweb", + minimal_qcontext=True, + ) + self.env["mail.thread"].message_notify( + body=render_result, + partner_ids=signer.partner_id.ids, + subject=_("New document to sign"), + subtype_id=self.env.ref("mail.mt_comment").id, + mail_auto_delete=False, + email_layout_xmlid="mail.mail_notification_light", + ) + + def action_send_signed_request(self): + self.ensure_one() + if ( + self.state != "signed" + or not self.env.company.sign_oca_send_sign_request_copy + ): + return + for signer in self.signer_ids: + attachments = ( + self.env["ir.attachment"] + .sudo() + .search( + [ + ("res_model", "=", "sign.oca.request"), + ("res_id", "=", self.id), + ("res_field", "=", "data"), + ] + ) + ) + # The message will not be linked to the record because we do not want + # it happen. + self.env["mail.thread"].message_notify( + body=_( + "%(name)s (%(email)s) has sent the signed document.", + name=self.create_uid.name, + email=self.create_uid.email, + ), + partner_ids=signer.partner_id.ids, + subject=_("Signed document"), + subtype_id=self.env.ref("mail.mt_comment").id, + mail_auto_delete=False, + attachment_ids=attachments.ids, + ) + + def _check_signed(self): + self.ensure_one() + if self.state != "sent": + return + if all(self.mapped("signer_ids.signed_on")): + self.state = "signed" + + def _set_action_log_vals(self, action, **kwargs): + vals = kwargs.copy() + vals.update( + {"action": action, "request_id": self.id, "ip": self._get_action_log_ip()} + ) + return vals + + def _get_action_log_ip(self): + if not request or not hasattr(request, "httprequest"): + # This comes from a server call. Set as localhost + return "0.0.0.0" + return request.httprequest.access_route[-1] + + def _set_action_log(self, action, **kwargs): + self.ensure_one() + return ( + self.env["sign.oca.request.log"] + .sudo() + .create(self._set_action_log_vals(action, **kwargs)) + ) + + @api.model_create_multi + def create(self, vals_list): + records = super().create(vals_list) + for record in records: + record._set_action_log("create") + return records + + +class SignOcaRequestSigner(models.Model): + _name = "sign.oca.request.signer" + _inherit = "portal.mixin" + _description = "Sign Request Value" + + data = fields.Binary(related="request_id.data") + request_id = fields.Many2one("sign.oca.request", required=True, ondelete="cascade") + partner_name = fields.Char(related="partner_id.name") + partner_id = fields.Many2one("res.partner", required=True, ondelete="restrict") + role_id = fields.Many2one("sign.oca.role", required=True, ondelete="restrict") + signed_on = fields.Datetime() + signature_hash = fields.Char() + model = fields.Char(compute="_compute_model", store=True) + res_id = fields.Integer(compute="_compute_res_id", store=True) + is_allow_signature = fields.Boolean(compute="_compute_is_allow_signature") + secure_sequence_number = fields.Integer( + string="Inalteralbility No Gap Sequence #", + readonly=True, + copy=False, + index=True, + ) + inalterable_hash = fields.Char( + string="Inalterability Hash", readonly=True, copy=False + ) + sequence_id = fields.Many2one( + "ir.sequence", copy=False, default=lambda r: r._get_sequence() + ) + altered_hash = fields.Boolean(compute="_compute_altered_hash") + latitude = fields.Float() + longitude = fields.Float() + + @api.depends("request_id.record_ref") + def _compute_model(self): + for item in self.filtered(lambda x: x.request_id.record_ref): + item.model = item.request_id.record_ref._name + + @api.depends("request_id.record_ref") + def _compute_res_id(self): + for item in self.filtered(lambda x: x.request_id.record_ref): + item.res_id = item.request_id.record_ref.id + + @api.depends("signed_on", "partner_id") + @api.depends_context("uid") + def _compute_is_allow_signature(self): + user = self.env.user + for item in self: + item.is_allow_signature = bool( + not item.signed_on and item.partner_id == user.partner_id + ) + + @api.depends("access_token") + def _compute_access_url(self): + result = super()._compute_access_url() + for record in self: + record.access_url = f"/sign_oca/document/{record.id}/{record.access_token}" + return result + + @api.onchange("role_id") + def _onchange_role_id(self): + for item in self: + item.partner_id = item.role_id._get_partner_from_record( + item.request_id.record_ref + ) + + def get_info(self, access_token=False): + self.ensure_one() + self._set_action_log("view", access_token=access_token) + return { + "role_id": self.role_id.id if not self.signed_on else False, + "name": self.request_id.template_id.name, + "items": self.request_id.signatory_data, + "to_sign": self.request_id.to_sign, + "ask_location": self.request_id.ask_location, + "partner": { + "id": self.partner_id.id, + "name": self.partner_id.name, + "email": self.partner_id.email, + "phone": self.partner_id.phone, + }, + } + + def sign(self): + self.ensure_one() + if not self.is_allow_signature: + raise ValidationError(_("You are not allowed to sign this document.")) + return { + "target": "new", + "type": "ir.actions.act_url", + "url": self.access_url, + } + + def action_sign(self, items, access_token=False, latitude=False, longitude=False): + self.ensure_one() + if self.signed_on: + raise ValidationError( + _("Users %s has already signed the document") % self.partner_id.name + ) + if self.request_id.state != "sent": + raise ValidationError(_("Request cannot be signed")) + self.signed_on = fields.Datetime.now() + # current_hash = self.request_id.current_hash + signatory_data = self.request_id.signatory_data + + input_data = BytesIO(b64decode(self.request_id.data)) + reader = PdfFileReader(input_data) + output = PdfFileWriter() + pages = {} + for page_number in range(1, reader.numPages + 1): + pages[page_number] = reader.getPage(page_number - 1) + + for key in signatory_data: + if signatory_data[key]["role_id"] == self.role_id.id: + signatory_data[key] = items[key] + self._check_signable(items[key]) + item = items[key] + page = pages[item["page"]] + new_page = self._get_pdf_page(item, page.mediaBox) + if new_page: + page.mergePage(new_page) + pages[item["page"]] = page + for page_number in pages: + output.addPage(pages[page_number]) + output_stream = BytesIO() + output.write(output_stream) + output_stream.seek(0) + signed_pdf = output_stream.read() + final_hash = hashlib.sha1(signed_pdf).hexdigest() + # TODO: Review that the hash has not been changed... + self.request_id.write( + { + "signatory_data": signatory_data, + "data": b64encode(signed_pdf), + "current_hash": final_hash, + } + ) + self.signature_hash = final_hash + self.latitude = latitude + self.longitude = longitude + self.request_id._check_signed() + self._set_action_log("sign", access_token=access_token) + if self.sequence_id: + self.flush_recordset() + new_number = self.sequence_id.next_by_id() + self.write( + { + "secure_sequence_number": new_number, + "inalterable_hash": self._get_new_hash(new_number), + } + ) + self.request_id.action_send_signed_request() + return { + "type": "ir.actions.act_url", + "url": self.access_url, + } + + def _check_signable(self, item): + if not item["required"]: + return + if not item["value"]: + raise ValidationError(_("Field %s is not filled") % item["name"]) + + def _get_pdf_page_text(self, item, box): + packet = BytesIO() + can = canvas.Canvas(packet, pagesize=(box.getWidth(), box.getHeight())) + if not item["value"]: + return False + par = Paragraph(item["value"], style=self._getParagraphStyle()) + par.wrap( + item["width"] / 100 * float(box.getWidth()), + item["height"] / 100 * float(box.getHeight()), + ) + par.drawOn( + can, + item["position_x"] / 100 * float(box.getWidth()), + (100 - item["position_y"] - item["height"]) / 100 * float(box.getHeight()), + ) + can.save() + packet.seek(0) + new_pdf = PdfFileReader(packet) + return new_pdf.getPage(0) + + def _getParagraphStyle(self): + return ParagraphStyle(name="Oca Sign Style") + + def _get_pdf_page_check(self, item, box): + packet = BytesIO() + can = canvas.Canvas(packet, pagesize=(box.getWidth(), box.getHeight())) + width = item["width"] / 100 * float(box.getWidth()) + height = item["height"] / 100 * float(box.getHeight()) + drawing = Drawing(width=width, height=height) + drawing.add( + Rect( + 0, + 0, + width, + height, + strokeWidth=3, + strokeColor=black, + fillColor=transparent, + ) + ) + if item["value"]: + drawing.add(Line(0, 0, width, height, strokeColor=black, strokeWidth=3)) + drawing.add(Line(0, height, width, 0, strokeColor=black, strokeWidth=3)) + drawing.drawOn( + can, + item["position_x"] / 100 * float(box.getWidth()), + (100 - item["position_y"] - item["height"]) / 100 * float(box.getHeight()), + ) + can.save() + packet.seek(0) + new_pdf = PdfFileReader(packet) + return new_pdf.getPage(0) + + def _get_pdf_page_signature(self, item, box): + packet = BytesIO() + can = canvas.Canvas(packet, pagesize=(box.getWidth(), box.getHeight())) + if not item["value"]: + return False + par = Image( + BytesIO(b64decode(item["value"])), + width=item["width"] / 100 * float(box.getWidth()), + height=item["height"] / 100 * float(box.getHeight()), + ) + par.drawOn( + can, + item["position_x"] / 100 * float(box.getWidth()), + (100 - item["position_y"] - item["height"]) / 100 * float(box.getHeight()), + ) + can.save() + packet.seek(0) + new_pdf = PdfFileReader(packet) + return new_pdf.getPage(0) + + def _get_pdf_page(self, item, box): + return getattr(self, "_get_pdf_page_%s" % item["field_type"])(item, box) + + def _set_action_log(self, action, **kwargs): + self.ensure_one() + return self.request_id._set_action_log(action, signer_id=self.id, **kwargs) + + def _compute_display_name(self): + for signer in self: + signer.display_name = signer.partner_id.display_name + + def _get_sequence(self): + return self.env.ref("sign_oca.sign_inalterability_sequence") + + @api.depends( + lambda r: ["request_id.data", "inalterable_hash", "secure_sequence_number"] + + r._get_integrity_hash_fields() + ) + def _compute_altered_hash(self): + for record in self: + record.altered_hash = ( + record.inalterable_hash + and record.inalterable_hash + != record._get_new_hash(record.secure_sequence_number) + ) + + def _get_new_hash(self, secure_seq_number): + prev_sign = self.sudo().search( + [ + ("sequence_id", "=", self.sequence_id.id), + ("secure_sequence_number", "!=", 0), + ("secure_sequence_number", "=", int(secure_seq_number) - 1), + ] + ) + if prev_sign and len(prev_sign) != 1: + raise UserError( + _( + "An error occurred when computing the inalterability. " + "Impossible to get the unique previous signer information." + ) + ) + return self._compute_hash(prev_sign.inalterable_hash if prev_sign else "") + + def _compute_hash(self, previous_hash): + """Computes the hash of the browse_record given as self, based on the hash + of the previous record in the company's securisation sequence given as + parameter + """ + self.ensure_one() + hash_string = sha256((previous_hash + self._string_to_hash()).encode("utf-8")) + return hash_string.hexdigest() + + def _string_to_hash(self): + def _getattrstring(obj, field_str): + field_value = obj[field_str] + if obj._fields[field_str].type == "many2one": + field_value = field_value.id + if obj._fields[field_str].type == "monetary": + return float_repr(field_value, obj.currency_id.decimal_places) + return str(field_value) + + values = {"items": {}} + for field in self._get_integrity_hash_fields(): + values[field] = _getattrstring(self, field) + for key, signatory_value in self.request_id.signatory_data.items(): + if signatory_value["role_id"] == self.role_id.id: + values[key] = signatory_value + return json.dumps( + values, + sort_keys=True, + ensure_ascii=True, + indent=None, + separators=(",", ":"), + ) + + def _get_integrity_hash_fields(self): + return ["partner_id", "role_id", "signed_on", "signature_hash"] + + +class SignRequestLog(models.Model): + _name = "sign.oca.request.log" + _description = "Sign Request Log" + _log_access = False + _description = "Log access and edition on requests" + + uid = fields.Many2one( + "res.users", + required=True, + ondelete="cascade", + default=lambda r: r.env.user.id, + ) + date = fields.Datetime(required=True, default=lambda r: fields.Datetime.now()) + partner_id = fields.Many2one( + "res.partner", required=True, default=lambda r: r.env.user.partner_id.id + ) + request_id = fields.Many2one("sign.oca.request", required=True, ondelete="cascade") + signer_id = fields.Many2one("sign.oca.request.signer") + action = fields.Selection( + [ + ("create", "Create"), + ("validate", "Validate"), + ("view", "View Document"), + ("sign", "Sign"), + ("add_field", "Add field"), + ("edit_field", "Edit field"), + ("delete_field", "Delete field"), + ("cancel", "Cancel"), + ("configure", "Configure"), + ], + required=True, + ) + access_token = fields.Char() + ip = fields.Char() diff --git a/sign_oca/models/sign_oca_role.py b/sign_oca/models/sign_oca_role.py new file mode 100644 index 00000000..319a7f31 --- /dev/null +++ b/sign_oca/models/sign_oca_role.py @@ -0,0 +1,51 @@ +# Copyright 2023 Dixmit +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class SignOcaRole(models.Model): + _name = "sign.oca.role" + _description = "Sign Role" + + name = fields.Char(required=True) + domain = fields.Char(required=True, default=[]) + partner_selection_policy = fields.Selection( + selection=[ + ("empty", "Empty"), + ("default", "Default"), + ("expression", "Expression"), + ], + required=True, + default="empty", + help="This field is used to define how the partner" + " will be calculated in the different roles of " + "a request. This field will be used when the 'Sign from Template' " + "action is triggered.", + ) + default_partner_id = fields.Many2one( + comodel_name="res.partner", string="Default partner" + ) + expression_partner = fields.Char( + string="Expression", help="Example: {{object.partner_id.id}}" + ) + + @api.onchange("partner_selection_policy") + def _onchange_partner_selection_policy(self): + for item in self: + if item.partner_selection_policy == "empty": + item.default_partner_id = False + item.expression_partner = False + elif item.partner_selection_policy == "default": + item.expression_partner = False + elif item.partner_selection_policy == "expression": + item.default_partner_id = False + + def _get_partner_from_record(self, record): + partner = self.default_partner_id.id or False + if self.partner_selection_policy == "expression" and record: + res = self.env["mail.render.mixin"]._render_template( + self.expression_partner, record._name, record.ids + )[record.id] + partner = int(res) if res else False + return partner diff --git a/sign_oca/models/sign_oca_template.py b/sign_oca/models/sign_oca_template.py new file mode 100644 index 00000000..23c96592 --- /dev/null +++ b/sign_oca/models/sign_oca_template.py @@ -0,0 +1,185 @@ +# Copyright 2023 Dixmit +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class SignOcaTemplate(models.Model): + _name = "sign.oca.template" + _description = "Sign Oca Template" # TODO + _inherit = ["mail.thread"] + + name = fields.Char(required=True) + data = fields.Binary(attachment=True, required=True) + ask_location = fields.Boolean() + filename = fields.Char() + item_ids = fields.One2many("sign.oca.template.item", inverse_name="template_id") + request_count = fields.Integer(compute="_compute_request_count") + model_id = fields.Many2one( + comodel_name="ir.model", + string="Model", + domain=[("transient", "=", False), ("model", "not like", "sign.oca")], + ) + model = fields.Char( + compute="_compute_model", string="Model name", compute_sudo=True, store=True + ) + active = fields.Boolean(default=True) + request_ids = fields.One2many("sign.oca.request", inverse_name="template_id") + + @api.depends("model_id") + def _compute_model(self): + for item in self: + item.model = item.model_id.model or False + + @api.depends("request_ids") + def _compute_request_count(self): + res = self.env["sign.oca.request"].read_group( + domain=[("template_id", "in", self.ids)], + fields=["template_id"], + groupby=["template_id"], + ) + res_dict = {x["template_id"][0]: x["template_id_count"] for x in res} + for record in self: + record.request_count = res_dict.get(record.id, 0) + + def configure(self): + self.ensure_one() + return { + "type": "ir.actions.client", + "tag": "sign_oca_configure", + "name": self.name, + "params": { + "res_model": self._name, + "res_id": self.id, + }, + } + + def get_info(self): + self.ensure_one() + return { + "name": self.name, + "items": {item.id: item.get_info() for item in self.item_ids}, + "roles": [ + {"id": role.id, "name": role.name} + for role in self.env["sign.oca.role"].search([]) + ], + "fields": [ + {"id": field.id, "name": field.name} + for field in self.env["sign.oca.field"].search([]) + ], + } + + def delete_item(self, item_id): + self.ensure_one() + item = self.item_ids.browse(item_id) + assert item.template_id == self + item.unlink() + + def set_item_data(self, item_id, vals): + self.ensure_one() + item = self.env["sign.oca.template.item"].browse(item_id) + assert item.template_id == self + item.write(vals) + + def add_item(self, item_vals): + self.ensure_one() + item_vals["template_id"] = self.id + return self.env["sign.oca.template.item"].create(item_vals).get_info() + + def _get_signatory_data(self): + items = sorted( + self.item_ids, + key=lambda item: ( + item.page, + item.position_y, + item.position_x, + ), + ) + tabindex = 1 + signatory_data = {} + item_id = 1 + for item in items: + item_data = item._get_full_info() + item_data["id"] = item_id + item_data["tabindex"] = tabindex + tabindex += 1 + signatory_data[item_id] = item_data + item_id += 1 + return signatory_data + + def _prepare_sign_oca_request_vals_from_record(self, record): + roles = self.mapped("item_ids.role_id").filtered( + lambda x: x.partner_selection_policy != "empty" + ) + return { + "name": self.name, + "template_id": self.id, + "record_ref": f"{record._name},{record.id}", + "signatory_data": self._get_signatory_data(), + "data": self.data, + "signer_ids": [ + ( + 0, + 0, + { + "partner_id": role._get_partner_from_record(record), + "role_id": role.id, + }, + ) + for role in roles + ], + } + + +class SignOcaTemplateItem(models.Model): + _name = "sign.oca.template.item" + _description = "Sign Oca Template Item" + + template_id = fields.Many2one( + "sign.oca.template", required=True, ondelete="cascade" + ) + field_id = fields.Many2one("sign.oca.field", ondelete="restrict") + role_id = fields.Many2one( + "sign.oca.role", default=lambda r: r._get_default_role(), ondelete="restrict" + ) + required = fields.Boolean() + # If no role, it will be editable by everyone... + page = fields.Integer(required=True, default=1) + position_x = fields.Float(required=True) + position_y = fields.Float(required=True) + width = fields.Float() + height = fields.Float() + placeholder = fields.Char() + + @api.model + def _get_default_role(self): + return self.env.ref("sign_oca.sign_role_customer") + + def get_info(self): + self.ensure_one() + return { + "id": self.id, + "field_id": self.field_id.id, + "name": self.field_id.name, + "role_id": self.role_id.id, + "page": self.page, + "position_x": self.position_x, + "position_y": self.position_y, + "width": self.width, + "height": self.height, + "placeholder": self.placeholder, + "required": self.required, + } + + def _get_full_info(self): + """Method used in the wizards in the requests that are created.""" + self.ensure_one() + vals = self.get_info() + vals.update( + { + "field_type": self.field_id.field_type, + "value": False, + "default_value": self.field_id.default_value, + } + ) + return vals diff --git a/sign_oca/pyproject.toml b/sign_oca/pyproject.toml new file mode 100644 index 00000000..4231d0cc --- /dev/null +++ b/sign_oca/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/sign_oca/readme/CONFIGURE.md b/sign_oca/readme/CONFIGURE.md new file mode 100644 index 00000000..f06941c2 --- /dev/null +++ b/sign_oca/readme/CONFIGURE.md @@ -0,0 +1,5 @@ +There is a wizard (sign.oca.template.generate.multi) that can be used +for any model needed. If there is a template without a linked model or +linked to a model (res.partner for example) an action will be +automatically displayed in the tree and form view (only for users with +Sign permissions). diff --git a/sign_oca/readme/CONTRIBUTORS.md b/sign_oca/readme/CONTRIBUTORS.md new file mode 100644 index 00000000..d4491d4f --- /dev/null +++ b/sign_oca/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- Enric Tobella (www.dixmit.com) +- [Tecnativa](https://www.tecnativa.com): + - Víctor Martínez diff --git a/sign_oca/readme/DESCRIPTION.md b/sign_oca/readme/DESCRIPTION.md new file mode 100644 index 00000000..aa9a46e0 --- /dev/null +++ b/sign_oca/readme/DESCRIPTION.md @@ -0,0 +1,2 @@ +This module allows to create documents for signature inside Odoo using +OWL. diff --git a/sign_oca/readme/ROADMAP.md b/sign_oca/readme/ROADMAP.md new file mode 100644 index 00000000..c4bd097d --- /dev/null +++ b/sign_oca/readme/ROADMAP.md @@ -0,0 +1,5 @@ +## Tasks + +- Ensure that the signature is inalterable. Maybe we might need to use + some tools like endevise or pyHanko with a certificate. Signer can be + authenticated using OTP. diff --git a/sign_oca/readme/USAGE.md b/sign_oca/readme/USAGE.md new file mode 100644 index 00000000..45b3bd53 --- /dev/null +++ b/sign_oca/readme/USAGE.md @@ -0,0 +1,57 @@ +## Creation of templates + +- Access Sign / Templates +- Create a new template +- Add a PDF File +- Access the configuration menu +- You can add a field by doing a right click inside a page +- Click on the field in order to delete or edit some configuration of it +- The template is autosaved + +## Sign role + +- Access Sign / Settings / Roles +- Create a new role (Equipment employee for example) +- You can set the Partner type you need (empty, default or expression). +- With the expression option you can set: \${object.field_name.id} +- If you create a sign request from template signer will be auto-create + according to roles + +## Sign a document from template + +- Access Sign / Templates +- Press the Sign button from a template +- Fill all the possible partners that will sign the document +- You can link the template to a model (maintenance.equipment for + example) +- The signature action will be opened. +- There, you can fill all the data you need. +- Once you finish, press the sign button on the top +- When the last signer signs it, the final file will be generated as a + PDF + +## Sign a pending document + +- Go to the pencil icon in the upper right corner (systray) of the sign + request to access the pending signatures. +- Press the Sign button from signer request +- The signature action will be opened. +- There, you can fill all the data you need. +- Once you finish, press the sign button on the top +- When the last signer signs it, the final file will be generated as a + PDF + +## Sign from template + +- Go to any list view or form view (except sign.oca models), e.g.: + Contacts +- Select multiple records (3 for example). +- The "Sign from template" action will be available if there are any + sign templates created that are not linked to any model and/or any + linked to the corresponding model. +- Select a template. +- Click on the "Generate" button. +- 3 requests will be created (each linked to each selected record) BUT + no signer will be set. +- Some extra modules (e.g. maintenance_sign_oca) will automatically set + the signers for each request. diff --git a/sign_oca/security/ir.model.access.csv b/sign_oca/security/ir.model.access.csv new file mode 100644 index 00000000..a7530d69 --- /dev/null +++ b/sign_oca/security/ir.model.access.csv @@ -0,0 +1,19 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +edit_sign_template,edit_sign_template,model_sign_oca_template,sign_oca_group_user,1,0,0,0 +edit_sign_template_admin,edit_sign_template_admin,model_sign_oca_template,sign_oca_group_admin,1,1,1,1 +edit_sign_template_item,edit_sign_template_item,model_sign_oca_template_item,sign_oca_group_user,1,0,0,0 +edit_sign_template_item_admin,edit_sign_template_item_admin,model_sign_oca_template_item,sign_oca_group_admin,1,1,1,1 +edit_sign_role,edit_sign_role,model_sign_oca_role,sign_oca_group_user,1,0,0,0 +edit_sign_role_admin,edit_sign_role_admin,model_sign_oca_role,sign_oca_group_admin,1,1,1,1 +edit_sign_field,edit_sign_field,model_sign_oca_field,sign_oca_group_user,1,0,0,0 +edit_sign_field_admin,edit_sign_field_admin,model_sign_oca_field,sign_oca_group_admin,1,1,1,1 +edit_sign_request_base_user,edit_sign_request,model_sign_oca_request,base.group_user,1,0,0,0 +edit_sign_request,edit_sign_request,model_sign_oca_request,sign_oca_group_user,1,1,1,0 +edit_sign_request_admin,edit_sign_request_admin,model_sign_oca_request,sign_oca_group_admin,1,1,1,1 +edit_sign_request_signer_base_user,edit_sign_request_signer_base_user,model_sign_oca_request_signer,base.group_user,1,0,0,0 +edit_sign_request_signer,edit_sign_request_signer,model_sign_oca_request_signer,sign_oca_group_user,1,1,1,1 +edit_sign_generate,edit_sign_generate,model_sign_oca_template_generate,sign_oca_group_user,1,1,1,1 +edit_sign_generate_signer,edit_sign_generate_signer,model_sign_oca_template_generate_signer,sign_oca_group_user,1,1,1,1 +edit_sign_generate_multi,edit_sign_generate_multi,model_sign_oca_template_generate_multi,sign_oca_group_user,1,1,1,1 +access_sign_request_log,access_sign_request_log,model_sign_oca_request_log,sign_oca_group_user,1,0,0,0 +access_sign_request_log_admin,access_sign_request_log_admin,model_sign_oca_request_log,sign_oca_group_admin,1,1,1,1 diff --git a/sign_oca/security/security.xml b/sign_oca/security/security.xml new file mode 100644 index 00000000..d59777fa --- /dev/null +++ b/sign_oca/security/security.xml @@ -0,0 +1,99 @@ + + + + + Sign + + + + User: Own Documents Only + + + + + User: All Documents + + + + + Administrator + + + + + + + Sign Request base users: read + + [('partner_id', 'child_of', [user.partner_id.commercial_partner_id.id])] + + + + + + + + + Sign Request Company + + [('company_id', 'in', company_ids)] + + + Sign Request Signer Company + + [('request_id.company_id', 'in', company_ids)] + + + + Sign Request user: read + + [('message_partner_ids', 'child_of', [user.partner_id.commercial_partner_id.id])] + + + + + + + + Sign Request Signer user: read + + [('request_id.message_partner_ids', 'child_of', [user.partner_id.commercial_partner_id.id])] + + + + + + + + + Sign Request manager: read + + [(1, '=', 1)] + + + + + + + + Sign Request Signer manager: read + + [(1, '=', 1)] + + + + + + + diff --git a/sign_oca/static/description.svg b/sign_oca/static/description.svg new file mode 100644 index 00000000..7de8b679 --- /dev/null +++ b/sign_oca/static/description.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sign_oca/static/description/icon.png b/sign_oca/static/description/icon.png new file mode 100644 index 00000000..7f4cb77b Binary files /dev/null and b/sign_oca/static/description/icon.png differ diff --git a/sign_oca/static/description/icon.svg b/sign_oca/static/description/icon.svg new file mode 100644 index 00000000..7de8b679 --- /dev/null +++ b/sign_oca/static/description/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sign_oca/static/description/index.html b/sign_oca/static/description/index.html new file mode 100644 index 00000000..05956e14 --- /dev/null +++ b/sign_oca/static/description/index.html @@ -0,0 +1,531 @@ + + + + + +Sign Oca + + + +
+

Sign Oca

+ + +

Beta License: AGPL-3 OCA/sign Translate me on Weblate Try me on Runboat

+

This module allows to create documents for signature inside Odoo using +OWL.

+

Table of contents

+ +
+

Configuration

+

There is a wizard (sign.oca.template.generate.multi) that can be used +for any model needed. If there is a template without a linked model or +linked to a model (res.partner for example) an action will be +automatically displayed in the tree and form view (only for users with +Sign permissions).

+
+
+

Usage

+
+

Creation of templates

+
    +
  • Access Sign / Templates
  • +
  • Create a new template
  • +
  • Add a PDF File
  • +
  • Access the configuration menu
  • +
  • You can add a field by doing a right click inside a page
  • +
  • Click on the field in order to delete or edit some configuration of +it
  • +
  • The template is autosaved
  • +
+
+
+

Sign role

+
    +
  • Access Sign / Settings / Roles
  • +
  • Create a new role (Equipment employee for example)
  • +
  • You can set the Partner type you need (empty, default or expression).
  • +
  • With the expression option you can set: ${object.field_name.id}
  • +
  • If you create a sign request from template signer will be auto-create +according to roles
  • +
+
+
+

Sign a document from template

+
    +
  • Access Sign / Templates
  • +
  • Press the Sign button from a template
  • +
  • Fill all the possible partners that will sign the document
  • +
  • You can link the template to a model (maintenance.equipment for +example)
  • +
  • The signature action will be opened.
  • +
  • There, you can fill all the data you need.
  • +
  • Once you finish, press the sign button on the top
  • +
  • When the last signer signs it, the final file will be generated as a +PDF
  • +
+
+
+

Sign a pending document

+
    +
  • Go to the pencil icon in the upper right corner (systray) of the sign +request to access the pending signatures.
  • +
  • Press the Sign button from signer request
  • +
  • The signature action will be opened.
  • +
  • There, you can fill all the data you need.
  • +
  • Once you finish, press the sign button on the top
  • +
  • When the last signer signs it, the final file will be generated as a +PDF
  • +
+
+
+

Sign from template

+
    +
  • Go to any list view or form view (except sign.oca models), e.g.: +Contacts
  • +
  • Select multiple records (3 for example).
  • +
  • The “Sign from template” action will be available if there are any +sign templates created that are not linked to any model and/or any +linked to the corresponding model.
  • +
  • Select a template.
  • +
  • Click on the “Generate” button.
  • +
  • 3 requests will be created (each linked to each selected record) BUT +no signer will be set.
  • +
  • Some extra modules (e.g. maintenance_sign_oca) will automatically set +the signers for each request.
  • +
+
+
+
+

Known issues / Roadmap

+
+

Tasks

+
    +
  • Ensure that the signature is inalterable. Maybe we might need to use +some tools like endevise or pyHanko with a certificate. Signer can be +authenticated using OTP.
  • +
+
+
+
+

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

+
    +
  • Dixmit
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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

+

Current maintainer:

+

etobella

+

This module is part of the OCA/sign project on GitHub.

+

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

+
+
+
+ + diff --git a/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.esm.js b/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.esm.js new file mode 100644 index 00000000..dfb5c103 --- /dev/null +++ b/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.esm.js @@ -0,0 +1,362 @@ +/** @odoo-module QWeb **/ + +import {ControlPanel} from "@web/search/control_panel/control_panel"; +import {Dialog} from "@web/core/dialog/dialog"; +import {isMobileOS} from "@web/core/browser/feature_detection"; +import SignOcaPdfCommon from "../sign_oca_pdf_common/sign_oca_pdf_common.esm.js"; +import {_t} from "@web/core/l10n/translation"; +import {registry} from "@web/core/registry"; +import {renderToString} from "@web/core/utils/render"; + +export class SignOcaConfigureControlPanel extends ControlPanel {} +SignOcaConfigureControlPanel.template = "sign_oca.SignOcaConfigureControlPanel"; +export default class SignOcaConfigure extends SignOcaPdfCommon { + setup() { + this.res_id = + this.props.action.params.res_id || this.props.action.context.active_id; + super.setup(...arguments); + this.field_template = "sign_oca.sign_iframe_field_configure"; + this.contextMenu = undefined; + this.isMobile = isMobileOS; + } + postIframeFields() { + super.postIframeFields(...arguments); + $.each( + this.iframe.el.contentDocument.getElementsByClassName("page"), + (page) => { + page.addEventListener("mousedown", (e) => { + e.preventDefault(); + e.stopPropagation(); + return false; + }); + page.addEventListener("contextmenu", (e) => { + e.preventDefault(); + e.stopPropagation(); + if (this.contextMenu !== undefined) { + this.contextMenu.remove(); + this.contextMenu = undefined; + } + var position = page.getBoundingClientRect(); + this.contextMenu = $( + renderToString("sign_oca.sign_iframe_contextmenu", { + page, + e, + left: ((e.pageX - position.x) * 100) / position.width + "%", + top: ((e.pageY - position.y) * 100) / position.height + "%", + info: this.info, + page_id: parseInt(page.dataset.pageNumber, 10), + }) + ); + page.append(this.contextMenu[0]); + }); + } + ); + this.iframe.el.contentDocument.addEventListener( + "click", + (ev) => { + if (this.contextMenu && !this.creatingItem) { + if (this.contextMenu[0].contains(ev.target)) { + this.creatingItem = true; + this.orm + .call(this.model, "add_item", [ + [this.res_id], + { + field_id: parseInt(ev.target.dataset.field, 10), + page: parseInt(ev.target.dataset.page, 10), + position_x: parseFloat( + ev.target.parentElement.style.left + ), + position_y: parseFloat( + ev.target.parentElement.style.top + ), + width: 20, + height: 1.5, + }, + ]) + .then((data) => { + this.info.items[data.id] = data; + this.postIframeField(data); + this.contextMenu.remove(); + this.contextMenu = undefined; + this.creatingItem = false; + }); + } else { + this.contextMenu.remove(); + this.contextMenu = undefined; + } + } + }, + // We need to enforce it to happen no matter what + true + ); + this.iframeLoaded.resolve(); + } + postIframeField(item) { + var signatureItem = super.postIframeField(...arguments); + var dragItem = + signatureItem[0].getElementsByClassName("o_sign_oca_draggable")[0]; + var resizeItems = signatureItem[0].getElementsByClassName("o_sign_oca_resize"); + signatureItem[0].addEventListener( + "click", + (e) => { + if ( + e.target.classList.contains("o_sign_oca_resize") || + e.target.classList.contains("o_sign_oca_draggable") + ) { + return; + } + var target = e.currentTarget; + // TODO: Open Dialog for configuration + var dialog = new Dialog(this, { + title: _t("Edit field"), + $content: $( + renderToString("sign_oca.sign_oca_field_edition", { + item, + info: this.info, + }) + ), + + buttons: [ + { + text: _t("Save"), + classes: "btn-primary", + close: true, + click: () => { + var field_id = parseInt( + dialog.$el.find('select[name="field_id"]').val(), + 10 + ); + var role_id = parseInt( + dialog.$el.find('select[name="role_id"]').val(), + 10 + ); + var required = dialog.$el + .find("input[name='required']") + .prop("checked"); + var placeholder = dialog.$el + .find("input[name='placeholder']") + .val(); + this.orm + .call(this.model, "set_item_data", [ + [this.res_id], + item.id, + { + field_id, + role_id, + required, + placeholder, + }, + ]) + .then(() => { + item.field_id = field_id; + item.name = _.filter( + this.info.fields, + (field) => field.id === field_id + )[0].name; + item.role_id = role_id; + item.required = required; + item.placeholder = placeholder; + target.remove(); + this.postIframeField(item); + }); + }, + }, + { + text: _t("Delete"), + classes: "btn-danger", + close: true, + click: () => { + this.orm + .call(this.model, "delete_item", [ + [this.res_id], + item.id, + ]) + .then(() => { + delete this.info.items[item.id]; + target.remove(); + }); + }, + }, + { + text: _t("Cancel"), + close: true, + }, + ], + }).open(); + }, + true + ); + var startFunction = "mousedown"; + var endFunction = "mouseup"; + var moveFunction = "mousemove"; + if (this.isMobile) { + startFunction = "touchstart"; + endFunction = "touchend"; + moveFunction = "touchmove"; + } + dragItem.addEventListener(startFunction, (mousedownEvent) => { + mousedownEvent.preventDefault(); + var parentPage = mousedownEvent.target.parentElement.parentElement; + this.movingItem = mousedownEvent.target.parentElement; + var mousemove = this._onDragItem.bind(this); + parentPage.addEventListener(moveFunction, mousemove); + parentPage.addEventListener( + endFunction, + (mouseupEvent) => { + mouseupEvent.currentTarget.removeEventListener( + moveFunction, + mousemove + ); + var target = $(this.movingItem); + var position = target.parent()[0].getBoundingClientRect(); + var newPosition = mouseupEvent; + if (mouseupEvent.changedTouches) { + newPosition = mouseupEvent.changedTouches[0]; + } + var left = + (Math.max( + 0, + Math.min(position.width, newPosition.pageX - position.x) + ) * + 100) / + position.width; + var top = + (Math.max( + 0, + Math.min(position.height, newPosition.pageY - position.y) + ) * + 100) / + position.height; + target.css("left", left + "%"); + target.css("top", top + "%"); + item.position_x = left; + item.position_y = top; + + this.orm.call(this.model, "set_item_data", [ + [this.res_id], + item.id, + { + position_x: left, + position_y: top, + }, + ]); + this.movingItem = undefined; + }, + {once: true} + ); + }); + $.each(resizeItems, (resizeItem) => { + resizeItem.addEventListener(startFunction, (mousedownEvent) => { + mousedownEvent.preventDefault(); + var parentPage = mousedownEvent.target.parentElement.parentElement; + this.resizingItem = mousedownEvent.target.parentElement; + var mousemove = this._onResizeItem.bind(this); + parentPage.addEventListener(moveFunction, mousemove); + parentPage.addEventListener( + endFunction, + (mouseupEvent) => { + mouseupEvent.stopPropagation(); + mouseupEvent.preventDefault(); + mouseupEvent.currentTarget.removeEventListener( + moveFunction, + mousemove + ); + var target = $(this.resizingItem); + var newPosition = mouseupEvent; + if (mouseupEvent.changedTouches) { + newPosition = mouseupEvent.changedTouches[0]; + } + var targetPosition = target + .find(".o_sign_oca_resize")[0] + .getBoundingClientRect(); + var itemPosition = target[0].getBoundingClientRect(); + var pagePosition = target.parent()[0].getBoundingClientRect(); + var width = + (Math.max( + 0, + newPosition.pageX + + targetPosition.width - + itemPosition.x + ) * + 100) / + pagePosition.width; + var height = + (Math.max( + 0, + newPosition.pageY + + targetPosition.height - + itemPosition.y + ) * + 100) / + pagePosition.height; + target.css("width", width + "%"); + target.css("height", height + "%"); + item.width = width; + item.height = height; + this.orm.call(this.model, "set_item_data", [ + [this.res_id], + item.id, + { + width: width, + height: height, + }, + ]); + }, + {once: true} + ); + }); + }); + return signatureItem; + } + _onResizeItem(e) { + e.stopPropagation(); + e.preventDefault(); + var target = $(this.resizingItem); + var targetPosition = target + .find(".o_sign_oca_resize")[0] + .getBoundingClientRect(); + var itemPosition = target[0].getBoundingClientRect(); + var newPosition = e; + if (e.targetTouches) { + newPosition = e.targetTouches[0]; + } + var pagePosition = target.parent()[0].getBoundingClientRect(); + var width = + (Math.max(0, newPosition.pageX + targetPosition.width - itemPosition.x) * + 100) / + pagePosition.width; + var height = + (Math.max(0, newPosition.pageY + targetPosition.height - itemPosition.y) * + 100) / + pagePosition.height; + target.css("width", width + "%"); + target.css("height", height + "%"); + } + _onDragItem(e) { + e.stopPropagation(); + e.preventDefault(); + var target = $(this.movingItem); + var position = target.parent()[0].getBoundingClientRect(); + var newPosition = e; + if (e.targetTouches) { + newPosition = e.targetTouches[0]; + } + var left = + (Math.max(0, Math.min(position.width, newPosition.pageX - position.x)) * + 100) / + position.width; + var top = + (Math.max(0, Math.min(position.height, newPosition.pageY - position.y)) * + 100) / + position.height; + target.css("left", left + "%"); + target.css("top", top + "%"); + } +} +SignOcaConfigure.template = "sign_oca.SignOcaConfigure"; +SignOcaConfigure.props = []; +SignOcaConfigure.props = { + action: Object, + "*": {optional: true}, +}; +registry.category("actions").add("sign_oca_configure", SignOcaConfigure); diff --git a/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml b/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml new file mode 100644 index 00000000..15bf4b1c --- /dev/null +++ b/sign_oca/static/src/components/sign_oca_configure/sign_oca_configure.xml @@ -0,0 +1,126 @@ + + + + + + + +
+
In order to add a new field, do a right click over the PDF page. You will be able to select the field that you will import
+
Then, you can move and resize the fields over the PDF page using the move icons.
+
If you do a click over a field, you will be able to change the default configurations of the field
+
Data is saved automatically when editing
+
+
+ +
+ +
+ + +
+ + +
+
Click on the field that you want to add
+ +
+ +
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+ + + + + + diff --git a/sign_oca/static/src/components/sign_oca_pdf/sign_oca_pdf.esm.js b/sign_oca/static/src/components/sign_oca_pdf/sign_oca_pdf.esm.js new file mode 100644 index 00000000..fed42860 --- /dev/null +++ b/sign_oca/static/src/components/sign_oca_pdf/sign_oca_pdf.esm.js @@ -0,0 +1,135 @@ +/** @odoo-module Qweb **/ + +import SignOcaPdfCommon from "../sign_oca_pdf_common/sign_oca_pdf_common.esm.js"; +import {registry} from "@web/core/registry"; +import {renderToString} from "@web/core/utils/render"; +const SignRegistry = registry.category("sign_oca"); +import {useService} from "@web/core/utils/hooks"; + +export default class SignOcaPdf extends SignOcaPdfCommon { + setup() { + super.setup(...arguments); + this.orm = useService("orm"); + this.to_sign = false; + } + async willStart() { + await super.willStart(...arguments); + this.checkFilledAll(); + } + checkToSign() { + this.props.updateControlPanel({ + cp_content: { + $buttons: this.renderButtons(this.to_sign_update), + }, + }); + this.to_sign = this.to_sign_update; + } + renderButtons(to_sign) { + var $buttons = $( + renderToString("oca_sign_oca.SignatureButtons", { + to_sign: to_sign, + }) + ); + $buttons.on("click.o_sign_oca_button_sign", () => { + this.signOca(); + }); + return $buttons; + } + async getLocation() { + if (!this.info.ask_location || !navigator.geolocation) { + return {}; + } + try { + return await new Promise((resolve, reject) => { + navigator.geolocation.getCurrentPosition(resolve, reject); + }); + + // Do something with the latitude and longitude + } catch (error) { + switch (error.code) { + case error.PERMISSION_DENIED: + console.debug("User denied the request for geolocation."); + break; + case error.POSITION_UNAVAILABLE: + console.debug("Location information is unavailable."); + break; + case error.TIMEOUT: + console.debug("The request to get user location timed out."); + break; + default: + console.debug("An unknown error occurred."); + break; + } + } + return {}; + } + async signOca() { + const position = await this.getLocation(); + await this.orm.call( + this.model, + "action_sign", + [[this.res_id], this.info.items], + { + latitude: position && position.coords && position.coords.latitude, + longitude: position && position.coords && position.coords.longitude, + } + ); + this.props.trigger("history_back"); + } + _trigger_up(ev) { + const evType = ev.name; + const payload = ev.data; + if (evType === "call_service") { + let args = payload.args || []; + if (payload.service === "ajax" && payload.method === "rpc") { + // Ajax service uses an extra 'target' argument for rpc + args = args.concat(ev.target); + } + const service = this.env.services[payload.service]; + const result = service[payload.method].apply(service, args); + payload.callback(result); + } else if (evType === "get_session") { + if (payload.callback) { + payload.callback(this.env.session); + } + } else if (evType === "load_views") { + const params = { + model: payload.modelName, + context: payload.context, + views_descr: payload.views, + }; + this.env.dataManager + .load_views(params, payload.options || {}) + .then(payload.on_success); + } else if (evType === "load_filters") { + return this.env.dataManager.load_filters(payload).then(payload.on_success); + } else { + payload.__targetWidget = ev.target; + this.trigger(evType.replace(/_/g, "-"), payload); + } + } + postIframeField(item) { + if (item.role_id === this.info.role_id) { + var signatureItem = super.postIframeField(...arguments); + signatureItem[0].append( + SignRegistry.get(item.field_type).generate(this, item, signatureItem) + ); + return signatureItem; + } + } + checkFilledAll() { + this.to_sign_update = + _.filter(this.info.items, (item) => { + return ( + item.required && + item.role_id === this.info.role_id && + !SignRegistry.get(item.field_type).check(item) + ); + }).length === 0; + this.checkToSign(); + } +} +SignOcaPdf.props = { + to_sign: {type: Boolean, optional: true}, +}; +registry.category("actions").add("sign_oca", SignOcaPdf); diff --git a/sign_oca/static/src/components/sign_oca_pdf/sign_oca_pdf.xml b/sign_oca/static/src/components/sign_oca_pdf/sign_oca_pdf.xml new file mode 100644 index 00000000..5fcc92d0 --- /dev/null +++ b/sign_oca/static/src/components/sign_oca_pdf/sign_oca_pdf.xml @@ -0,0 +1,15 @@ + + + + + + diff --git a/sign_oca/static/src/components/sign_oca_pdf/sign_oca_pdf_action.esm.js b/sign_oca/static/src/components/sign_oca_pdf/sign_oca_pdf_action.esm.js new file mode 100644 index 00000000..8dc83b1c --- /dev/null +++ b/sign_oca/static/src/components/sign_oca_pdf/sign_oca_pdf_action.esm.js @@ -0,0 +1,37 @@ +/** @odoo-module **/ + +import {Component} from "@odoo/owl"; +import {FormRenderer} from "@web/views/form/form_renderer"; +import SignOcaPdf from "./sign_oca_pdf.esm.js"; +import {registry} from "@web/core/registry"; + +export class SignOcaPdfAction extends Component { + init(parent, action) { + this._super.apply(this, arguments); + this.model = + (action.params.res_model !== undefined && action.params.res_model) || + action.context.params.res_model; + this.res_id = + (action.params.res_id !== undefined && action.params.res_id) || + action.context.params.id; + } + async start() { + await this._super(...arguments); + this.component = new FormRenderer(this, SignOcaPdf, { + model: this.model, + res_id: this.res_id, + updateControlPanel: this.updateControlPanel.bind(this), + trigger: this.trigger_up.bind(this), + }); + return this.component.mount(this.$(".o_content")[0]); + } + getState() { + var result = this._super(...arguments); + result = _.extend({}, result, { + res_model: this.model, + res_id: this.res_id, + }); + return result; + } +} +registry.category("actions").add("sign_oca", SignOcaPdfAction); diff --git a/sign_oca/static/src/components/sign_oca_pdf_common/sign_oca_pdf_common.esm.js b/sign_oca/static/src/components/sign_oca_pdf_common/sign_oca_pdf_common.esm.js new file mode 100644 index 00000000..42b1ed74 --- /dev/null +++ b/sign_oca/static/src/components/sign_oca_pdf_common/sign_oca_pdf_common.esm.js @@ -0,0 +1,124 @@ +/** @odoo-module QWeb **/ +import {_t} from "@web/core/l10n/translation"; +import {Component, onMounted, onWillStart, onWillUnmount, useRef} from "@odoo/owl"; +import {Dialog} from "@web/core/dialog/dialog"; +import {renderToString} from "@web/core/utils/render"; +import {useService} from "@web/core/utils/hooks"; + +export default class SignOcaPdfCommon extends Component { + setup() { + super.setup(...arguments); + this.model = "sign.oca.template"; + this.orm = useService("orm"); + this.field_template = "sign_oca.sign_iframe_field"; + this.pdf_url = this.getPdfUrl(); + this.viewer_url = "/web/static/lib/pdfjs/web/viewer.html?file=" + this.pdf_url; + this.iframe = useRef("sign_oca_iframe"); + var iframeResolve = ""; + var iframeReject = ""; + this.iframeLoaded = new Promise(function (resolve, reject) { + iframeResolve = resolve; + iframeReject = reject; + }); + this.items = {}; + onWillUnmount(() => { + clearTimeout(this.reviewFieldsTimeout); + }); + this.iframeLoaded.resolve = iframeResolve; + this.iframeLoaded.reject = iframeReject; + onWillStart(this.willStart.bind(this)); + onMounted(() => { + this.waitIframeLoaded(); + }); + } + getPdfUrl() { + return "/web/content/" + this.model + "/" + this.res_id + "/data"; + } + willStart() { + this.info = this.orm.call(this.model, "get_info", [[this.res_id]]); + } + waitIframeLoaded() { + var error = this.iframe.el.contentDocument.getElementById("errorWrapper"); + if (error && window.getComputedStyle(error).display !== "none") { + this.iframeLoaded.resolve(); + return Dialog.alert(this, _t("Need a valid PDF to add signature fields !")); + } + var nbPages = + this.iframe.el.contentDocument.getElementsByClassName("page").length; + var nbLayers = + this.iframe.el.contentDocument.getElementsByClassName( + "endOfContent" + ).length; + if (nbPages > 0 && nbLayers > 0) { + this.postIframeFields(); + this.reviewFields(); + } else { + var self = this; + setTimeout(function () { + self.waitIframeLoaded(); + }, 50); + } + } + reviewFields() { + if ( + this.iframe.el.contentDocument.getElementsByClassName("o_sign_oca_ready") + .length === 0 + ) { + this.postIframeFields(); + } + this.reviewFieldsTimeout = setTimeout(this.reviewFields.bind(this), 1000); + } + postIframeFields() { + this.iframe.el.contentDocument + .getElementById("viewerContainer") + .addEventListener( + "drop", + (e) => { + e.stopImmediatePropagation(); + e.stopPropagation(); + }, + true + ); + var iframeCss = document.createElement("link"); + iframeCss.setAttribute("rel", "stylesheet"); + iframeCss.setAttribute("href", "/sign_oca/get_assets.css"); + + var iframeJs = document.createElement("script"); + iframeJs.setAttribute("type", "text/javascript"); + iframeJs.setAttribute("src", "/sign_oca/get_assets.js"); + this.iframe.el.contentDocument + .getElementsByTagName("head")[0] + .append(iframeCss); + this.iframe.el.contentDocument.getElementsByTagName("head")[0].append(iframeJs); + $.each(this.info.items, (item) => { + this.postIframeField(item); + }); + $(this.iframe.el.contentDocument.getElementsByClassName("page")[0]).append( + $("
") + ); + + $(this.iframe.el.contentDocument.getElementById("viewer")).addClass( + "sign_oca_ready" + ); + this.iframeLoaded.resolve(); + } + postIframeField(item) { + if (this.items[item.id]) { + this.items[item.id].remove(); + } + var page = + this.iframe.el.contentDocument.getElementsByClassName("page")[ + item.page - 1 + ]; + var signatureItem = $( + renderToString(this.field_template, { + ...item, + }) + ); + page.append(signatureItem[0]); + this.items[item.id] = signatureItem[0]; + return signatureItem; + } +} +SignOcaPdfCommon.template = "sign_oca.SignOcaPdfCommon"; +SignOcaPdfCommon.props = []; diff --git a/sign_oca/static/src/components/sign_oca_pdf_common/sign_oca_pdf_common.xml b/sign_oca/static/src/components/sign_oca_pdf_common/sign_oca_pdf_common.xml new file mode 100644 index 00000000..5a9b0638 --- /dev/null +++ b/sign_oca/static/src/components/sign_oca_pdf_common/sign_oca_pdf_common.xml @@ -0,0 +1,20 @@ + + + +
+