From 6acd4f0445e48702d4ecc2639ac3e7ef315f1a19 Mon Sep 17 00:00:00 2001 From: Antoni Marroig Campomar Date: Mon, 20 Nov 2023 09:29:53 +0100 Subject: [PATCH 01/16] [16.0][ADD] hr_payroll_document: New module hr_payroll_document --- hr_payroll_document/README.rst | 85 ++++ hr_payroll_document/__init__.py | 2 + hr_payroll_document/__manifest__.py | 17 + .../data/email_payroll_employee.xml | 20 + hr_payroll_document/i18n/ca_ES.po | 281 ++++++++++++ hr_payroll_document/i18n/es.po | 281 ++++++++++++ .../i18n/hr_payroll_document.pot | 220 +++++++++ hr_payroll_document/models/__init__.py | 3 + hr_payroll_document/models/hr_employee.py | 14 + hr_payroll_document/models/ir_attachment.py | 14 + .../models/ir_attachment_payroll_custom.py | 18 + hr_payroll_document/readme/CONTRIBUTORS.rst | 2 + hr_payroll_document/readme/DESCRIPTION.rst | 1 + .../security/ir.model.access.csv | 3 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 424 ++++++++++++++++++ hr_payroll_document/tests/__init__.py | 1 + hr_payroll_document/tests/common.py | 51 +++ hr_payroll_document/tests/test.docx | Bin 0 -> 18655 bytes hr_payroll_document/tests/test.pdf | Bin 0 -> 33335 bytes .../tests/test_hr_payroll_document.py | 107 +++++ hr_payroll_document/wizard/__init__.py | 1 + .../wizard/payroll_management_wizard.py | 169 +++++++ .../wizard/payroll_management_wizard.xml | 42 ++ 24 files changed, 1756 insertions(+) create mode 100644 hr_payroll_document/README.rst create mode 100644 hr_payroll_document/__init__.py create mode 100644 hr_payroll_document/__manifest__.py create mode 100644 hr_payroll_document/data/email_payroll_employee.xml create mode 100644 hr_payroll_document/i18n/ca_ES.po create mode 100644 hr_payroll_document/i18n/es.po create mode 100644 hr_payroll_document/i18n/hr_payroll_document.pot create mode 100644 hr_payroll_document/models/__init__.py create mode 100644 hr_payroll_document/models/hr_employee.py create mode 100644 hr_payroll_document/models/ir_attachment.py create mode 100644 hr_payroll_document/models/ir_attachment_payroll_custom.py create mode 100644 hr_payroll_document/readme/CONTRIBUTORS.rst create mode 100644 hr_payroll_document/readme/DESCRIPTION.rst create mode 100644 hr_payroll_document/security/ir.model.access.csv create mode 100644 hr_payroll_document/static/description/icon.png create mode 100644 hr_payroll_document/static/description/index.html create mode 100644 hr_payroll_document/tests/__init__.py create mode 100644 hr_payroll_document/tests/common.py create mode 100644 hr_payroll_document/tests/test.docx create mode 100644 hr_payroll_document/tests/test.pdf create mode 100644 hr_payroll_document/tests/test_hr_payroll_document.py create mode 100644 hr_payroll_document/wizard/__init__.py create mode 100644 hr_payroll_document/wizard/payroll_management_wizard.py create mode 100644 hr_payroll_document/wizard/payroll_management_wizard.xml diff --git a/hr_payroll_document/README.rst b/hr_payroll_document/README.rst new file mode 100644 index 000000000..d8023bfd5 --- /dev/null +++ b/hr_payroll_document/README.rst @@ -0,0 +1,85 @@ +===================== +HR - Payroll Document +===================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:3698f5f5e529d5d32ae80cdc1ab30660ad4e5d39b6d98f8dace97a0b233743c5 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fpayroll-lightgray.png?logo=github + :target: https://github.com/OCA/payroll/tree/16.0/hr_payroll_document + :alt: OCA/payroll +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/payroll-16-0/payroll-16-0-hr_payroll_document + :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/payroll&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module have a wizard view to manage the different payrolls of employees which is identified by the identification_id attribute. + +**Table of contents** + +.. contents:: + :local: + +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 +~~~~~~~ + +* APSL + +Contributors +~~~~~~~~~~~~ + +* Antoni Marroig Campomar +* Miquel Alzanillas Monserrat + +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-peluko00| image:: https://github.com/peluko00.png?size=40px + :target: https://github.com/peluko00 + :alt: peluko00 + +Current `maintainer `__: + +|maintainer-peluko00| + +This module is part of the `OCA/payroll `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/hr_payroll_document/__init__.py b/hr_payroll_document/__init__.py new file mode 100644 index 000000000..134df2743 --- /dev/null +++ b/hr_payroll_document/__init__.py @@ -0,0 +1,2 @@ +from . import wizard +from . import models diff --git a/hr_payroll_document/__manifest__.py b/hr_payroll_document/__manifest__.py new file mode 100644 index 000000000..62648d123 --- /dev/null +++ b/hr_payroll_document/__manifest__.py @@ -0,0 +1,17 @@ +{ + "name": "HR - Payroll Document", + "summary": "Manage payroll for each employee", + "author": "APSL, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/payroll", + "license": "AGPL-3", + "category": "Payrolls", + "version": "16.0.1.0.0", + "depends": ["hr", "base_vat"], + "maintainers": ["peluko00"], + "external_dependencies": {"python": ["pypdf"]}, + "data": [ + "wizard/payroll_management_wizard.xml", + "security/ir.model.access.csv", + "data/email_payroll_employee.xml", + ], +} diff --git a/hr_payroll_document/data/email_payroll_employee.xml b/hr_payroll_document/data/email_payroll_employee.xml new file mode 100644 index 000000000..d3cb24cbc --- /dev/null +++ b/hr_payroll_document/data/email_payroll_employee.xml @@ -0,0 +1,20 @@ + + + + Payroll Employee + + {{object.company_id.email}} + {{object.work_email}} + Payroll {{ctx.get('subject')}} + + + + + +
{{object.company_id.name}}

Payroll

Hello ,


We send you the payroll with the subject .



+

+ + ]]> +
+
+
diff --git a/hr_payroll_document/i18n/ca_ES.po b/hr_payroll_document/i18n/ca_ES.po new file mode 100644 index 000000000..bc51c52a2 --- /dev/null +++ b/hr_payroll_document/i18n/ca_ES.po @@ -0,0 +1,281 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_document +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-12-14 10:27+0000\n" +"PO-Revision-Date: 2023-12-14 10:27+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: hr_payroll_document +#: model:mail.template,body_html:hr_payroll_document.payroll_employee_email_template +msgid "" +"\n" +" \n" +" \n" +" \n" +" \n" +"

\n" +" \n" +" \n" +" " + +#. module: hr_payroll_document +#: model:ir.model,name:hr_payroll_document.model_ir_attachment +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment__payrol_rel +msgid "Attachment" +msgstr "Adjunt" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__attachment_id +msgid "Attachment File" +msgstr "Fitxer Adjunt" + +#. module: hr_payroll_document +#: model_terms:ir.ui.view,arch_db:hr_payroll_document.payrolls_management_wizard_form +msgid "Close" +msgstr "Tancar" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__create_date +msgid "Create Date" +msgstr "Data de creació" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__create_uid +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__create_uid +msgid "Created by" +msgstr "Creat per" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__create_date +msgid "Created on" +msgstr "Creat el" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__display_name +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__display_name +msgid "Display Name" +msgstr "Nom a mostrar" + +#. module: hr_payroll_document +#: model:ir.model,name:hr_payroll_document.model_hr_employee +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__employee +msgid "Employee" +msgstr "Empleat" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/tests/test_hr_payroll_document.py:0 +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "Employees not found" +msgstr "Empleats no trobats" + +#. module: hr_payroll_document +#: model:ir.model.fields,help:hr_payroll_document.field_payroll_management_wizard__subject +msgid "Enter the title of the payroll whether it is the month, week, day, etc." +msgstr "Introduïu el títol de la nòmina ja sigui el mes, setmana, dia, etc." + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__id +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__id +msgid "ID" +msgstr "" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/tests/test_hr_payroll_document.py:0 +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "IDs whose employee has not been found: " +msgstr "IDs dels empleats que no s'han trobat: " + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__identification_id +msgid "Identification ID" +msgstr "Identificació ID" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom____last_update +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard____last_update +msgid "Last Modified on" +msgstr "Darrera modificació el" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__write_uid +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__write_uid +msgid "Last Updated by" +msgstr "Darrera actualització per" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__write_date +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__write_date +msgid "Last Updated on" +msgstr "Darrera actualització el" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "Missing pdf file signature" +msgstr "Els fitxers han de ser de tipus pdf" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "Payroll" +msgstr "Nòmina" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "Payroll " +msgstr "Nòmina " + +#. module: hr_payroll_document +#: model:mail.template,name:hr_payroll_document.payroll_employee_email_template +msgid "Payroll Employee" +msgstr "Nòmina Empleat" + +#. module: hr_payroll_document +#: model:ir.model,name:hr_payroll_document.model_payroll_management_wizard +msgid "Payroll Management" +msgstr "Gestió Nòmines" + +#. module: hr_payroll_document +#: model:ir.model,name:hr_payroll_document.model_ir_attachment_payroll_custom +msgid "Payroll attachment" +msgstr "Adjunt Nòmina" + +#. module: hr_payroll_document +#: model:mail.template,subject:hr_payroll_document.payroll_employee_email_template +msgid "Payroll {{ctx.get('subject')}}" +msgstr "Nòmina {{ctx.get('month')}}" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__payrolls +msgid "Payrolls" +msgstr "Nòmines" + +#. module: hr_payroll_document +#: model:ir.actions.act_window,name:hr_payroll_document.payrolls_management_wizard_action +#: model:ir.ui.menu,name:hr_payroll_document.payrolls_management_wizard_menu_action +msgid "Payrolls Management" +msgstr "Gestió Nòmines" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/tests/test_hr_payroll_document.py:0 +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "Payrolls sent" +msgstr "Nòmines enviades" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/tests/test_hr_payroll_document.py:0 +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "Payrolls sent to employees correctly" +msgstr "Nòmines envides als empleats correctament" + +#. module: hr_payroll_document +#: model_terms:ir.ui.view,arch_db:hr_payroll_document.payrolls_management_wizard_form +msgid "Send" +msgstr "Enviar" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__subject +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__subject +msgid "Subject" +msgstr "Assumpte" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/models/hr_employee.py:0 +#, python-format +msgid "The field identification ID is not valid" +msgstr "El camp identificatiu ID no és vàlid" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "You must to filled country field of company" +msgstr "Falta emplenar el camp de país de l'empresa" diff --git a/hr_payroll_document/i18n/es.po b/hr_payroll_document/i18n/es.po new file mode 100644 index 000000000..9a0ac3761 --- /dev/null +++ b/hr_payroll_document/i18n/es.po @@ -0,0 +1,281 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_document +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-12-14 10:28+0000\n" +"PO-Revision-Date: 2023-12-14 10:28+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: hr_payroll_document +#: model:mail.template,body_html:hr_payroll_document.payroll_employee_email_template +msgid "" +"\n" +" \n" +" \n" +" \n" +"
\"{{object.company_id.name}}\"

