diff --git a/hr_timesheet_work_entry/__init__.py b/hr_timesheet_work_entry/__init__.py new file mode 100644 index 00000000..e58c8b0b --- /dev/null +++ b/hr_timesheet_work_entry/__init__.py @@ -0,0 +1,15 @@ +from . import models + + +def ts_work_type_pre_init_hook(cr): + """ + This module installs a Work Entry Type with code "TS" + If you have undergone a migration (either for this module + or even your own Payslip Work Entry lines with code "TS") + then the uniqueness constraint will prevent this module + from installing. + """ + cr.execute("UPDATE hr_work_entry_type " + "SET code = 'TS-PRE-INSTALL-14' " + "WHERE code = 'TS';" + ) diff --git a/hr_timesheet_work_entry/__manifest__.py b/hr_timesheet_work_entry/__manifest__.py new file mode 100755 index 00000000..fdc54d0f --- /dev/null +++ b/hr_timesheet_work_entry/__manifest__.py @@ -0,0 +1,24 @@ +{ + 'name': 'Timesheet Work Entry Type', + 'description': 'Set work types on timesheet records.', + 'version': '17.0.1.0.0', + 'website': 'https://hibou.io/', + 'author': 'Hibou Corp.', + 'license': 'AGPL-3', + 'category': 'Human Resources', + 'depends': [ + 'project', + 'hr_timesheet', + 'hr_work_entry', + ], + 'data': [ + 'security/ir.model.access.csv', + 'data/hr_timesheet_work_entry_data.xml', + 'views/timesheet_views.xml', + 'views/work_entry_views.xml', + ], + 'demo': [ + 'data/hr_timesheet_work_entry_demo.xml', + ], + 'pre_init_hook': 'ts_work_type_pre_init_hook', +} diff --git a/hr_timesheet_work_entry/data/hr_timesheet_work_entry_data.xml b/hr_timesheet_work_entry/data/hr_timesheet_work_entry_data.xml new file mode 100644 index 00000000..624bbd34 --- /dev/null +++ b/hr_timesheet_work_entry/data/hr_timesheet_work_entry_data.xml @@ -0,0 +1,10 @@ + + + + + Timesheet + TS + + + + diff --git a/hr_timesheet_work_entry/data/hr_timesheet_work_entry_demo.xml b/hr_timesheet_work_entry/data/hr_timesheet_work_entry_demo.xml new file mode 100644 index 00000000..f7ed0c85 --- /dev/null +++ b/hr_timesheet_work_entry/data/hr_timesheet_work_entry_demo.xml @@ -0,0 +1,10 @@ + + + + + Internal + TS_INTERNAL + + + + diff --git a/hr_timesheet_work_entry/i18n/es.po b/hr_timesheet_work_entry/i18n/es.po new file mode 100644 index 00000000..5db8ac4a --- /dev/null +++ b/hr_timesheet_work_entry/i18n/es.po @@ -0,0 +1,51 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_timesheet_work_entry +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-10-12 01:31+0000\n" +"PO-Revision-Date: 2021-10-12 01:31+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: hr_timesheet_work_entry +#: model:ir.model.fields,field_description:hr_timesheet_work_entry.field_hr_work_entry_type__allow_timesheet +msgid "Allow on Timesheet" +msgstr "Permitir en Ficha de Horario" + +#. module: hr_timesheet_work_entry +#: model:ir.model,name:hr_timesheet_work_entry.model_account_analytic_line +msgid "Analytic Line" +msgstr "Línea Analítica" + +#. module: hr_timesheet_work_entry +#: model:ir.model,name:hr_timesheet_work_entry.model_hr_work_entry_type +msgid "HR Work Entry Type" +msgstr "Tipo de entrada de trabajo de RRHH" + +#. module: hr_timesheet_work_entry +#: model:hr.work.entry.type,name:hr_timesheet_work_entry.work_input_timesheet +msgid "Timesheet" +msgstr "Ficha de Horario" + +#. module: hr_timesheet_work_entry +#: model_terms:ir.ui.view,arch_db:hr_timesheet_work_entry.hr_work_entry_type_view_form_inherit +msgid "Timesheets" +msgstr "Fichas de Horario" + +#. module: hr_timesheet_work_entry +#: model:ir.ui.menu,name:hr_timesheet_work_entry.hr_work_entry_type_menu +msgid "Work Entry Types" +msgstr "Tipos de Entradas de Trabajo" + +#. module: hr_timesheet_work_entry +#: model:ir.model.fields,field_description:hr_timesheet_work_entry.field_account_analytic_line__work_type_id +msgid "Work Type" +msgstr "Tipo de Trabajo" diff --git a/hr_timesheet_work_entry/models/__init__.py b/hr_timesheet_work_entry/models/__init__.py new file mode 100644 index 00000000..1ea5c2f4 --- /dev/null +++ b/hr_timesheet_work_entry/models/__init__.py @@ -0,0 +1,2 @@ +from . import timesheet +from . import work_entry diff --git a/hr_timesheet_work_entry/models/timesheet.py b/hr_timesheet_work_entry/models/timesheet.py new file mode 100644 index 00000000..f7f3bb9d --- /dev/null +++ b/hr_timesheet_work_entry/models/timesheet.py @@ -0,0 +1,9 @@ +from odoo import api, fields, models + + +class AccountAnalyticLine(models.Model): + _inherit = 'account.analytic.line' + + work_type_id = fields.Many2one('hr.work.entry.type', string='Work Type', + default=lambda self: self.env.ref('hr_timesheet_work_entry.work_input_timesheet', + raise_if_not_found=False)) diff --git a/hr_timesheet_work_entry/models/work_entry.py b/hr_timesheet_work_entry/models/work_entry.py new file mode 100644 index 00000000..eb68353c --- /dev/null +++ b/hr_timesheet_work_entry/models/work_entry.py @@ -0,0 +1,7 @@ +from odoo import fields, models + + +class HrWorkEntryType(models.Model): + _inherit = 'hr.work.entry.type' + + allow_timesheet = fields.Boolean(string='Allow on Timesheet') diff --git a/hr_timesheet_work_entry/security/ir.model.access.csv b/hr_timesheet_work_entry/security/ir.model.access.csv new file mode 100644 index 00000000..840437fa --- /dev/null +++ b/hr_timesheet_work_entry/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_hr_work_entry_type_employee,access_hr_work_entry_type_employee,model_hr_work_entry_type,base.group_user,1,0,0,0 diff --git a/hr_timesheet_work_entry/tests/__init__.py b/hr_timesheet_work_entry/tests/__init__.py new file mode 100644 index 00000000..962f2f44 --- /dev/null +++ b/hr_timesheet_work_entry/tests/__init__.py @@ -0,0 +1 @@ +from . import test_timesheet_work_type diff --git a/hr_timesheet_work_entry/tests/test_timesheet_work_type.py b/hr_timesheet_work_entry/tests/test_timesheet_work_type.py new file mode 100644 index 00000000..f104e3c7 --- /dev/null +++ b/hr_timesheet_work_entry/tests/test_timesheet_work_type.py @@ -0,0 +1,19 @@ +from odoo.tests import common + + +class TestTimesheetWorkType(common.TransactionCase): + def setUp(self): + super().setUp() + self.employee = self.env.ref('hr.employee_hne') + self.project = self.env.ref('project.project_project_2') + self.default_work_type = self.env.ref('hr_timesheet_work_entry.work_input_timesheet') + + def test_01_work_type(self): + timesheet = self.env['account.analytic.line'].create({ + 'name': '/', + 'employee_id': self.employee.id, + 'unit_amount': 1.0, + 'project_id': self.project.id, + }) + self.assertTrue(timesheet.work_type_id) + self.assertEqual(timesheet.work_type_id, self.default_work_type) diff --git a/hr_timesheet_work_entry/views/timesheet_views.xml b/hr_timesheet_work_entry/views/timesheet_views.xml new file mode 100644 index 00000000..9ac5d44f --- /dev/null +++ b/hr_timesheet_work_entry/views/timesheet_views.xml @@ -0,0 +1,48 @@ + + + + + account.analytic.line.tree.hr_timesheet.inherit + account.analytic.line + + + + + + + + + + account.analytic.line.form.inherit + account.analytic.line + + + + + + + + + + project.task.form.inherit + project.task + + + + + + + + + + + + diff --git a/hr_timesheet_work_entry/views/work_entry_views.xml b/hr_timesheet_work_entry/views/work_entry_views.xml new file mode 100644 index 00000000..84f76a7a --- /dev/null +++ b/hr_timesheet_work_entry/views/work_entry_views.xml @@ -0,0 +1,23 @@ + + + + + hr.work.type.view.form.inherit + hr.work.entry.type + + + + + + + + + + + + + \ No newline at end of file