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