Payroll

Hello ,

We send you the payroll with the subject .



\"{{object.company_id.name}}\"

Nòmina

Hola ,


Et remetem " +"la teva nòmina del mes de .



\n" +"

\n" +" \n" +" \n" +" " + +#. module: hr_payroll_document +#: model:ir.model,name:hr_payroll_document.model_ir_attachment +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment__payrol_rel +msgid "Attachment" +msgstr "Adjunto" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__attachment_id +msgid "Attachment File" +msgstr "Fichero Adjunto" + +#. module: hr_payroll_document +#: model_terms:ir.ui.view,arch_db:hr_payroll_document.payrolls_management_wizard_form +msgid "Close" +msgstr "Cerrar" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__create_date +msgid "Create Date" +msgstr "Fecha de creación" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__create_uid +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__display_name +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__display_name +msgid "Display Name" +msgstr "Nombre para mostrar" + +#. module: hr_payroll_document +#: model:ir.model,name:hr_payroll_document.model_hr_employee +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__employee +msgid "Employee" +msgstr "Empleado" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/tests/test_hr_payroll_document.py:0 +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "Employees not found" +msgstr "Empleados no encontrados" + +#. module: hr_payroll_document +#: model:ir.model.fields,help:hr_payroll_document.field_payroll_management_wizard__subject +msgid "Enter the title of the payroll whether it is the month, week, day, etc." +msgstr "Introduzca el título de la nómina ya sea el mes, semana, día , etc.." + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__id +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__id +msgid "ID" +msgstr "" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/tests/test_hr_payroll_document.py:0 +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "IDs whose employee has not been found: " +msgstr "IDs de los empleados que no se han encontrado: " + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__identification_id +msgid "Identification ID" +msgstr "Identificación ID" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom____last_update +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard____last_update +msgid "Last Modified on" +msgstr "Última modificación el" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__write_uid +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__write_uid +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__write_date +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__write_date +msgid "Last Updated on" +msgstr "Última actualización el" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "Missing pdf file signature" +msgstr "Los archivos tienen que ser de tipo pdf" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "Payroll" +msgstr "Nómina" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "Payroll " +msgstr "Nómina " + +#. module: hr_payroll_document +#: model:mail.template,name:hr_payroll_document.payroll_employee_email_template +msgid "Payroll Employee" +msgstr "Nómina Empleado" + +#. module: hr_payroll_document +#: model:ir.model,name:hr_payroll_document.model_payroll_management_wizard +msgid "Payroll Management" +msgstr "Gestión Nóminas" + +#. module: hr_payroll_document +#: model:ir.model,name:hr_payroll_document.model_ir_attachment_payroll_custom +msgid "Payroll attachment" +msgstr "Adjunto Nómina" + +#. module: hr_payroll_document +#: model:mail.template,subject:hr_payroll_document.payroll_employee_email_template +msgid "Payroll {{ctx.get('subject')}}" +msgstr "Nómina {{ctx.get('month')}}" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__payrolls +msgid "Payrolls" +msgstr "Nóminas" + +#. module: hr_payroll_document +#: model:ir.actions.act_window,name:hr_payroll_document.payrolls_management_wizard_action +#: model:ir.ui.menu,name:hr_payroll_document.payrolls_management_wizard_menu_action +msgid "Payrolls Management" +msgstr "Gestión Nóminas" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/tests/test_hr_payroll_document.py:0 +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "Payrolls sent" +msgstr "Nóminas enviadas" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/tests/test_hr_payroll_document.py:0 +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "Payrolls sent to employees correctly" +msgstr "Nóminas enviadas a los empleados correctamente" + +#. module: hr_payroll_document +#: model_terms:ir.ui.view,arch_db:hr_payroll_document.payrolls_management_wizard_form +msgid "Send" +msgstr "Enviar" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__subject +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__subject +msgid "Subject" +msgstr "Asunto" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/models/hr_employee.py:0 +#, python-format +msgid "The field identification ID is not valid" +msgstr "El campo identificativo ID no es válido" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "You must to filled country field of company" +msgstr "Falta rellenar el campo del país de la empresa" diff --git a/hr_payroll_document/i18n/hr_payroll_document.pot b/hr_payroll_document/i18n/hr_payroll_document.pot new file mode 100644 index 000000000..263745009 --- /dev/null +++ b/hr_payroll_document/i18n/hr_payroll_document.pot @@ -0,0 +1,220 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_document +# +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: hr_payroll_document +#: model:mail.template,body_html:hr_payroll_document.payroll_employee_email_template +msgid "" +"\n" +" \n" +" \n" +" \n" +"
\"{{object.company_id.name}}\"

Payroll

Hello ,

We send you the payroll with the subject .



\"{{object.company_id.name}}\"

Nómina

Hola ,


Te enviamos " +"la nómina del mes de .



\"{{object.company_id.name}}\"

Payroll

Hello ,


We send you the payroll with the subject .



\n" +"

\n" +" \n" +" \n" +" " +msgstr "" + +#. module: hr_payroll_document +#: model:ir.model,name:hr_payroll_document.model_ir_attachment +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment__payrol_rel +msgid "Attachment" +msgstr "" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__attachment_id +msgid "Attachment File" +msgstr "" + +#. module: hr_payroll_document +#: model_terms:ir.ui.view,arch_db:hr_payroll_document.payrolls_management_wizard_form +msgid "Close" +msgstr "" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__create_date +msgid "Create Date" +msgstr "" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__create_uid +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__create_uid +msgid "Created by" +msgstr "" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__create_date +msgid "Created on" +msgstr "" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__display_name +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__display_name +msgid "Display Name" +msgstr "" + +#. module: hr_payroll_document +#: model:ir.model,name:hr_payroll_document.model_hr_employee +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__employee +msgid "Employee" +msgstr "" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/tests/test_hr_payroll_document.py:0 +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "Employees not found" +msgstr "" + +#. module: hr_payroll_document +#: model:ir.model.fields,help:hr_payroll_document.field_payroll_management_wizard__subject +msgid "" +"Enter the title of the payroll whether it is the month, week, day, etc." +msgstr "" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__id +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__id +msgid "ID" +msgstr "" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/tests/test_hr_payroll_document.py:0 +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "IDs whose employee has not been found: " +msgstr "" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__identification_id +msgid "Identification ID" +msgstr "" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom____last_update +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard____last_update +msgid "Last Modified on" +msgstr "" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__write_uid +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__write_date +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__write_date +msgid "Last Updated on" +msgstr "" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "Missing pdf file signature" +msgstr "" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "Payroll" +msgstr "" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "Payroll " +msgstr "" + +#. module: hr_payroll_document +#: model:mail.template,name:hr_payroll_document.payroll_employee_email_template +msgid "Payroll Employee" +msgstr "" + +#. module: hr_payroll_document +#: model:ir.model,name:hr_payroll_document.model_payroll_management_wizard +msgid "Payroll Management" +msgstr "" + +#. module: hr_payroll_document +#: model:ir.model,name:hr_payroll_document.model_ir_attachment_payroll_custom +msgid "Payroll attachment" +msgstr "" + +#. module: hr_payroll_document +#: model:mail.template,subject:hr_payroll_document.payroll_employee_email_template +msgid "Payroll {{ctx.get('subject')}}" +msgstr "" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__payrolls +msgid "Payrolls" +msgstr "" + +#. module: hr_payroll_document +#: model:ir.actions.act_window,name:hr_payroll_document.payrolls_management_wizard_action +#: model:ir.ui.menu,name:hr_payroll_document.payrolls_management_wizard_menu_action +msgid "Payrolls Management" +msgstr "" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/tests/test_hr_payroll_document.py:0 +#: code:addons/hr_payroll_document/tests/test_hr_payroll_document.py:0 +#: code:addons/hr_payroll_document/tests/test_hr_payroll_document.py:0 +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "Payrolls sent" +msgstr "" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/tests/test_hr_payroll_document.py:0 +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "Payrolls sent to employees correctly" +msgstr "" + +#. module: hr_payroll_document +#: model_terms:ir.ui.view,arch_db:hr_payroll_document.payrolls_management_wizard_form +msgid "Send" +msgstr "" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__subject +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__subject +msgid "Subject" +msgstr "" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/models/hr_employee.py:0 +#, python-format +msgid "The field identification ID is not valid" +msgstr "" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "You must to filled country field of company" +msgstr "" diff --git a/hr_payroll_document/models/__init__.py b/hr_payroll_document/models/__init__.py new file mode 100644 index 000000000..9fa86bfb9 --- /dev/null +++ b/hr_payroll_document/models/__init__.py @@ -0,0 +1,3 @@ +from . import ir_attachment_payroll_custom +from . import ir_attachment +from . import hr_employee diff --git a/hr_payroll_document/models/hr_employee.py b/hr_payroll_document/models/hr_employee.py new file mode 100644 index 000000000..8d9e38892 --- /dev/null +++ b/hr_payroll_document/models/hr_employee.py @@ -0,0 +1,14 @@ +from odoo import _, models +from odoo.exceptions import ValidationError + + +class Employee(models.Model): + _inherit = "hr.employee" + + def write(self, vals): + res = super().write(vals) + if "identification_id" in vals and not self.env["res.partner"].simple_vat_check( + self.env.company.country_id.code, vals["identification_id"] + ): + raise ValidationError(_("The field identification ID is not valid")) + return res diff --git a/hr_payroll_document/models/ir_attachment.py b/hr_payroll_document/models/ir_attachment.py new file mode 100644 index 000000000..c5bac7524 --- /dev/null +++ b/hr_payroll_document/models/ir_attachment.py @@ -0,0 +1,14 @@ +from odoo import fields, models + + +class Attachment(models.Model): + _inherit = "ir.attachment" + + payrol_rel = fields.Many2many( + "payroll.management.wizard", + "payrolls", + "attachment_id3", + "document_id", + string="Attachment", + invisible=1, + ) diff --git a/hr_payroll_document/models/ir_attachment_payroll_custom.py b/hr_payroll_document/models/ir_attachment_payroll_custom.py new file mode 100644 index 000000000..96c200043 --- /dev/null +++ b/hr_payroll_document/models/ir_attachment_payroll_custom.py @@ -0,0 +1,18 @@ +from odoo import fields, models + + +class IRAttachmentPayrollCustom(models.Model): + _name = "ir.attachment.payroll.custom" + _description = "Payroll attachment" + + attachment_id = fields.Many2one( + comodel_name="ir.attachment", + string="Attachment File", + prefetch=False, + invisible=True, + ondelete="cascade", + ) + employee = fields.Char() + identification_id = fields.Char("Identification ID") + create_date = fields.Date(default=fields.Date.context_today) + subject = fields.Char() diff --git a/hr_payroll_document/readme/CONTRIBUTORS.rst b/hr_payroll_document/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..08488d3fa --- /dev/null +++ b/hr_payroll_document/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Antoni Marroig Campomar +* Miquel Alzanillas Monserrat diff --git a/hr_payroll_document/readme/DESCRIPTION.rst b/hr_payroll_document/readme/DESCRIPTION.rst new file mode 100644 index 000000000..a4011cb52 --- /dev/null +++ b/hr_payroll_document/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module have a wizard view to manage the different payrolls of employees which is identified by the identification_id attribute. diff --git a/hr_payroll_document/security/ir.model.access.csv b/hr_payroll_document/security/ir.model.access.csv new file mode 100644 index 000000000..bd91389ae --- /dev/null +++ b/hr_payroll_document/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +payroll_management_wizard,payroll.management.wizard,model_payroll_management_wizard,hr.group_hr_manager,1,1,1,1 +ir_attachment_payroll_custom,ir.attachment.payroll.custom,model_ir_attachment_payroll_custom,hr.group_hr_manager,1,1,1,1 diff --git a/hr_payroll_document/static/description/icon.png b/hr_payroll_document/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z z?n?eq1XP>p-IM$Z^C;2L3itnbJZAip*Zo0aw2bs8@(s^~*8T9go!%dHcAz2lM;`yp zD=7&xjFV$S&5uDaiScyD?B-i1ze`+CoRtz`Wn+Zl&#s4&}MO{@N!ufrzjG$B79)Y2d3tBk&)TxUTw@QS0TEL_?njX|@vq?Uz(nBFK5Pq7*xj#u*R&i|?7+6# z+|r_n#SW&LXhtheZdah{ZVoqwyT{D>MC3nkFF#N)xLi{p7J1jXlmVeb;cP5?e(=f# zuT7fvjSbjS781v?7{)-X3*?>tq?)Yd)~|1{BDS(pqC zC}~H#WXlkUW*H5CDOo<)#x7%RY)A;ShGhI5s*#cRDA8YgqG(HeKDx+#(ZQ?386dv! zlXCO)w91~Vw4AmOcATuV653fa9R$fyK8ul%rG z-wfS zihugoZyr38Im?Zuh6@RcF~t1anQu7>#lPpb#}4cOA!EM11`%f*07RqOVkmX{p~KJ9 z^zP;K#|)$`^Rb{rnHGH{~>1(fawV0*Z#)}M`m8-?ZJV<+e}s9wE# z)l&az?w^5{)`S(%MRzxdNqrs1n*-=jS^_jqE*5XDrA0+VE`5^*p3CuM<&dZEeCjoz zR;uu_H9ZPZV|fQq`Cyw4nscrVwi!fE6ciMmX$!_hN7uF;jjKG)d2@aC4ropY)8etW=xJvni)8eHi`H$%#zn^WJ5NLc-rqk|u&&4Z6fD_m&JfSI1Bvb?b<*n&sfl0^t z=HnmRl`XrFvMKB%9}>PaA`m-fK6a0(8=qPkWS5bb4=v?XcWi&hRY?O5HdulRi4?fN zlsJ*N-0Qw+Yic@s0(2uy%F@ib;GjXt01Fmx5XbRo6+n|pP(&nodMoap^z{~q ziEeaUT@Mxe3vJSfI6?uLND(CNr=#^W<1b}jzW58bIfyWTDle$mmS(|x-0|2UlX+9k zQ^EX7Nw}?EzVoBfT(-LT|=9N@^hcn-_p&sqG z&*oVs2JSU+N4ZD`FhCAWaS;>|wH2G*Id|?pa#@>tyxX`+4HyIArWDvVrX)2WAOQff z0qyHu&-S@i^MS-+j--!pr4fPBj~_8({~e1bfcl0wI1kaoN>mJL6KUPQm5N7lB(ui1 zE-o%kq)&djzWJ}ob<-GfDlkB;F31j-VHKvQUGQ3sp`CwyGJk_i!y^sD0fqC@$9|jO zOqN!r!8-p==F@ZVP=U$qSpY(gQ0)59P1&t@y?5rvg<}E+GB}26NYPp4f2YFQrQtot5mn3wu_qprZ=>Ig-$ zbW26Ws~IgY>}^5w`vTB(G`PTZaDiGBo5o(tp)qli|NeV( z@H_=R8V39rt5J5YB2Ky?4eJJ#b`_iBe2ot~6%7mLt5t8Vwi^Jy7|jWXqa3amOIoRb zOr}WVFP--DsS`1WpN%~)t3R!arKF^Q$e12KEqU36AWwnCBICpH4XCsfnyrHr>$I$4 z!DpKX$OKLWarN7nv@!uIA+~RNO)l$$w}p(;b>mx8pwYvu;dD_unryX_NhT8*Tj>BTrTTL&!?O+%Rv;b?B??gSzdp?6Uug9{ zd@V08Z$BdI?fpoCS$)t4mg4rT8Q_I}h`0d-vYZ^|dOB*Q^S|xqTV*vIg?@fVFSmMpaw0qtTRbx} z({Pg?#{2`sc9)M5N$*N|4;^t$+QP?#mov zGVC@I*lBVrOU-%2y!7%)fAKjpEFsgQc4{amtiHb95KQEwvf<(3T<9-Zm$xIew#P22 zc2Ix|App^>v6(3L_MCU0d3W##AB0M~3D00EWoKZqsJYT(#@w$Y_H7G22M~ApVFTRHMI_3be)Lkn#0F*V8Pq zc}`Cjy$bE;FJ6H7p=0y#R>`}-m4(0F>%@P|?7fx{=R^uFdISRnZ2W_xQhD{YuR3t< z{6yxu=4~JkeA;|(J6_nv#>Nvs&FuLA&PW^he@t(UwFFE8)|a!R{`E`K`i^ZnyE4$k z;(749Ix|oi$c3QbEJ3b~D_kQsPz~fIUKym($a_7dJ?o+40*OLl^{=&oq$<#Q(yyrp z{J-FAniyAw9tPbe&IhQ|a`DqFTVQGQ&Gq3!C2==4x{6EJwiPZ8zub-iXoUtkJiG{} zPaR&}_fn8_z~(=;5lD-aPWD3z8PZS@AaUiomF!G8I}Mf>e~0g#BelA-5#`cj;O5>N Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/hr_payroll_document/static/description/index.html b/hr_payroll_document/static/description/index.html new file mode 100644 index 000000000..f9e203549 --- /dev/null +++ b/hr_payroll_document/static/description/index.html @@ -0,0 +1,424 @@ + + + + + + +HR - Payroll Document + + + +
+

HR - Payroll Document

+ + +

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

+

This module have a wizard view to manage the different payrolls of employees which is identified by the identification_id attribute.

+

Table of contents

+ +
+

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

+
    +
  • APSL
  • +
+
+
+

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:

+

peluko00

+

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

+

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

+
+
+
+ + diff --git a/hr_payroll_document/tests/__init__.py b/hr_payroll_document/tests/__init__.py new file mode 100644 index 000000000..75f544418 --- /dev/null +++ b/hr_payroll_document/tests/__init__.py @@ -0,0 +1 @@ +from . import test_hr_payroll_document diff --git a/hr_payroll_document/tests/common.py b/hr_payroll_document/tests/common.py new file mode 100644 index 000000000..6214e13ae --- /dev/null +++ b/hr_payroll_document/tests/common.py @@ -0,0 +1,51 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. +import base64 + +from odoo.modules.module import get_module_resource +from odoo.tests import common + +from odoo.addons.mail.tests.common import mail_new_test_user + + +class TestHrPayrollDocument(common.TransactionCase): + def setUp(self): + super(TestHrPayrollDocument, self).setUp() + self.env.user.tz = "Europe/Brussels" + self.user_admin = self.env.ref("base.user_admin") + + # Fix Company without country + self.env.company.country_id = False + + # Test users to use through the various tests + self.user_employee = mail_new_test_user( + self.env, login="david", groups="base.group_user" + ) + self.user_employee_id = self.user_employee.id + + # Hr Data + self.employee_emp = self.env["hr.employee"].create( + { + "name": "David Employee", + "user_id": self.user_employee_id, + "company_id": 1, + "identification_id": "30831011V", + } + ) + + with open( + get_module_resource("hr_payroll_document", "tests", "test.pdf"), "rb" + ) as pdf_file: + encoded_string = base64.b64encode(pdf_file.read()) + ir_values = { + "name": "test", + "type": "binary", + "datas": encoded_string, + "store_fname": encoded_string, + "res_model": "payroll.management.wizard", + "res_id": 1, + } + self.attachment = self.env["ir.attachment"].create(ir_values) + self.subject = "January" + self.wizard = self.env["payroll.management.wizard"].create( + {"payrolls": [self.attachment.id], "subject": self.subject} + ) diff --git a/hr_payroll_document/tests/test.docx b/hr_payroll_document/tests/test.docx new file mode 100644 index 0000000000000000000000000000000000000000..8a2af5ab5b484a944525d51bf4b5447fe7d25766 GIT binary patch literal 18655 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 MbOdf{?QjM00NX-lU;qFB literal 0 HcmV?d00001 diff --git a/hr_payroll_document/tests/test.pdf b/hr_payroll_document/tests/test.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8138280c2d8198a99074a0931e99882ee475ef98 GIT binary patch literal 33335 zcmd421CV83vhdqow!3WGw%ujhw$WwVwr$(C?dr1ade#4#xijLD$0C7?(!L(9Yh}+6tG3j+zOVn;XK=%HYp1^#3y4 z-+D;vnaMj?;?hVOS{XZ-;L_1D(&N$yn_4&++I{_6=sFk*8tPjce2p!IOV9Y{lAXN+ zE*&%TpHb}{>e38y7abEC5tpyZVrD2qJiOwsUtufE6ZW~Q~9|? zPAnISTvT->g!hnTIIuh0cYqT5cPjCmS1!&{gMz?3Avf!+AiL{(7fi8cdeeJpYE;hc>l#6sfl`9bQnQQN{+L!LF}m;y zv?ds)x;0CD4Z>CiT8J<1kp)z@O5$^Aa4=cK=e65|kZ^)2>|*|0U>s8kGvm3G$fw%w z+4bOxS1(4BQ@ib}=_W`&2IE^Ae4bMoH$nT4_Y~&x#W&Vz;zjJMhMEQtkik(iWK2sF z$GL?@r8?3#ZE9ZmfTv87d#eQTR3Q$V8`xFz}B4iEHpEu z$Ozol@cHg3)}W4vfzKB^#46=q0LU zzO9aPJr*rJZE-E&{2n?iW}@3@QVj)y5bEijR5_2xduD)H;vVI(-~PyQ*`S}r_8J!8 zM;e1HIS4D1$T}8OLLzXi2`XA1V!+&H)7mEL>}6r?r)VEEhp!+HA@~)hpS}&<+4uPL zooAP%UC8IIWsE<;OUGX}^8js-l&*)3+UB}iV;Jg3Df%vCp-U9nLGluyt8hW^r4U+$ zoKOZ4H8^EdO*g`rLOdj85`L_TZUZUdg4aQFFBA8+HhXMbgAI*^-MwvesH<2`1bmlr z5D$$>?|2}RrfE*m{T**XEdCO4VRj6KEzP5K-a)$QS zj&}NA&hw93Rrzv(hWZYF9SghA;xhc*qYAsw;eJi=kE`Y8{_~-cchqzE%gz4fg=zlg zK>yMGA0G7oqgAo}4_77R;vgdL@a4X78JPcC1C6k?l>;urA3glpJM66W{&!aO zPYYxGBlf28yOhJ~^IuPux!j03`(7EbV$Yao8Lf1|j}R0uZv3>pA}AL9N) z=j|$#1&RT58T@I-SyF)tt1)a7`A`^iB*|;Qzvo6=EjXy+jtltbIr{l_TjzkI|W??5N;Ux5_^E8V|`ObyEJ3i3k_ z+;k&sMVxv>T=?1Gp$*wLa5bUDq`uz1q+r1`f_$0Zf%X-vJ6FjG%sSM_)clHrm4IdA z@gca?sUQ^UfiM®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 + + + payroll.management.wizard.form + payroll.management.wizard + +
+ + + + + +
+
+
+
+
+
+ + Payrolls Management + payroll.management.wizard + form + new + + + +
From 0c572053966c5f24473047daf3538050583c1358 Mon Sep 17 00:00:00 2001 From: mymage Date: Mon, 4 Mar 2024 08:06:01 +0000 Subject: [PATCH 02/16] Added translation using Weblate (Italian) --- hr_payroll_document/i18n/it.po | 260 +++++++++++++++++++++++++++++++++ 1 file changed, 260 insertions(+) create mode 100644 hr_payroll_document/i18n/it.po diff --git a/hr_payroll_document/i18n/it.po b/hr_payroll_document/i18n/it.po new file mode 100644 index 000000000..aee0a92d9 --- /dev/null +++ b/hr_payroll_document/i18n/it.po @@ -0,0 +1,260 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_document +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-03-04 15:34+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 4.17\n" + +#. module: hr_payroll_document +#: model:mail.template,body_html:hr_payroll_document.payroll_employee_email_template +msgid "" +"\n" +" \n" +" \n" +" \n" +"
\"{{object.company_id.name}}\"

Payroll

Hello ,


We send you the payroll with the subject .



\n" +"

\n" +" \n" +" \n" +" " +msgstr "" +"\n" +" \n" +" \n" +" \n" +"
\""

Stipendio

Hello ,


Abbiamo inviato la " +"retribuzione con soggetto.



" +"
\n" +"

\n" +" \n" +" \n" +" " + +#. module: hr_payroll_document +#: model:ir.model,name:hr_payroll_document.model_ir_attachment +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment__payrol_rel +msgid "Attachment" +msgstr "Allegato" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__attachment_id +msgid "Attachment File" +msgstr "File allegato" + +#. module: hr_payroll_document +#: model_terms:ir.ui.view,arch_db:hr_payroll_document.payrolls_management_wizard_form +msgid "Close" +msgstr "Chiudi" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__create_date +msgid "Create Date" +msgstr "Data creazione" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__create_uid +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__display_name +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: hr_payroll_document +#: model:ir.model,name:hr_payroll_document.model_hr_employee +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__employee +msgid "Employee" +msgstr "Dipendente" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/tests/test_hr_payroll_document.py:0 +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "Employees not found" +msgstr "Dipendenti non trovati" + +#. module: hr_payroll_document +#: model:ir.model.fields,help:hr_payroll_document.field_payroll_management_wizard__subject +msgid "" +"Enter the title of the payroll whether it is the month, week, day, etc." +msgstr "" +"Inserire il titolo della retribuzione se è il mese, settimana, giorno, ecc." + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__id +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__id +msgid "ID" +msgstr "ID" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/tests/test_hr_payroll_document.py:0 +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "IDs whose employee has not been found: " +msgstr "ID il cui dipendente non è stato trovato: " + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__identification_id +msgid "Identification ID" +msgstr "ID identificazione" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom____last_update +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard____last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__write_uid +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__write_date +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "Missing pdf file signature" +msgstr "Firma PDF mancante" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "Payroll" +msgstr "Retribuzione" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "Payroll " +msgstr "Retribuzione " + +#. module: hr_payroll_document +#: model:mail.template,name:hr_payroll_document.payroll_employee_email_template +msgid "Payroll Employee" +msgstr "Retribuzione dipendente" + +#. module: hr_payroll_document +#: model:ir.model,name:hr_payroll_document.model_payroll_management_wizard +msgid "Payroll Management" +msgstr "Gestione retribuzione" + +#. module: hr_payroll_document +#: model:ir.model,name:hr_payroll_document.model_ir_attachment_payroll_custom +msgid "Payroll attachment" +msgstr "Allegato retribuzione" + +#. module: hr_payroll_document +#: model:mail.template,subject:hr_payroll_document.payroll_employee_email_template +msgid "Payroll {{ctx.get('subject')}}" +msgstr "Retribuzione {{ctx.get('subject')}}" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__payrolls +msgid "Payrolls" +msgstr "Retribuzioni" + +#. module: hr_payroll_document +#: model:ir.actions.act_window,name:hr_payroll_document.payrolls_management_wizard_action +#: model:ir.ui.menu,name:hr_payroll_document.payrolls_management_wizard_menu_action +msgid "Payrolls Management" +msgstr "Gestione retribuzioni" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/tests/test_hr_payroll_document.py:0 +#: code:addons/hr_payroll_document/tests/test_hr_payroll_document.py:0 +#: code:addons/hr_payroll_document/tests/test_hr_payroll_document.py:0 +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "Payrolls sent" +msgstr "Retribuzioni inviate" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/tests/test_hr_payroll_document.py:0 +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "Payrolls sent to employees correctly" +msgstr "Retribuzioni inviate correttamente ai dipendenti" + +#. module: hr_payroll_document +#: model_terms:ir.ui.view,arch_db:hr_payroll_document.payrolls_management_wizard_form +msgid "Send" +msgstr "Invia" + +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__subject +#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__subject +msgid "Subject" +msgstr "Oggetto" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/models/hr_employee.py:0 +#, python-format +msgid "The field identification ID is not valid" +msgstr "L'ID identificazione file non è corretto" + +#. module: hr_payroll_document +#. odoo-python +#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#, python-format +msgid "You must to filled country field of company" +msgstr "Serve compilare il campo nazione dell'azienda" From b251e0e40e4e39f47309998e65bec49e5e547e82 Mon Sep 17 00:00:00 2001 From: Antoni Marroig Campomar Date: Mon, 20 May 2024 16:20:01 +0200 Subject: [PATCH 03/16] [IMP] hr_payroll_document: pre-commit auto fixes --- hr_payroll_document/README.rst | 23 ++++++++++--------- hr_payroll_document/pyproject.toml | 3 +++ hr_payroll_document/readme/CONTRIBUTORS.md | 2 ++ hr_payroll_document/readme/CONTRIBUTORS.rst | 2 -- hr_payroll_document/readme/DESCRIPTION.md | 2 ++ hr_payroll_document/readme/DESCRIPTION.rst | 1 - .../static/description/index.html | 10 ++++---- hr_payroll_document/tests/common.py | 2 +- .../wizard/payroll_management_wizard.py | 4 +++- 9 files changed, 28 insertions(+), 21 deletions(-) create mode 100644 hr_payroll_document/pyproject.toml create mode 100644 hr_payroll_document/readme/CONTRIBUTORS.md delete mode 100644 hr_payroll_document/readme/CONTRIBUTORS.rst create mode 100644 hr_payroll_document/readme/DESCRIPTION.md delete mode 100644 hr_payroll_document/readme/DESCRIPTION.rst diff --git a/hr_payroll_document/README.rst b/hr_payroll_document/README.rst index d8023bfd5..f72573f0c 100644 --- a/hr_payroll_document/README.rst +++ b/hr_payroll_document/README.rst @@ -17,18 +17,19 @@ HR - Payroll Document :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fpayroll-lightgray.png?logo=github - :target: https://github.com/OCA/payroll/tree/16.0/hr_payroll_document + :target: https://github.com/OCA/payroll/tree/17.0/hr_payroll_document :alt: OCA/payroll .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/payroll-16-0/payroll-16-0-hr_payroll_document + :target: https://translation.odoo-community.org/projects/payroll-17-0/payroll-17-0-hr_payroll_document :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/payroll&target_branch=16.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/payroll&target_branch=17.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| -This module have a wizard view to manage the different payrolls of employees which is identified by the identification_id attribute. +This module have a wizard view to manage the different payrolls of +employees which is identified by the identification_id attribute. **Table of contents** @@ -41,7 +42,7 @@ 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 `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -49,18 +50,18 @@ Credits ======= Authors -~~~~~~~ +------- * APSL Contributors -~~~~~~~~~~~~ +------------ -* Antoni Marroig Campomar -* Miquel Alzanillas Monserrat +- Antoni Marroig Campomar +- Miquel Alzanillas Monserrat Maintainers -~~~~~~~~~~~ +----------- This module is maintained by the OCA. @@ -80,6 +81,6 @@ Current `maintainer `__: |maintainer-peluko00| -This module is part of the `OCA/payroll `_ project on GitHub. +This module is part of the `OCA/payroll `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/hr_payroll_document/pyproject.toml b/hr_payroll_document/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/hr_payroll_document/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/hr_payroll_document/readme/CONTRIBUTORS.md b/hr_payroll_document/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..619e6b256 --- /dev/null +++ b/hr_payroll_document/readme/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +- Antoni Marroig Campomar \<\> +- Miquel Alzanillas Monserrat \<\> diff --git a/hr_payroll_document/readme/CONTRIBUTORS.rst b/hr_payroll_document/readme/CONTRIBUTORS.rst deleted file mode 100644 index 08488d3fa..000000000 --- a/hr_payroll_document/readme/CONTRIBUTORS.rst +++ /dev/null @@ -1,2 +0,0 @@ -* Antoni Marroig Campomar -* Miquel Alzanillas Monserrat diff --git a/hr_payroll_document/readme/DESCRIPTION.md b/hr_payroll_document/readme/DESCRIPTION.md new file mode 100644 index 000000000..fb12e7d44 --- /dev/null +++ b/hr_payroll_document/readme/DESCRIPTION.md @@ -0,0 +1,2 @@ +This module have a wizard view to manage the different payrolls of +employees which is identified by the identification_id attribute. diff --git a/hr_payroll_document/readme/DESCRIPTION.rst b/hr_payroll_document/readme/DESCRIPTION.rst deleted file mode 100644 index a4011cb52..000000000 --- a/hr_payroll_document/readme/DESCRIPTION.rst +++ /dev/null @@ -1 +0,0 @@ -This module have a wizard view to manage the different payrolls of employees which is identified by the identification_id attribute. diff --git a/hr_payroll_document/static/description/index.html b/hr_payroll_document/static/description/index.html index f9e203549..42b68336a 100644 --- a/hr_payroll_document/static/description/index.html +++ b/hr_payroll_document/static/description/index.html @@ -1,4 +1,3 @@ - @@ -369,8 +368,9 @@

HR - Payroll Document

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:3698f5f5e529d5d32ae80cdc1ab30660ad4e5d39b6d98f8dace97a0b233743c5 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

-

This module have a wizard view to manage the different payrolls of employees which is identified by the identification_id attribute.

+

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

+

This module have a wizard view to manage the different payrolls of +employees which is identified by the identification_id attribute.

Table of contents

    @@ -388,7 +388,7 @@

    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.

    +feedback.

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

@@ -415,7 +415,7 @@

Maintainers

promote its widespread use.

Current maintainer:

peluko00

-

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

+

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

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

diff --git a/hr_payroll_document/tests/common.py b/hr_payroll_document/tests/common.py index 6214e13ae..f9cab755b 100644 --- a/hr_payroll_document/tests/common.py +++ b/hr_payroll_document/tests/common.py @@ -9,7 +9,7 @@ class TestHrPayrollDocument(common.TransactionCase): def setUp(self): - super(TestHrPayrollDocument, self).setUp() + super().setUp() self.env.user.tz = "Europe/Brussels" self.user_admin = self.env.ref("base.user_admin") diff --git a/hr_payroll_document/wizard/payroll_management_wizard.py b/hr_payroll_document/wizard/payroll_management_wizard.py index 208753033..fcb7fd8ed 100644 --- a/hr_payroll_document/wizard/payroll_management_wizard.py +++ b/hr_payroll_document/wizard/payroll_management_wizard.py @@ -54,7 +54,9 @@ def send_payrolls(self): path = "/tmp/" + _("Payroll ") + employee.name + ".pdf" - # Encrypt the payroll file with the identification identifier of the employee + """ + Encrypt the payroll file with the identification identifier of the employee + """ pdfWriter.encrypt(employee.identification_id, algorithm="AES-256") f = open(path, "wb") From e3a91e4e84ebfe7825da25a36348dbb9fbf5a61d Mon Sep 17 00:00:00 2001 From: Antoni Marroig Campomar Date: Tue, 21 May 2024 17:19:18 +0200 Subject: [PATCH 04/16] [MIG] hr_payroll_document : Migration to 17.0 --- hr_payroll_document/README.rst | 14 ++- hr_payroll_document/__manifest__.py | 3 +- hr_payroll_document/i18n/es.po | 115 +++++++----------- .../i18n/hr_payroll_document.pot | 48 ++++++-- hr_payroll_document/models/__init__.py | 1 + hr_payroll_document/models/hr_employee.py | 32 ++++- hr_payroll_document/models/ir_attachment.py | 2 +- .../models/ir_attachment_payroll_custom.py | 7 +- hr_payroll_document/models/res_users.py | 20 +++ hr_payroll_document/readme/CONTRIBUTORS.md | 5 +- hr_payroll_document/readme/DESCRIPTION.md | 3 +- .../static/description/index.html | 44 ++++--- hr_payroll_document/tests/common.py | 51 -------- .../tests/test_hr_payroll_document.py | 108 ++++++++-------- .../views/hr_employee_views.xml | 107 ++++++++++++++++ .../wizard/payroll_management_wizard.py | 43 +++---- .../wizard/payroll_management_wizard.xml | 3 +- 17 files changed, 364 insertions(+), 242 deletions(-) create mode 100644 hr_payroll_document/models/res_users.py delete mode 100644 hr_payroll_document/tests/common.py create mode 100644 hr_payroll_document/views/hr_employee_views.xml diff --git a/hr_payroll_document/README.rst b/hr_payroll_document/README.rst index f72573f0c..c707f4f5e 100644 --- a/hr_payroll_document/README.rst +++ b/hr_payroll_document/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + ===================== HR - Payroll Document ===================== @@ -7,13 +11,13 @@ HR - Payroll Document !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:3698f5f5e529d5d32ae80cdc1ab30660ad4e5d39b6d98f8dace97a0b233743c5 + !! source digest: sha256:8541f32cab0e71108ff8c422d602825bb599e0141fe69b9342c16742bee0b915 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |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 +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fpayroll-lightgray.png?logo=github @@ -57,8 +61,10 @@ Authors Contributors ------------ -- Antoni Marroig Campomar -- Miquel Alzanillas Monserrat +- `APSL-Nagarro `__: + + - Antoni Marroig + - Miquel Alzanillas Maintainers ----------- diff --git a/hr_payroll_document/__manifest__.py b/hr_payroll_document/__manifest__.py index 62648d123..10be31f89 100644 --- a/hr_payroll_document/__manifest__.py +++ b/hr_payroll_document/__manifest__.py @@ -5,7 +5,7 @@ "website": "https://github.com/OCA/payroll", "license": "AGPL-3", "category": "Payrolls", - "version": "16.0.1.0.0", + "version": "17.0.1.0.0", "depends": ["hr", "base_vat"], "maintainers": ["peluko00"], "external_dependencies": {"python": ["pypdf"]}, @@ -13,5 +13,6 @@ "wizard/payroll_management_wizard.xml", "security/ir.model.access.csv", "data/email_payroll_employee.xml", + "views/hr_employee_views.xml", ], } diff --git a/hr_payroll_document/i18n/es.po b/hr_payroll_document/i18n/es.po index 9a0ac3761..7820196c4 100644 --- a/hr_payroll_document/i18n/es.po +++ b/hr_payroll_document/i18n/es.po @@ -4,13 +4,12 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 16.0\n" +"Project-Id-Version: Odoo Server 17.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-14 10:28+0000\n" -"PO-Revision-Date: 2023-12-14 10:28+0000\n" +"POT-Creation-Date: 2024-05-21 15:13+0000\n" +"PO-Revision-Date: 2024-05-21 15:13+0000\n" "Last-Translator: \n" "Language-Team: \n" -"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" @@ -23,34 +22,7 @@ msgid "" " \n" " \n" " \n" -"
\"{{object.company_id.name}}\"

Payroll

Hello ,

We send you the payroll with the subject .



\"{{object.company_id.name}}\"

Payroll

Hello ,


We send you the payroll with the subject .



\n" "

\n" " \n" " \n" @@ -60,34 +32,7 @@ msgstr "" " \n" " \n" " \n" -" \n" +"
\"{{object.company_id.name}}\"

Nómina

Hola ,


Te enviamos " -"la nómina del mes de .



\"{{object.company_id.name}}\"

Nómina

Hola ,


Te enviamos la nómina con el asunto .



\n" "

\n" " \n" " \n" @@ -96,8 +41,9 @@ msgstr "" #. module: hr_payroll_document #: model:ir.model,name:hr_payroll_document.model_ir_attachment #: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment__payrol_rel +#: model:ir.model.fields,field_description:hr_payroll_document.field_product_document__payrol_rel msgid "Attachment" -msgstr "Adjunto" +msgstr "Archivo adjunto" #. module: hr_payroll_document #: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__attachment_id @@ -131,9 +77,21 @@ msgstr "Creado el" msgid "Display Name" msgstr "Nombre para mostrar" +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment__document_type +#: model:ir.model.fields,field_description:hr_payroll_document.field_product_document__document_type +msgid "Document Type" +msgstr "Tipo de documento" + +#. module: hr_payroll_document +#: model_terms:ir.ui.view,arch_db:hr_payroll_document.view_payroll_tree +msgid "Download" +msgstr "Descargar" + #. module: hr_payroll_document #: model:ir.model,name:hr_payroll_document.model_hr_employee #: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__employee +#: model_terms:ir.ui.view,arch_db:hr_payroll_document.view_payroll_filter msgid "Employee" msgstr "Empleado" @@ -147,9 +105,15 @@ msgstr "Empleados no encontrados" #. module: hr_payroll_document #: model:ir.model.fields,help:hr_payroll_document.field_payroll_management_wizard__subject -msgid "Enter the title of the payroll whether it is the month, week, day, etc." +msgid "" +"Enter the title of the payroll whether it is the month, week, day, etc." msgstr "Introduzca el título de la nómina ya sea el mes, semana, día , etc.." +#. module: hr_payroll_document +#: model_terms:ir.ui.view,arch_db:hr_payroll_document.view_payroll_filter +msgid "Group By" +msgstr "" + #. module: hr_payroll_document #: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__id #: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__id @@ -166,15 +130,10 @@ msgstr "IDs de los empleados que no se han encontrado: " #. module: hr_payroll_document #: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__identification_id +#: model_terms:ir.ui.view,arch_db:hr_payroll_document.view_payroll_filter msgid "Identification ID" msgstr "Identificación ID" -#. module: hr_payroll_document -#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom____last_update -#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard____last_update -msgid "Last Modified on" -msgstr "Última modificación el" - #. module: hr_payroll_document #: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__write_uid #: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__write_uid @@ -197,6 +156,7 @@ msgstr "Los archivos tienen que ser de tipo pdf" #. module: hr_payroll_document #. odoo-python #: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#: model:ir.model.fields.selection,name:hr_payroll_document.selection__ir_attachment__document_type__payroll #, python-format msgid "Payroll" msgstr "Nómina" @@ -208,6 +168,11 @@ msgstr "Nómina" msgid "Payroll " msgstr "Nómina " +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_hr_employee__payroll_count +msgid "Payroll Count" +msgstr "Recuento de Nóminas" + #. module: hr_payroll_document #: model:mail.template,name:hr_payroll_document.payroll_employee_email_template msgid "Payroll Employee" @@ -226,10 +191,16 @@ msgstr "Adjunto Nómina" #. module: hr_payroll_document #: model:mail.template,subject:hr_payroll_document.payroll_employee_email_template msgid "Payroll {{ctx.get('subject')}}" -msgstr "Nómina {{ctx.get('month')}}" +msgstr "Nómina {{ctx.get('subject')}}" #. module: hr_payroll_document +#: model:ir.actions.act_window,name:hr_payroll_document.payrolls_view_action #: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__payrolls +#: model:ir.ui.menu,name:hr_payroll_document.payrolls_menu_action +#: model_terms:ir.ui.view,arch_db:hr_payroll_document.hr_employee_view_tree_payroll +#: model_terms:ir.ui.view,arch_db:hr_payroll_document.res_users_view_form_profile_inherit +#: model_terms:ir.ui.view,arch_db:hr_payroll_document.view_payroll_filter +#: model_terms:ir.ui.view,arch_db:hr_payroll_document.view_payroll_tree msgid "Payrolls" msgstr "Nóminas" @@ -263,6 +234,7 @@ msgstr "Enviar" #. module: hr_payroll_document #: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__subject #: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__subject +#: model_terms:ir.ui.view,arch_db:hr_payroll_document.view_payroll_filter msgid "Subject" msgstr "Asunto" @@ -273,6 +245,11 @@ msgstr "Asunto" msgid "The field identification ID is not valid" msgstr "El campo identificativo ID no es válido" +#. module: hr_payroll_document +#: model:ir.model,name:hr_payroll_document.model_res_users +msgid "User" +msgstr "Usuario" + #. module: hr_payroll_document #. odoo-python #: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 diff --git a/hr_payroll_document/i18n/hr_payroll_document.pot b/hr_payroll_document/i18n/hr_payroll_document.pot index 263745009..55d6055a2 100644 --- a/hr_payroll_document/i18n/hr_payroll_document.pot +++ b/hr_payroll_document/i18n/hr_payroll_document.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 16.0\n" +"Project-Id-Version: Odoo Server 17.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -30,6 +30,7 @@ msgstr "" #. module: hr_payroll_document #: model:ir.model,name:hr_payroll_document.model_ir_attachment #: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment__payrol_rel +#: model:ir.model.fields,field_description:hr_payroll_document.field_product_document__payrol_rel msgid "Attachment" msgstr "" @@ -65,9 +66,21 @@ msgstr "" msgid "Display Name" msgstr "" +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment__document_type +#: model:ir.model.fields,field_description:hr_payroll_document.field_product_document__document_type +msgid "Document Type" +msgstr "" + +#. module: hr_payroll_document +#: model_terms:ir.ui.view,arch_db:hr_payroll_document.view_payroll_tree +msgid "Download" +msgstr "" + #. module: hr_payroll_document #: model:ir.model,name:hr_payroll_document.model_hr_employee #: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__employee +#: model_terms:ir.ui.view,arch_db:hr_payroll_document.view_payroll_filter msgid "Employee" msgstr "" @@ -85,6 +98,11 @@ msgid "" "Enter the title of the payroll whether it is the month, week, day, etc." msgstr "" +#. module: hr_payroll_document +#: model_terms:ir.ui.view,arch_db:hr_payroll_document.view_payroll_filter +msgid "Group By" +msgstr "" + #. module: hr_payroll_document #: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__id #: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__id @@ -101,15 +119,10 @@ msgstr "" #. module: hr_payroll_document #: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__identification_id +#: model_terms:ir.ui.view,arch_db:hr_payroll_document.view_payroll_filter msgid "Identification ID" msgstr "" -#. module: hr_payroll_document -#: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom____last_update -#: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard____last_update -msgid "Last Modified on" -msgstr "" - #. module: hr_payroll_document #: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__write_uid #: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__write_uid @@ -132,6 +145,7 @@ msgstr "" #. module: hr_payroll_document #. odoo-python #: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 +#: model:ir.model.fields.selection,name:hr_payroll_document.selection__ir_attachment__document_type__payroll #, python-format msgid "Payroll" msgstr "" @@ -143,6 +157,11 @@ msgstr "" msgid "Payroll " msgstr "" +#. module: hr_payroll_document +#: model:ir.model.fields,field_description:hr_payroll_document.field_hr_employee__payroll_count +msgid "Payroll Count" +msgstr "" + #. module: hr_payroll_document #: model:mail.template,name:hr_payroll_document.payroll_employee_email_template msgid "Payroll Employee" @@ -164,7 +183,12 @@ msgid "Payroll {{ctx.get('subject')}}" msgstr "" #. module: hr_payroll_document +#: model:ir.actions.act_window,name:hr_payroll_document.payrolls_view_action #: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__payrolls +#: model:ir.ui.menu,name:hr_payroll_document.payrolls_menu_action +#: model_terms:ir.ui.view,arch_db:hr_payroll_document.hr_employee_view_tree_payroll +#: model_terms:ir.ui.view,arch_db:hr_payroll_document.res_users_view_form_profile_inherit +#: model_terms:ir.ui.view,arch_db:hr_payroll_document.view_payroll_filter msgid "Payrolls" msgstr "" @@ -177,10 +201,6 @@ msgstr "" #. module: hr_payroll_document #. odoo-python #: code:addons/hr_payroll_document/tests/test_hr_payroll_document.py:0 -#: code:addons/hr_payroll_document/tests/test_hr_payroll_document.py:0 -#: code:addons/hr_payroll_document/tests/test_hr_payroll_document.py:0 -#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 -#: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 #: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 #, python-format msgid "Payrolls sent" @@ -202,6 +222,7 @@ msgstr "" #. module: hr_payroll_document #: model:ir.model.fields,field_description:hr_payroll_document.field_ir_attachment_payroll_custom__subject #: model:ir.model.fields,field_description:hr_payroll_document.field_payroll_management_wizard__subject +#: model_terms:ir.ui.view,arch_db:hr_payroll_document.view_payroll_filter msgid "Subject" msgstr "" @@ -212,6 +233,11 @@ msgstr "" msgid "The field identification ID is not valid" msgstr "" +#. module: hr_payroll_document +#: model:ir.model,name:hr_payroll_document.model_res_users +msgid "User" +msgstr "" + #. module: hr_payroll_document #. odoo-python #: code:addons/hr_payroll_document/wizard/payroll_management_wizard.py:0 diff --git a/hr_payroll_document/models/__init__.py b/hr_payroll_document/models/__init__.py index 9fa86bfb9..b4048b8c9 100644 --- a/hr_payroll_document/models/__init__.py +++ b/hr_payroll_document/models/__init__.py @@ -1,3 +1,4 @@ from . import ir_attachment_payroll_custom from . import ir_attachment from . import hr_employee +from . import res_users diff --git a/hr_payroll_document/models/hr_employee.py b/hr_payroll_document/models/hr_employee.py index 8d9e38892..74c9cdc67 100644 --- a/hr_payroll_document/models/hr_employee.py +++ b/hr_payroll_document/models/hr_employee.py @@ -1,10 +1,40 @@ -from odoo import _, models +from odoo import _, fields, models from odoo.exceptions import ValidationError class Employee(models.Model): _inherit = "hr.employee" + payroll_count = fields.Integer( + compute="_compute_payroll_count", + ) + + def _compute_payroll_count(self): + self.payroll_count = len( + self.env["ir.attachment"].search( + [ + ("document_type", "=", "payroll"), + ("res_model", "=", self._name), + ("res_id", "in", self.ids), + ] + ) + ) + + def action_get_payroll_tree_view(self): + action = self.env.ref("base.action_attachment").sudo().read()[0] + action["context"] = { + "default_res_model": self._name, + "default_res_id": self.ids[0], + } + action["domain"] = str( + [ + ("document_type", "=", "payroll"), + ("res_model", "=", self._name), + ("res_id", "in", self.ids), + ] + ) + return action + def write(self, vals): res = super().write(vals) if "identification_id" in vals and not self.env["res.partner"].simple_vat_check( diff --git a/hr_payroll_document/models/ir_attachment.py b/hr_payroll_document/models/ir_attachment.py index c5bac7524..d51736772 100644 --- a/hr_payroll_document/models/ir_attachment.py +++ b/hr_payroll_document/models/ir_attachment.py @@ -10,5 +10,5 @@ class Attachment(models.Model): "attachment_id3", "document_id", string="Attachment", - invisible=1, ) + document_type = fields.Selection([("payroll", "Payroll")]) diff --git a/hr_payroll_document/models/ir_attachment_payroll_custom.py b/hr_payroll_document/models/ir_attachment_payroll_custom.py index 96c200043..1a75d7b37 100644 --- a/hr_payroll_document/models/ir_attachment_payroll_custom.py +++ b/hr_payroll_document/models/ir_attachment_payroll_custom.py @@ -9,10 +9,15 @@ class IRAttachmentPayrollCustom(models.Model): comodel_name="ir.attachment", string="Attachment File", prefetch=False, - invisible=True, ondelete="cascade", ) employee = fields.Char() identification_id = fields.Char("Identification ID") create_date = fields.Date(default=fields.Date.context_today) subject = fields.Char() + + def download(self): + return { + "type": "ir.actions.act_url", + "url": "web/content/" + str(self.attachment_id.id) + "/?download=True", + } diff --git a/hr_payroll_document/models/res_users.py b/hr_payroll_document/models/res_users.py new file mode 100644 index 000000000..f85626c47 --- /dev/null +++ b/hr_payroll_document/models/res_users.py @@ -0,0 +1,20 @@ +from odoo import models + + +class ResUsers(models.Model): + _inherit = "res.users" + + def action_get_attachment_tree_view(self): + action = self.env.ref("base.action_attachment").sudo().read()[0] + action["context"] = { + "default_res_model": self._name, + "default_res_id": self.employee_id.id, + } + action["domain"] = str( + [ + ("document_type", "=", "payroll"), + ("res_model", "=", self.employee_id._name), + ("res_id", "in", [self.employee_id.id]), + ] + ) + return action diff --git a/hr_payroll_document/readme/CONTRIBUTORS.md b/hr_payroll_document/readme/CONTRIBUTORS.md index 619e6b256..4098d2040 100644 --- a/hr_payroll_document/readme/CONTRIBUTORS.md +++ b/hr_payroll_document/readme/CONTRIBUTORS.md @@ -1,2 +1,3 @@ -- Antoni Marroig Campomar \<\> -- Miquel Alzanillas Monserrat \<\> +- [APSL-Nagarro](https://www.apsl.tech): + - Antoni Marroig \<\> + - Miquel Alzanillas \<\> diff --git a/hr_payroll_document/readme/DESCRIPTION.md b/hr_payroll_document/readme/DESCRIPTION.md index fb12e7d44..a4011cb52 100644 --- a/hr_payroll_document/readme/DESCRIPTION.md +++ b/hr_payroll_document/readme/DESCRIPTION.md @@ -1,2 +1 @@ -This module have a wizard view to manage the different payrolls of -employees which is identified by the identification_id attribute. +This module have a wizard view to manage the different payrolls of employees which is identified by the identification_id attribute. diff --git a/hr_payroll_document/static/description/index.html b/hr_payroll_document/static/description/index.html index 42b68336a..0e20318d9 100644 --- a/hr_payroll_document/static/description/index.html +++ b/hr_payroll_document/static/description/index.html @@ -3,15 +3,16 @@ -HR - Payroll Document +README.rst -
-

HR - Payroll Document

+
+ + +Odoo Community Association + +
+

HR - Payroll Document

-

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

+

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

This module have a wizard view to manage the different payrolls of employees which is identified by the identification_id attribute.

Table of contents

@@ -384,7 +390,7 @@

HR - Payroll Document

-

Bug Tracker

+

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 @@ -392,24 +398,29 @@

Bug Tracker

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

-

Credits

+

Credits

-

Authors

+

Authors

  • APSL
-

Contributors

+

Contributors

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

-Odoo Community Association + +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.

@@ -420,5 +431,6 @@

Maintainers

+
diff --git a/hr_payroll_document/tests/common.py b/hr_payroll_document/tests/common.py deleted file mode 100644 index f9cab755b..000000000 --- a/hr_payroll_document/tests/common.py +++ /dev/null @@ -1,51 +0,0 @@ -# Part of Odoo. See LICENSE file for full copyright and licensing details. -import base64 - -from odoo.modules.module import get_module_resource -from odoo.tests import common - -from odoo.addons.mail.tests.common import mail_new_test_user - - -class TestHrPayrollDocument(common.TransactionCase): - def setUp(self): - super().setUp() - self.env.user.tz = "Europe/Brussels" - self.user_admin = self.env.ref("base.user_admin") - - # Fix Company without country - self.env.company.country_id = False - - # Test users to use through the various tests - self.user_employee = mail_new_test_user( - self.env, login="david", groups="base.group_user" - ) - self.user_employee_id = self.user_employee.id - - # Hr Data - self.employee_emp = self.env["hr.employee"].create( - { - "name": "David Employee", - "user_id": self.user_employee_id, - "company_id": 1, - "identification_id": "30831011V", - } - ) - - with open( - get_module_resource("hr_payroll_document", "tests", "test.pdf"), "rb" - ) as pdf_file: - encoded_string = base64.b64encode(pdf_file.read()) - ir_values = { - "name": "test", - "type": "binary", - "datas": encoded_string, - "store_fname": encoded_string, - "res_model": "payroll.management.wizard", - "res_id": 1, - } - self.attachment = self.env["ir.attachment"].create(ir_values) - self.subject = "January" - self.wizard = self.env["payroll.management.wizard"].create( - {"payrolls": [self.attachment.id], "subject": self.subject} - ) diff --git a/hr_payroll_document/tests/test_hr_payroll_document.py b/hr_payroll_document/tests/test_hr_payroll_document.py index 1259a74a4..0d92c00dc 100644 --- a/hr_payroll_document/tests/test_hr_payroll_document.py +++ b/hr_payroll_document/tests/test_hr_payroll_document.py @@ -2,14 +2,53 @@ from odoo import _ from odoo.exceptions import UserError, ValidationError -from odoo.modules.module import get_module_resource +from odoo.tests import common +from odoo.tools.misc import file_path -from odoo.addons.hr_payroll_document.tests.common import TestHrPayrollDocument +from odoo.addons.mail.tests.common import mail_new_test_user -class TestHRPayrollDocument(TestHrPayrollDocument): - def setUp(self, *args, **kwargs): - super().setUp(*args, **kwargs) +class TestHRPayrollDocument(common.TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env.user.tz = "Europe/Brussels" + cls.user_admin = cls.env.ref("base.user_admin") + + # Fix Company without country + cls.env.company.country_id = False + + # Test users to use through the various tests + cls.user_employee = mail_new_test_user( + cls.env, login="david", groups="base.group_user" + ) + cls.user_employee_id = cls.user_employee.id + + # Hr Data + cls.employee_emp = cls.env["hr.employee"].create( + { + "name": "David Employee", + "user_id": cls.user_employee_id, + "company_id": 1, + "identification_id": "30831011V", + } + ) + + with open(file_path("hr_payroll_document/tests/test.pdf"), "rb") as pdf_file: + encoded_string = base64.b64encode(pdf_file.read()) + ir_values = { + "name": "test", + "type": "binary", + "datas": encoded_string, + "store_fname": encoded_string, + "res_model": "payroll.management.wizard", + "res_id": 1, + } + cls.attachment = cls.env["ir.attachment"].create(ir_values) + cls.subject = "January" + cls.wizard = cls.env["payroll.management.wizard"].create( + {"payrolls": [cls.attachment.id], "subject": cls.subject} + ) def fill_company_id(self): self.env.company.country_id = self.env["res.country"].search( @@ -17,9 +56,7 @@ def fill_company_id(self): ) def test_extension_error(self): - with open( - get_module_resource("hr_payroll_document", "tests", "test.docx"), "rb" - ) as pdf_file: + with open(file_path("hr_payroll_document/tests/test.docx"), "rb") as pdf_file: encoded_string = base64.b64encode(pdf_file.read()) ir_values = { "name": "test", @@ -53,55 +90,20 @@ def test_one_employee_not_found(self): self.fill_company_id() self.env["hr.employee"].search([("id", "=", 1)]).identification_id = "37936636E" self.assertEqual( - self.wizard.send_payrolls(), - { - "type": "ir.actions.client", - "tag": "display_notification", - "params": { - "title": _("Employees not found"), - "message": _("IDs whose employee has not been found: ") - + "51000278D", - "sticky": True, - "type": "warning", - "next": { - "name": _("Payrolls sent"), - "type": "ir.actions.act_window", - "res_model": "hr.employee", - "views": [ - ( - self.env.ref("hr.hr_employee_public_view_kanban").id, - "list", - ) - ], - }, - }, - }, + self.wizard.send_payrolls()["params"]["title"], _("Employees not found") + ) + self.assertEqual( + self.wizard.send_payrolls()["params"]["message"], + _("IDs whose employee has not been found: ") + "51000278D", ) def test_send_payrolls_correctly(self): self.fill_company_id() self.env["hr.employee"].search([("id", "=", 1)]).identification_id = "51000278D" self.assertEqual( - self.wizard.send_payrolls(), - { - "type": "ir.actions.client", - "tag": "display_notification", - "params": { - "title": _("Payrolls sent"), - "message": _("Payrolls sent to employees correctly"), - "sticky": False, - "type": "success", - "next": { - "name": _("Payrolls sent"), - "type": "ir.actions.act_window", - "res_model": "hr.employee", - "views": [ - ( - self.env.ref("hr.hr_employee_public_view_kanban").id, - "list", - ) - ], - }, - }, - }, + self.wizard.send_payrolls()["params"]["title"], _("Payrolls sent") + ) + self.assertEqual( + self.wizard.send_payrolls()["params"]["message"], + _("Payrolls sent to employees correctly"), ) diff --git a/hr_payroll_document/views/hr_employee_views.xml b/hr_payroll_document/views/hr_employee_views.xml new file mode 100644 index 000000000..e0f568b41 --- /dev/null +++ b/hr_payroll_document/views/hr_employee_views.xml @@ -0,0 +1,107 @@ + + + + payroll.view.tree + ir.attachment.payroll.custom + + + + + + + + + + + + + + hr.res_user.view.form.inherit.document + res.users + + +
+ +
+
+
+
diff --git a/hr_payroll_document/wizard/payroll_management_wizard.py b/hr_payroll_document/wizard/payroll_management_wizard.py index fcb7fd8ed..585584fa5 100644 --- a/hr_payroll_document/wizard/payroll_management_wizard.py +++ b/hr_payroll_document/wizard/payroll_management_wizard.py @@ -12,14 +12,11 @@ class PayrollManagamentWizard(models.TransientModel): _description = "Payroll Management" subject = fields.Char( - help="Enter the title of the payroll whether it is the month, week, day, etc." + help="Enter the title of the payroll whether it is the month, week, day, etc.", + required=True, ) payrolls = fields.Many2many( - "ir.attachment", - "payrol_rel", - "doc_id", - "attach_id3", - copy=False, + "ir.attachment", "payrol_rel", "doc_id", "attach_id3", copy=False, required=True ) def send_payrolls(self): @@ -43,7 +40,6 @@ def send_payrolls(self): employees.add(employee) else: not_found.add(value) - break for employee in list(employees): pdfWriter = PdfWriter() @@ -54,9 +50,8 @@ def send_payrolls(self): path = "/tmp/" + _("Payroll ") + employee.name + ".pdf" - """ - Encrypt the payroll file with the identification identifier of the employee - """ + # Encrypt the payroll file with the identification identifier + # of the employee pdfWriter.encrypt(employee.identification_id, algorithm="AES-256") f = open(path, "wb") @@ -66,6 +61,12 @@ def send_payrolls(self): # Send payroll to the employee self.send_mail(employee, path) + action = self.env["ir.actions.actions"]._for_xml_id( + "hr_payroll_document.payrolls_view_action" + ) + action["views"] = [ + [self.env.ref("hr_payroll_document.view_payroll_tree").id, "list"] + ] if not_found: return { "type": "ir.actions.client", @@ -76,17 +77,7 @@ def send_payrolls(self): + ", ".join(list(not_found)), "sticky": True, "type": "warning", - "next": { - "name": _("Payrolls sent"), - "type": "ir.actions.act_window", - "res_model": "hr.employee", - "views": [ - ( - self.env.ref("hr.hr_employee_public_view_kanban").id, - "list", - ) - ], - }, + "next": action, }, } @@ -98,14 +89,7 @@ def send_payrolls(self): "message": _("Payrolls sent to employees correctly"), "sticky": False, "type": "success", - "next": { - "name": _("Payrolls sent"), - "type": "ir.actions.act_window", - "res_model": "hr.employee", - "views": [ - (self.env.ref("hr.hr_employee_public_view_kanban").id, "list") - ], - }, + "next": action, }, } @@ -143,6 +127,7 @@ def send_mail(self, employee, path): "store_fname": encoded_string, "res_model": "hr.employee", "res_id": employee.id, + "document_type": "payroll", } # Save payroll attachment to all employee payrolls attachments diff --git a/hr_payroll_document/wizard/payroll_management_wizard.xml b/hr_payroll_document/wizard/payroll_management_wizard.xml index 7a21b7bf5..6a42e3839 100644 --- a/hr_payroll_document/wizard/payroll_management_wizard.xml +++ b/hr_payroll_document/wizard/payroll_management_wizard.xml @@ -7,7 +7,7 @@
- +