From 27876a159e9006e29fae0f0bde4383e8e5482b00 Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Thu, 6 Feb 2020 12:32:30 -0800 Subject: [PATCH 01/10] [ADD] hr_timesheet_sheet_activity: automatic activities --- hr_timesheet_sheet_activity/README.rst | 78 ++++ hr_timesheet_sheet_activity/__init__.py | 3 + hr_timesheet_sheet_activity/__manifest__.py | 26 ++ .../data/hr_timesheet_sheet_activity_data.xml | 28 ++ .../i18n/hr_timesheet_sheet_activity.pot | 41 ++ .../models/__init__.py | 3 + .../models/hr_timesheet_sheet.py | 257 +++++++++++ .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 6 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 425 ++++++++++++++++++ hr_timesheet_sheet_activity/tests/__init__.py | 3 + .../tests/test_hr_timesheet_sheet_activity.py | 391 ++++++++++++++++ .../views/mail_activity.xml | 24 + 14 files changed, 1286 insertions(+) create mode 100644 hr_timesheet_sheet_activity/README.rst create mode 100644 hr_timesheet_sheet_activity/__init__.py create mode 100644 hr_timesheet_sheet_activity/__manifest__.py create mode 100644 hr_timesheet_sheet_activity/data/hr_timesheet_sheet_activity_data.xml create mode 100644 hr_timesheet_sheet_activity/i18n/hr_timesheet_sheet_activity.pot create mode 100644 hr_timesheet_sheet_activity/models/__init__.py create mode 100644 hr_timesheet_sheet_activity/models/hr_timesheet_sheet.py create mode 100644 hr_timesheet_sheet_activity/readme/CONTRIBUTORS.rst create mode 100644 hr_timesheet_sheet_activity/readme/DESCRIPTION.rst create mode 100644 hr_timesheet_sheet_activity/static/description/icon.png create mode 100644 hr_timesheet_sheet_activity/static/description/index.html create mode 100644 hr_timesheet_sheet_activity/tests/__init__.py create mode 100644 hr_timesheet_sheet_activity/tests/test_hr_timesheet_sheet_activity.py create mode 100644 hr_timesheet_sheet_activity/views/mail_activity.xml diff --git a/hr_timesheet_sheet_activity/README.rst b/hr_timesheet_sheet_activity/README.rst new file mode 100644 index 0000000000..7d065976c7 --- /dev/null +++ b/hr_timesheet_sheet_activity/README.rst @@ -0,0 +1,78 @@ +============================= +HR Timesheet Sheet Activities +============================= + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Ftimesheet-lightgray.png?logo=github + :target: https://github.com/OCA/timesheet/tree/12.0/hr_timesheet_sheet_activity + :alt: OCA/timesheet +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/timesheet-12-0/timesheet-12-0-hr_timesheet_sheet_activity + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/117/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module adds the following activities related to submission and review of +timesheet sheets: + +* Draft and Submit sheet(s) for review 1 business day prior the end of the period; +* Review sheet(s) within 1 business day after submission day (not earlier than the end of the period); +* Re-submit sheet(s) within 1 business day in case those have been rejected. + +**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 smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Brainbean Apps + +Contributors +~~~~~~~~~~~~ + +* Alexey Pelykh + +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. + +This module is part of the `OCA/timesheet `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/hr_timesheet_sheet_activity/__init__.py b/hr_timesheet_sheet_activity/__init__.py new file mode 100644 index 0000000000..4b76c7b2d5 --- /dev/null +++ b/hr_timesheet_sheet_activity/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from . import models diff --git a/hr_timesheet_sheet_activity/__manifest__.py b/hr_timesheet_sheet_activity/__manifest__.py new file mode 100644 index 0000000000..3b180e2954 --- /dev/null +++ b/hr_timesheet_sheet_activity/__manifest__.py @@ -0,0 +1,26 @@ +# Copyright 2020 Brainbean Apps (https://brainbeanapps.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +{ + 'name': 'HR Timesheet Sheet Activities', + 'version': '12.0.1.0.0', + 'category': 'Human Resources', + 'website': 'https://github.com/OCA/timesheet', + 'author': + 'Brainbean Apps, ' + 'Odoo Community Association (OCA)', + 'license': 'AGPL-3', + 'installable': True, + 'application': False, + 'summary': ( + 'Automatic activities related to submission and review of timesheet' + ' sheets' + ), + 'depends': [ + 'hr_timesheet_sheet', + ], + 'data': [ + 'data/hr_timesheet_sheet_activity_data.xml', + 'views/mail_activity.xml', + ], +} diff --git a/hr_timesheet_sheet_activity/data/hr_timesheet_sheet_activity_data.xml b/hr_timesheet_sheet_activity/data/hr_timesheet_sheet_activity_data.xml new file mode 100644 index 0000000000..b46716e07b --- /dev/null +++ b/hr_timesheet_sheet_activity/data/hr_timesheet_sheet_activity_data.xml @@ -0,0 +1,28 @@ + + + + + + + + Timesheet Sheet Submission + fa-calendar-check-o + + + + + Timesheet Sheet Review + fa-calendar-check-o + + + + + Timesheet Sheet Re-submission + fa-calendar-check-o + + + + diff --git a/hr_timesheet_sheet_activity/i18n/hr_timesheet_sheet_activity.pot b/hr_timesheet_sheet_activity/i18n/hr_timesheet_sheet_activity.pot new file mode 100644 index 0000000000..2341d8328d --- /dev/null +++ b/hr_timesheet_sheet_activity/i18n/hr_timesheet_sheet_activity.pot @@ -0,0 +1,41 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_timesheet_sheet_activity +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: hr_timesheet_sheet_activity +#: model:ir.actions.act_window,name:hr_timesheet_sheet_activity.action_view_hr_timesheet_sheet_mail_activity_types +#: model:ir.ui.menu,name:hr_timesheet_sheet_activity.menu_view_hr_timesheet_sheet_mail_activity_types +msgid "Activity Types" +msgstr "" + +#. module: hr_timesheet_sheet_activity +#: model:ir.model,name:hr_timesheet_sheet_activity.model_hr_timesheet_sheet +msgid "Timesheet Sheet" +msgstr "" + +#. module: hr_timesheet_sheet_activity +#: model:mail.activity.type,name:hr_timesheet_sheet_activity.activity_sheet_resubmission +msgid "Timesheet Sheet Re-submission" +msgstr "" + +#. module: hr_timesheet_sheet_activity +#: model:mail.activity.type,name:hr_timesheet_sheet_activity.activity_sheet_review +msgid "Timesheet Sheet Review" +msgstr "" + +#. module: hr_timesheet_sheet_activity +#: model:mail.activity.type,name:hr_timesheet_sheet_activity.activity_sheet_submission +msgid "Timesheet Sheet Submission" +msgstr "" + diff --git a/hr_timesheet_sheet_activity/models/__init__.py b/hr_timesheet_sheet_activity/models/__init__.py new file mode 100644 index 0000000000..3bc8e53de4 --- /dev/null +++ b/hr_timesheet_sheet_activity/models/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from . import hr_timesheet_sheet diff --git a/hr_timesheet_sheet_activity/models/hr_timesheet_sheet.py b/hr_timesheet_sheet_activity/models/hr_timesheet_sheet.py new file mode 100644 index 0000000000..fab78369e9 --- /dev/null +++ b/hr_timesheet_sheet_activity/models/hr_timesheet_sheet.py @@ -0,0 +1,257 @@ +# Copyright 2020 Brainbean Apps (https://brainbeanapps.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from datetime import datetime, time +from dateutil.relativedelta import relativedelta +from dateutil.rrule import MONTHLY, WEEKLY +from pytz import timezone, UTC + +from odoo import api, fields, models + + +class HrTimesheetSheet(models.Model): + _inherit = 'hr_timesheet.sheet' + + def _get_subscribers(self): + """ Reviewers are going to be notified using activities """ + res = super()._get_subscribers() + res = res - self._get_possible_reviewers().mapped('partner_id') + return res + + @api.multi + def write(self, vals): + res = super().write(vals) + + for sheet in self.filtered(lambda sheet: sheet.state == 'draft'): + # NOTE: user_id is written manually instead of using new_user_id + # in order to update only activities with different user_id + activities = sheet.activity_reschedule( + ['hr_timesheet_sheet_activity.activity_sheet_resubmission'], + ) + for activity in activities: + if activity.user_id == sheet.user_id: + continue + if activity.user_id != self.env.user: + # NOTE: Only assigned user can update the activity + activity = activity.sudo() + activity.write({ + 'user_id': sheet.user_id.id, + }) + if activities: + continue + + deadline = sheet._activity_sheet_submission_deadline() + + # NOTE: Instead of updating activities using activity_reschedule, + # manually update only needed fields + activities = sheet.activity_reschedule( + ['hr_timesheet_sheet_activity.activity_sheet_submission'], + ) + for activity in activities: + values = {} + if activity.user_id != sheet.user_id: + values.update({ + 'user_id': sheet.user_id.id, + }) + if activity.date_deadline != deadline: + values.update({ + # NOTE: user_id is set to trigger a notification + 'user_id': sheet.user_id.id, + 'date_deadline': deadline, + }) + if not values: + continue + + if activity.user_id != self.env.user: + # NOTE: Only assigned user can update the activity + activity = activity.sudo() + + # NOTE: to get consistent results, disable automatic notice + # and send one manually + activity.with_context( + mail_activity_quick_update=True, + ).write(values) + activity.action_notify() + if activities: + continue + + sheet.activity_schedule( + 'hr_timesheet_sheet_activity.activity_sheet_submission', + date_deadline=deadline, + user_id=sheet.user_id.id, + ) + + return res + + @api.multi + def action_timesheet_draft(self): + for sheet in self: + sheet.activity_schedule( + 'hr_timesheet_sheet_activity.activity_sheet_resubmission', + date_deadline=sheet._activity_sheet_resubmission_deadline(), + user_id=sheet.user_id.id, + ) + + super().action_timesheet_draft() + + @api.multi + def action_timesheet_confirm(self): + super().action_timesheet_confirm() + + # NOTE: activity_reschedule is used instead of activity_feedback + # to accomodate non-assigned-user completion + activities = self.activity_reschedule([ + 'hr_timesheet_sheet_activity.activity_sheet_submission', + 'hr_timesheet_sheet_activity.activity_sheet_resubmission', + ]) + for activity in activities: + if activity.user_id != self.env.user: + # NOTE: Only assigned user can update the activity + activity = activity.sudo() + activity.action_feedback() + + for sheet in self: + for reviewer in sheet._get_possible_reviewers(): + deadline = sheet._activity_sheet_review_deadline( + reviewer + ) + sheet.activity_schedule( + 'hr_timesheet_sheet_activity.activity_sheet_review', + date_deadline=deadline, + user_id=reviewer.id, + ) + + @api.multi + def action_timesheet_done(self): + super().action_timesheet_done() + + # NOTE: activity_reschedule is used instead of activity_feedback + # to accomodate non-assigned-user completion + activities = self.activity_reschedule([ + 'hr_timesheet_sheet_activity.activity_sheet_review', + ]) + for activity in activities: + if activity.user_id != self.env.user: + # NOTE: Only assigned user can update the activity + activity = activity.sudo() + activity.action_feedback() + + @api.multi + def action_timesheet_refuse(self): + for sheet in self: + sheet.activity_schedule( + 'hr_timesheet_sheet_activity.activity_sheet_resubmission', + date_deadline=sheet._activity_sheet_resubmission_deadline(), + user_id=sheet.user_id.id, + ) + + super().action_timesheet_refuse() + + # NOTE: activity_reschedule is used instead of activity_feedback + # to accomodate non-assigned-user completion + activities = self.activity_reschedule([ + 'hr_timesheet_sheet_activity.activity_sheet_review', + ]) + for activity in activities: + if activity.user_id != self.env.user: + # NOTE: Only assigned user can update the activity + activity = activity.sudo() + activity.action_feedback() + + @api.multi + def _activity_sheet_submission_deadline(self): + """ Hook for extensions """ + self.ensure_one() + + employee_timezone = timezone(self.employee_id.tz or 'UTC') + employee_today = self.env.context.get( + 'hr_timesheet_sheet_activity_today', + fields.Datetime.now().replace(tzinfo=UTC).astimezone( + employee_timezone + ).date() + ) + + # Get last workday of employee or last day of period (in user tz) + datetime_start = datetime.combine( + self.date_start, + time.min, + ).replace(tzinfo=employee_timezone) + datetime_end = datetime.combine( + max(self.date_end, employee_today), + time.max + ).replace(tzinfo=employee_timezone) + worktimes = self.employee_id.list_work_time_per_day( + datetime_start, + datetime_end, + ) + worktimes = list(filter( + lambda worktime: worktime[1] > 0, + worktimes + )) + if worktimes: + return worktimes[-1][0] # Last workday of period + return datetime_end.date() + + @api.multi + def _activity_sheet_resubmission_deadline(self): + """ Hook for extensions """ + self.ensure_one() + return None + + @api.multi + def _activity_sheet_review_deadline(self, reviewer): + """ Hook for extensions """ + self.ensure_one() + + employee_timezone = timezone(self.employee_id.tz or 'UTC') + employee_today = self.env.context.get( + 'hr_timesheet_sheet_activity_today', + fields.Datetime.now().replace(tzinfo=UTC).astimezone( + employee_timezone + ).date() + ) + deadline = max( + self.date_end + relativedelta(days=1), + employee_today + ) + + reviewer_employee = self.env['hr.employee'].with_context( + active_test=False, + ).search( + [('user_id', '=', reviewer.id)], + limit=1, + ) + if not reviewer_employee: + return deadline + + worktimes = reviewer_employee.list_work_time_per_day( + datetime.combine( + deadline, + time.min + ).replace(tzinfo=employee_timezone), + datetime.combine( + deadline + self._activity_sheet_review_max_period(), + time.max + ).replace(tzinfo=employee_timezone), + ) + worktimes = list(filter( + lambda worktime: worktime[1] > 0, + worktimes + )) + if worktimes: + return worktimes[0][0] # First workday of period + return datetime.combine(deadline, time.max).replace( + tzinfo=employee_timezone + ).astimezone( + timezone(reviewer_employee.tz or 'UTC') + ).date() + + def _activity_sheet_review_max_period(self): + """ Hook for extensions """ + self.ensure_one() + r = self.company_id.sheet_range or WEEKLY + if r == WEEKLY: + return relativedelta(weeks=1) + elif r == MONTHLY: + return relativedelta(months=1) + return relativedelta(days=1) diff --git a/hr_timesheet_sheet_activity/readme/CONTRIBUTORS.rst b/hr_timesheet_sheet_activity/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..1c6a35a1e3 --- /dev/null +++ b/hr_timesheet_sheet_activity/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Alexey Pelykh diff --git a/hr_timesheet_sheet_activity/readme/DESCRIPTION.rst b/hr_timesheet_sheet_activity/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..3e39e055b8 --- /dev/null +++ b/hr_timesheet_sheet_activity/readme/DESCRIPTION.rst @@ -0,0 +1,6 @@ +This module adds the following activities related to submission and review of +timesheet sheets: + +* Draft and Submit sheet(s) for review 1 business day prior the end of the period; +* Review sheet(s) within 1 business day after submission day (not earlier than the end of the period); +* Re-submit sheet(s) within 1 business day in case those have been rejected. diff --git a/hr_timesheet_sheet_activity/static/description/icon.png b/hr_timesheet_sheet_activity/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/hr_timesheet_sheet_activity/static/description/index.html b/hr_timesheet_sheet_activity/static/description/index.html new file mode 100644 index 0000000000..02acacba3f --- /dev/null +++ b/hr_timesheet_sheet_activity/static/description/index.html @@ -0,0 +1,425 @@ + + + + + + +HR Timesheet Sheet Activities + + + +
+

HR Timesheet Sheet Activities

+ + +

Beta License: AGPL-3 OCA/timesheet Translate me on Weblate Try me on Runbot

+

This module adds the following activities related to submission and review of +timesheet sheets:

+
    +
  • Draft and Submit sheet(s) for review 1 business day prior the end of the period;
  • +
  • Review sheet(s) within 1 business day after submission day (not earlier than the end of the period);
  • +
  • Re-submit sheet(s) within 1 business day in case those have been rejected.
  • +
+

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 smashing it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Brainbean Apps
  • +
+
+ +
+

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.

+

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

+

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

+
+
+
+ + diff --git a/hr_timesheet_sheet_activity/tests/__init__.py b/hr_timesheet_sheet_activity/tests/__init__.py new file mode 100644 index 0000000000..f389d26069 --- /dev/null +++ b/hr_timesheet_sheet_activity/tests/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from . import test_hr_timesheet_sheet_activity diff --git a/hr_timesheet_sheet_activity/tests/test_hr_timesheet_sheet_activity.py b/hr_timesheet_sheet_activity/tests/test_hr_timesheet_sheet_activity.py new file mode 100644 index 0000000000..c09a39e163 --- /dev/null +++ b/hr_timesheet_sheet_activity/tests/test_hr_timesheet_sheet_activity.py @@ -0,0 +1,391 @@ +# Copyright 2020 Brainbean Apps (https://brainbeanapps.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from datetime import date + +from odoo import fields +from odoo.tests import common + + +class TestHrTimesheetSheetActivity(common.TransactionCase): + + def setUp(self): + super().setUp() + + self.IrModel = self.env['ir.model'] + self.ResUsers = self.env['res.users'] + self.Company = self.env['res.company'] + self.Project = self.env['project.project'] + self.HrEmployee = self.env['hr.employee'] + self.HrTimesheetSheet = self.env['hr_timesheet.sheet'] + self.AccountAnalyticLine = self.env['account.analytic.line'] + self.MailActivity = self.env['mail.activity'] + self.company_id = self.Company._company_default_get() + self.now = fields.Datetime.now() + self.group_hr_user = self.env.ref('hr.group_hr_user') + self.group_hr_timesheet_user = self.env.ref( + 'hr_timesheet.group_hr_timesheet_user' + ) + self.group_project_user = self.env.ref('project.group_project_user') + self.hr_timesheet_sheet_modelid = self.IrModel._get( + self.HrTimesheetSheet._name + ).id + self.activity_sheet_submission = self.env.ref( + 'hr_timesheet_sheet_activity.activity_sheet_submission' + ) + self.activity_sheet_resubmission = self.env.ref( + 'hr_timesheet_sheet_activity.activity_sheet_resubmission' + ) + self.activity_sheet_review = self.env.ref( + 'hr_timesheet_sheet_activity.activity_sheet_review' + ) + + def test_activity(self): + user_1 = self.ResUsers.sudo().create({ + 'name': 'User 1', + 'login': 'user_1', + 'email': 'user-1@example.com', + 'company_id': self.company_id.id, + }) + user_2 = self.ResUsers.sudo().create({ + 'name': 'User 2', + 'login': 'user_2', + 'email': 'user-2@example.com', + 'company_id': self.company_id.id, + 'groups_id': [(6, 0, [ + self.group_hr_user.id, + self.group_hr_timesheet_user.id, + self.group_project_user.id, + ])], + }) + employee = self.HrEmployee.create({ + 'name': 'Employee', + 'user_id': user_1.id, + }) + self.HrEmployee.create({ + 'name': 'Officer', + 'user_id': user_2.id, + }) + project = self.Project.create({ + 'name': 'Project', + }) + + self.AccountAnalyticLine.create({ + 'project_id': project.id, + 'employee_id': employee.id, + 'name': 'Time Entry', + }) + + sheet = self.HrTimesheetSheet.sudo(user_1).create({ + 'employee_id': employee.id, + }) + + activities = self.MailActivity.search([ + ('res_model_id', '=', self.hr_timesheet_sheet_modelid), + ('user_id', '=', user_1.id), + ]) + self.assertEqual(len(activities), 1) + self.assertEqual(activities.res_id, sheet.id) + self.assertEqual( + activities.activity_type_id, + self.activity_sheet_submission + ) + + sheet.sudo(user_1).action_timesheet_confirm() + + activities = self.MailActivity.search([ + ('res_model_id', '=', self.hr_timesheet_sheet_modelid), + ('user_id', '=', user_2.id), + ]) + self.assertEqual(len(activities), 1) + self.assertEqual(activities.res_id, sheet.id) + self.assertEqual( + activities.activity_type_id, + self.activity_sheet_review + ) + + sheet.sudo(user_2).action_timesheet_done() + + activities = self.MailActivity.search([ + ('res_model_id', '=', self.hr_timesheet_sheet_modelid), + ]) + self.assertEqual(len(activities), 0) + + sheet.sudo(user_2).action_timesheet_draft() + + activities = self.MailActivity.search([ + ('res_model_id', '=', self.hr_timesheet_sheet_modelid), + ('user_id', '=', user_1.id), + ]) + self.assertEqual(len(activities), 1) + self.assertEqual(activities.res_id, sheet.id) + self.assertEqual( + activities.activity_type_id, + self.activity_sheet_resubmission + ) + + sheet.sudo(user_1).action_timesheet_confirm() + + activities = self.MailActivity.search([ + ('res_model_id', '=', self.hr_timesheet_sheet_modelid), + ('user_id', '=', user_2.id), + ]) + self.assertEqual(len(activities), 1) + self.assertEqual(activities.res_id, sheet.id) + self.assertEqual( + activities.activity_type_id, + self.activity_sheet_review + ) + + sheet.sudo(user_1).action_timesheet_refuse() + + activities = self.MailActivity.search([ + ('res_model_id', '=', self.hr_timesheet_sheet_modelid), + ('user_id', '=', user_1.id), + ]) + self.assertEqual(len(activities), 1) + self.assertEqual(activities.res_id, sheet.id) + self.assertEqual( + activities.activity_type_id, + self.activity_sheet_resubmission + ) + + def test_period_ends_on_workday(self): + user_1 = self.ResUsers.sudo().create({ + 'name': 'User 1', + 'login': 'user_1', + 'email': 'user-1@example.com', + 'company_id': self.company_id.id, + }) + user_2 = self.ResUsers.sudo().create({ + 'name': 'User 2', + 'login': 'user_2', + 'email': 'user-2@example.com', + 'company_id': self.company_id.id, + 'groups_id': [(6, 0, [ + self.group_hr_user.id, + self.group_hr_timesheet_user.id, + self.group_project_user.id, + ])], + }) + employee = self.HrEmployee.create({ + 'name': 'Employee', + 'user_id': user_1.id, + }) + self.HrEmployee.create({ + 'name': 'Officer', + 'user_id': user_2.id, + }) + project = self.Project.create({ + 'name': 'Project', + }) + + self.AccountAnalyticLine.create({ + 'project_id': project.id, + 'employee_id': employee.id, + 'date': date(2020, 2, 7), + 'name': 'Time Entry', + }) + + sheet = self.HrTimesheetSheet.sudo(user_1).with_context({ + 'hr_timesheet_sheet_activity_today': date(2020, 2, 7), + }).create({ + 'employee_id': employee.id, + 'date_start': date(2020, 2, 3), + 'date_end': date(2020, 2, 7), + }) + + activity = self.MailActivity.search([ + ('res_id', '=', sheet.id), + ('activity_type_id', '=', self.activity_sheet_submission.id), + ]) + self.assertEqual(activity.date_deadline, date(2020, 2, 7)) + + sheet.sudo(user_1).action_timesheet_confirm() + + activity = self.MailActivity.search([ + ('res_id', '=', sheet.id), + ('activity_type_id', '=', self.activity_sheet_review.id), + ('user_id', '=', user_2.id), + ]) + self.assertEqual(activity.date_deadline, date(2020, 2, 10)) + + def test_period_ends_on_weekend(self): + user_1 = self.ResUsers.sudo().create({ + 'name': 'User 1', + 'login': 'user_1', + 'email': 'user-1@example.com', + 'company_id': self.company_id.id, + }) + user_2 = self.ResUsers.sudo().create({ + 'name': 'User 2', + 'login': 'user_2', + 'email': 'user-2@example.com', + 'company_id': self.company_id.id, + 'groups_id': [(6, 0, [ + self.group_hr_user.id, + self.group_hr_timesheet_user.id, + self.group_project_user.id, + ])], + }) + employee = self.HrEmployee.create({ + 'name': 'Employee', + 'user_id': user_1.id, + }) + self.HrEmployee.create({ + 'name': 'Officer', + 'user_id': user_2.id, + }) + project = self.Project.create({ + 'name': 'Project', + }) + + self.AccountAnalyticLine.create({ + 'project_id': project.id, + 'employee_id': employee.id, + 'date': date(2020, 2, 7), + 'name': 'Time Entry', + }) + + sheet = self.HrTimesheetSheet.sudo(user_1).with_context({ + 'hr_timesheet_sheet_activity_today': date(2020, 2, 7), + }).create({ + 'employee_id': employee.id, + 'date_start': date(2020, 2, 3), + 'date_end': date(2020, 2, 9), + }) + + activity = self.MailActivity.search([ + ('res_id', '=', sheet.id), + ('activity_type_id', '=', self.activity_sheet_submission.id), + ]) + self.assertEqual(activity.date_deadline, date(2020, 2, 7)) + + sheet.sudo(user_1).action_timesheet_confirm() + + activity = self.MailActivity.search([ + ('res_id', '=', sheet.id), + ('activity_type_id', '=', self.activity_sheet_review.id), + ('user_id', '=', user_2.id), + ]) + self.assertEqual(activity.date_deadline, date(2020, 2, 10)) + + def test_period_overdue(self): + user_1 = self.ResUsers.sudo().create({ + 'name': 'User 1', + 'login': 'user_1', + 'email': 'user-1@example.com', + 'company_id': self.company_id.id, + }) + user_2 = self.ResUsers.sudo().create({ + 'name': 'User 2', + 'login': 'user_2', + 'email': 'user-2@example.com', + 'company_id': self.company_id.id, + 'groups_id': [(6, 0, [ + self.group_hr_user.id, + self.group_hr_timesheet_user.id, + self.group_project_user.id, + ])], + }) + employee = self.HrEmployee.create({ + 'name': 'Employee', + 'user_id': user_1.id, + }) + self.HrEmployee.create({ + 'name': 'Officer', + 'user_id': user_2.id, + }) + project = self.Project.create({ + 'name': 'Project', + }) + + self.AccountAnalyticLine.create({ + 'project_id': project.id, + 'employee_id': employee.id, + 'date': date(2020, 1, 31), + 'name': 'Time Entry', + }) + + sheet = self.HrTimesheetSheet.sudo(user_1).with_context({ + 'hr_timesheet_sheet_activity_today': date(2020, 2, 7), + }).create({ + 'employee_id': employee.id, + 'date_start': date(2020, 1, 27), + 'date_end': date(2020, 2, 2), + }) + + activity = self.MailActivity.search([ + ('res_id', '=', sheet.id), + ('activity_type_id', '=', self.activity_sheet_submission.id), + ]) + self.assertEqual(activity.date_deadline, date(2020, 2, 7)) + + sheet.sudo(user_1).action_timesheet_confirm() + + activity = self.MailActivity.search([ + ('res_id', '=', sheet.id), + ('activity_type_id', '=', self.activity_sheet_review.id), + ('user_id', '=', user_2.id), + ]) + self.assertEqual(activity.date_deadline, date(2020, 2, 7)) + + def test_weekend_period(self): + user_1 = self.ResUsers.sudo().create({ + 'name': 'User 1', + 'login': 'user_1', + 'email': 'user-1@example.com', + 'company_id': self.company_id.id, + }) + user_2 = self.ResUsers.sudo().create({ + 'name': 'User 2', + 'login': 'user_2', + 'email': 'user-2@example.com', + 'company_id': self.company_id.id, + 'groups_id': [(6, 0, [ + self.group_hr_user.id, + self.group_hr_timesheet_user.id, + self.group_project_user.id, + ])], + }) + employee = self.HrEmployee.create({ + 'name': 'Employee', + 'user_id': user_1.id, + }) + self.HrEmployee.create({ + 'name': 'Officer', + 'user_id': user_2.id, + }) + project = self.Project.create({ + 'name': 'Project', + }) + + self.AccountAnalyticLine.create({ + 'project_id': project.id, + 'employee_id': employee.id, + 'date': date(2020, 2, 1), + 'name': 'Time Entry', + }) + + sheet = self.HrTimesheetSheet.sudo(user_1).with_context({ + 'hr_timesheet_sheet_activity_today': date(2020, 2, 1), + }).create({ + 'employee_id': employee.id, + 'date_start': date(2020, 2, 1), + 'date_end': date(2020, 2, 1), + }) + + activity = self.MailActivity.search([ + ('res_id', '=', sheet.id), + ('activity_type_id', '=', self.activity_sheet_submission.id), + ]) + self.assertEqual(activity.date_deadline, date(2020, 2, 1)) + + sheet.sudo(user_1).action_timesheet_confirm() + + activity = self.MailActivity.search([ + ('res_id', '=', sheet.id), + ('activity_type_id', '=', self.activity_sheet_review.id), + ('user_id', '=', user_2.id), + ]) + self.assertEqual(activity.date_deadline, date(2020, 2, 3)) diff --git a/hr_timesheet_sheet_activity/views/mail_activity.xml b/hr_timesheet_sheet_activity/views/mail_activity.xml new file mode 100644 index 0000000000..25386e35e7 --- /dev/null +++ b/hr_timesheet_sheet_activity/views/mail_activity.xml @@ -0,0 +1,24 @@ + + + + + + Activity Types + mail.activity.type + form + tree,form + [('res_model_id.model', '=', 'hr_timesheet.sheet')] + {'default_res_model': 'hr_timesheet.sheet'} + + + + + From 6675a9c8d86306a39f74576a0fd6e76573e14d1d Mon Sep 17 00:00:00 2001 From: Cas Vissers Date: Fri, 3 Apr 2020 05:41:08 +0000 Subject: [PATCH 02/10] Added translation using Weblate (Dutch) --- hr_timesheet_sheet_activity/i18n/nl_NL.po | 43 +++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 hr_timesheet_sheet_activity/i18n/nl_NL.po diff --git a/hr_timesheet_sheet_activity/i18n/nl_NL.po b/hr_timesheet_sheet_activity/i18n/nl_NL.po new file mode 100644 index 0000000000..9d0351a646 --- /dev/null +++ b/hr_timesheet_sheet_activity/i18n/nl_NL.po @@ -0,0 +1,43 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_timesheet_sheet_activity +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-04-03 08:19+0000\n" +"Last-Translator: Cas Vissers \n" +"Language-Team: none\n" +"Language: nl_NL\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 3.10\n" + +#. module: hr_timesheet_sheet_activity +#: model:ir.actions.act_window,name:hr_timesheet_sheet_activity.action_view_hr_timesheet_sheet_mail_activity_types +#: model:ir.ui.menu,name:hr_timesheet_sheet_activity.menu_view_hr_timesheet_sheet_mail_activity_types +msgid "Activity Types" +msgstr "Activiteit soorten" + +#. module: hr_timesheet_sheet_activity +#: model:ir.model,name:hr_timesheet_sheet_activity.model_hr_timesheet_sheet +msgid "Timesheet Sheet" +msgstr "Urenstaat formulier" + +#. module: hr_timesheet_sheet_activity +#: model:mail.activity.type,name:hr_timesheet_sheet_activity.activity_sheet_resubmission +msgid "Timesheet Sheet Re-submission" +msgstr "Urenstaat formulier opnieuw ingediend" + +#. module: hr_timesheet_sheet_activity +#: model:mail.activity.type,name:hr_timesheet_sheet_activity.activity_sheet_review +msgid "Timesheet Sheet Review" +msgstr "Urenstaat formulier goedkeuren" + +#. module: hr_timesheet_sheet_activity +#: model:mail.activity.type,name:hr_timesheet_sheet_activity.activity_sheet_submission +msgid "Timesheet Sheet Submission" +msgstr "Urenstaat formulier indienen" From 3aae093bc2dc360e32b9125ee2823ed2ac12afdb Mon Sep 17 00:00:00 2001 From: Josep M Date: Mon, 18 May 2020 11:36:08 +0000 Subject: [PATCH 03/10] Added translation using Weblate (Spanish) --- hr_timesheet_sheet_activity/i18n/es.po | 43 ++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 hr_timesheet_sheet_activity/i18n/es.po diff --git a/hr_timesheet_sheet_activity/i18n/es.po b/hr_timesheet_sheet_activity/i18n/es.po new file mode 100644 index 0000000000..f82e612bb3 --- /dev/null +++ b/hr_timesheet_sheet_activity/i18n/es.po @@ -0,0 +1,43 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_timesheet_sheet_activity +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-05-18 12:19+0000\n" +"Last-Translator: Josep M \n" +"Language-Team: none\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 3.10\n" + +#. module: hr_timesheet_sheet_activity +#: model:ir.actions.act_window,name:hr_timesheet_sheet_activity.action_view_hr_timesheet_sheet_mail_activity_types +#: model:ir.ui.menu,name:hr_timesheet_sheet_activity.menu_view_hr_timesheet_sheet_mail_activity_types +msgid "Activity Types" +msgstr "Tipos Actividades" + +#. module: hr_timesheet_sheet_activity +#: model:ir.model,name:hr_timesheet_sheet_activity.model_hr_timesheet_sheet +msgid "Timesheet Sheet" +msgstr "Parte horas" + +#. module: hr_timesheet_sheet_activity +#: model:mail.activity.type,name:hr_timesheet_sheet_activity.activity_sheet_resubmission +msgid "Timesheet Sheet Re-submission" +msgstr "Re-enviar Parte horas" + +#. module: hr_timesheet_sheet_activity +#: model:mail.activity.type,name:hr_timesheet_sheet_activity.activity_sheet_review +msgid "Timesheet Sheet Review" +msgstr "Revisar Parte horas" + +#. module: hr_timesheet_sheet_activity +#: model:mail.activity.type,name:hr_timesheet_sheet_activity.activity_sheet_submission +msgid "Timesheet Sheet Submission" +msgstr "Enviar Parte horas" From 76b10971d7b9c716cf3f87eb831435be475884f5 Mon Sep 17 00:00:00 2001 From: Pedro Castro Silva Date: Mon, 25 May 2020 22:09:12 +0000 Subject: [PATCH 04/10] Added translation using Weblate (Portuguese) --- hr_timesheet_sheet_activity/i18n/pt.po | 43 ++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 hr_timesheet_sheet_activity/i18n/pt.po diff --git a/hr_timesheet_sheet_activity/i18n/pt.po b/hr_timesheet_sheet_activity/i18n/pt.po new file mode 100644 index 0000000000..8c46479c58 --- /dev/null +++ b/hr_timesheet_sheet_activity/i18n/pt.po @@ -0,0 +1,43 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_timesheet_sheet_activity +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-05-26 00:19+0000\n" +"Last-Translator: Pedro Castro Silva \n" +"Language-Team: none\n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 3.10\n" + +#. module: hr_timesheet_sheet_activity +#: model:ir.actions.act_window,name:hr_timesheet_sheet_activity.action_view_hr_timesheet_sheet_mail_activity_types +#: model:ir.ui.menu,name:hr_timesheet_sheet_activity.menu_view_hr_timesheet_sheet_mail_activity_types +msgid "Activity Types" +msgstr "Tipos de Atividades" + +#. module: hr_timesheet_sheet_activity +#: model:ir.model,name:hr_timesheet_sheet_activity.model_hr_timesheet_sheet +msgid "Timesheet Sheet" +msgstr "Folha de Horas" + +#. module: hr_timesheet_sheet_activity +#: model:mail.activity.type,name:hr_timesheet_sheet_activity.activity_sheet_resubmission +msgid "Timesheet Sheet Re-submission" +msgstr "Re-submissão de Folha de Horas" + +#. module: hr_timesheet_sheet_activity +#: model:mail.activity.type,name:hr_timesheet_sheet_activity.activity_sheet_review +msgid "Timesheet Sheet Review" +msgstr "Revisão de Folha de Horas" + +#. module: hr_timesheet_sheet_activity +#: model:mail.activity.type,name:hr_timesheet_sheet_activity.activity_sheet_submission +msgid "Timesheet Sheet Submission" +msgstr "Submissão de Folha de Horas" From 6321e052fb9f9ee971e16a20891169659432c87d Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Wed, 4 Nov 2020 12:44:34 +0200 Subject: [PATCH 05/10] [UPD] Brainbean Apps => CorporateHub --- hr_timesheet_sheet_activity/README.rst | 6 ++++-- hr_timesheet_sheet_activity/__manifest__.py | 3 ++- hr_timesheet_sheet_activity/readme/CONTRIBUTORS.rst | 4 +++- hr_timesheet_sheet_activity/static/description/index.html | 7 +++++-- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/hr_timesheet_sheet_activity/README.rst b/hr_timesheet_sheet_activity/README.rst index 7d065976c7..b4556163e8 100644 --- a/hr_timesheet_sheet_activity/README.rst +++ b/hr_timesheet_sheet_activity/README.rst @@ -53,12 +53,14 @@ Credits Authors ~~~~~~~ -* Brainbean Apps +* CorporateHub Contributors ~~~~~~~~~~~~ -* Alexey Pelykh +* `CorporateHub `__ + + * Alexey Pelykh Maintainers ~~~~~~~~~~~ diff --git a/hr_timesheet_sheet_activity/__manifest__.py b/hr_timesheet_sheet_activity/__manifest__.py index 3b180e2954..d62526c640 100644 --- a/hr_timesheet_sheet_activity/__manifest__.py +++ b/hr_timesheet_sheet_activity/__manifest__.py @@ -1,4 +1,5 @@ # Copyright 2020 Brainbean Apps (https://brainbeanapps.com) +# Copyright 2020 CorporateHub (https://corporatehub.eu) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). { @@ -7,7 +8,7 @@ 'category': 'Human Resources', 'website': 'https://github.com/OCA/timesheet', 'author': - 'Brainbean Apps, ' + 'CorporateHub, ' 'Odoo Community Association (OCA)', 'license': 'AGPL-3', 'installable': True, diff --git a/hr_timesheet_sheet_activity/readme/CONTRIBUTORS.rst b/hr_timesheet_sheet_activity/readme/CONTRIBUTORS.rst index 1c6a35a1e3..724bc1d03a 100644 --- a/hr_timesheet_sheet_activity/readme/CONTRIBUTORS.rst +++ b/hr_timesheet_sheet_activity/readme/CONTRIBUTORS.rst @@ -1 +1,3 @@ -* Alexey Pelykh +* `CorporateHub `__ + + * Alexey Pelykh diff --git a/hr_timesheet_sheet_activity/static/description/index.html b/hr_timesheet_sheet_activity/static/description/index.html index 02acacba3f..5392121631 100644 --- a/hr_timesheet_sheet_activity/static/description/index.html +++ b/hr_timesheet_sheet_activity/static/description/index.html @@ -400,13 +400,16 @@

Credits

Authors

    -
  • Brainbean Apps
  • +
  • CorporateHub
From 7016b2681c012310b462d098043b8f7825d36a0a Mon Sep 17 00:00:00 2001 From: Ilyas Date: Mon, 7 Nov 2022 14:11:51 +0500 Subject: [PATCH 06/10] [IMP] hr_timesheet_sheet_activity: black, isort, prettier --- hr_timesheet_sheet_activity/__manifest__.py | 33 +- .../data/hr_timesheet_sheet_activity_data.xml | 8 +- .../models/hr_timesheet_sheet.py | 162 ++-- .../tests/test_hr_timesheet_sheet_activity.py | 754 +++++++++++------- .../views/mail_activity.xml | 7 +- 5 files changed, 552 insertions(+), 412 deletions(-) diff --git a/hr_timesheet_sheet_activity/__manifest__.py b/hr_timesheet_sheet_activity/__manifest__.py index d62526c640..86bd535b46 100644 --- a/hr_timesheet_sheet_activity/__manifest__.py +++ b/hr_timesheet_sheet_activity/__manifest__.py @@ -3,25 +3,22 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). { - 'name': 'HR Timesheet Sheet Activities', - 'version': '12.0.1.0.0', - 'category': 'Human Resources', - 'website': 'https://github.com/OCA/timesheet', - 'author': - 'CorporateHub, ' - 'Odoo Community Association (OCA)', - 'license': 'AGPL-3', - 'installable': True, - 'application': False, - 'summary': ( - 'Automatic activities related to submission and review of timesheet' - ' sheets' + "name": "HR Timesheet Sheet Activities", + "version": "12.0.1.0.0", + "category": "Human Resources", + "website": "https://github.com/OCA/timesheet", + "author": "CorporateHub, " "Odoo Community Association (OCA)", + "license": "AGPL-3", + "installable": True, + "application": False, + "summary": ( + "Automatic activities related to submission and review of timesheet" " sheets" ), - 'depends': [ - 'hr_timesheet_sheet', + "depends": [ + "hr_timesheet_sheet", ], - 'data': [ - 'data/hr_timesheet_sheet_activity_data.xml', - 'views/mail_activity.xml', + "data": [ + "data/hr_timesheet_sheet_activity_data.xml", + "views/mail_activity.xml", ], } diff --git a/hr_timesheet_sheet_activity/data/hr_timesheet_sheet_activity_data.xml b/hr_timesheet_sheet_activity/data/hr_timesheet_sheet_activity_data.xml index b46716e07b..83261a7581 100644 --- a/hr_timesheet_sheet_activity/data/hr_timesheet_sheet_activity_data.xml +++ b/hr_timesheet_sheet_activity/data/hr_timesheet_sheet_activity_data.xml @@ -1,4 +1,4 @@ - + - + Activity Types mail.activity.type form From 26f53889bd502bc2a8d1fc98d38df9c55969fd99 Mon Sep 17 00:00:00 2001 From: Ilyas Date: Mon, 7 Nov 2022 14:51:07 +0500 Subject: [PATCH 07/10] [MIG] hr_timesheet_sheet_activity: Migration to 14.0 --- hr_timesheet_sheet_activity/README.rst | 14 +++++---- hr_timesheet_sheet_activity/__manifest__.py | 2 +- hr_timesheet_sheet_activity/i18n/es.po | 17 ++++++++++- .../i18n/hr_timesheet_sheet_activity.pot | 22 +++++++++++--- hr_timesheet_sheet_activity/i18n/nl_NL.po | 17 ++++++++++- hr_timesheet_sheet_activity/i18n/pt.po | 17 ++++++++++- .../models/hr_timesheet_sheet.py | 20 ++++++------- .../readme/CONTRIBUTORS.rst | 4 +++ .../static/description/index.html | 10 +++++-- .../tests/test_hr_timesheet_sheet_activity.py | 30 +++++++++---------- .../views/mail_activity.xml | 1 - 11 files changed, 112 insertions(+), 42 deletions(-) diff --git a/hr_timesheet_sheet_activity/README.rst b/hr_timesheet_sheet_activity/README.rst index b4556163e8..784a0e1453 100644 --- a/hr_timesheet_sheet_activity/README.rst +++ b/hr_timesheet_sheet_activity/README.rst @@ -14,13 +14,13 @@ HR Timesheet Sheet Activities :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Ftimesheet-lightgray.png?logo=github - :target: https://github.com/OCA/timesheet/tree/12.0/hr_timesheet_sheet_activity + :target: https://github.com/OCA/timesheet/tree/14.0/hr_timesheet_sheet_activity :alt: OCA/timesheet .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/timesheet-12-0/timesheet-12-0-hr_timesheet_sheet_activity + :target: https://translation.odoo-community.org/projects/timesheet-14-0/timesheet-14-0-hr_timesheet_sheet_activity :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/117/12.0 + :target: https://runbot.odoo-community.org/runbot/117/14.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -43,7 +43,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 smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -62,6 +62,10 @@ Contributors * Alexey Pelykh +* `Ooops404 `__: + + * Ilyas + Maintainers ~~~~~~~~~~~ @@ -75,6 +79,6 @@ 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. -This module is part of the `OCA/timesheet `_ project on GitHub. +This module is part of the `OCA/timesheet `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/hr_timesheet_sheet_activity/__manifest__.py b/hr_timesheet_sheet_activity/__manifest__.py index 86bd535b46..fa68ea3de2 100644 --- a/hr_timesheet_sheet_activity/__manifest__.py +++ b/hr_timesheet_sheet_activity/__manifest__.py @@ -4,7 +4,7 @@ { "name": "HR Timesheet Sheet Activities", - "version": "12.0.1.0.0", + "version": "14.0.1.0.0", "category": "Human Resources", "website": "https://github.com/OCA/timesheet", "author": "CorporateHub, " "Odoo Community Association (OCA)", diff --git a/hr_timesheet_sheet_activity/i18n/es.po b/hr_timesheet_sheet_activity/i18n/es.po index f82e612bb3..11a2f8a7b2 100644 --- a/hr_timesheet_sheet_activity/i18n/es.po +++ b/hr_timesheet_sheet_activity/i18n/es.po @@ -1,6 +1,6 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * hr_timesheet_sheet_activity +# * hr_timesheet_sheet_activity # msgid "" msgstr "" @@ -22,6 +22,21 @@ msgstr "" msgid "Activity Types" msgstr "Tipos Actividades" +#. module: hr_timesheet_sheet_activity +#: model:ir.model.fields,field_description:hr_timesheet_sheet_activity.field_hr_timesheet_sheet__display_name +msgid "Display Name" +msgstr "" + +#. module: hr_timesheet_sheet_activity +#: model:ir.model.fields,field_description:hr_timesheet_sheet_activity.field_hr_timesheet_sheet__id +msgid "ID" +msgstr "" + +#. module: hr_timesheet_sheet_activity +#: model:ir.model.fields,field_description:hr_timesheet_sheet_activity.field_hr_timesheet_sheet____last_update +msgid "Last Modified on" +msgstr "" + #. module: hr_timesheet_sheet_activity #: model:ir.model,name:hr_timesheet_sheet_activity.model_hr_timesheet_sheet msgid "Timesheet Sheet" diff --git a/hr_timesheet_sheet_activity/i18n/hr_timesheet_sheet_activity.pot b/hr_timesheet_sheet_activity/i18n/hr_timesheet_sheet_activity.pot index 2341d8328d..ea25504054 100644 --- a/hr_timesheet_sheet_activity/i18n/hr_timesheet_sheet_activity.pot +++ b/hr_timesheet_sheet_activity/i18n/hr_timesheet_sheet_activity.pot @@ -1,12 +1,12 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * hr_timesheet_sheet_activity +# * hr_timesheet_sheet_activity # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 12.0\n" +"Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: <>\n" +"Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,6 +19,21 @@ msgstr "" msgid "Activity Types" msgstr "" +#. module: hr_timesheet_sheet_activity +#: model:ir.model.fields,field_description:hr_timesheet_sheet_activity.field_hr_timesheet_sheet__display_name +msgid "Display Name" +msgstr "" + +#. module: hr_timesheet_sheet_activity +#: model:ir.model.fields,field_description:hr_timesheet_sheet_activity.field_hr_timesheet_sheet__id +msgid "ID" +msgstr "" + +#. module: hr_timesheet_sheet_activity +#: model:ir.model.fields,field_description:hr_timesheet_sheet_activity.field_hr_timesheet_sheet____last_update +msgid "Last Modified on" +msgstr "" + #. module: hr_timesheet_sheet_activity #: model:ir.model,name:hr_timesheet_sheet_activity.model_hr_timesheet_sheet msgid "Timesheet Sheet" @@ -38,4 +53,3 @@ msgstr "" #: model:mail.activity.type,name:hr_timesheet_sheet_activity.activity_sheet_submission msgid "Timesheet Sheet Submission" msgstr "" - diff --git a/hr_timesheet_sheet_activity/i18n/nl_NL.po b/hr_timesheet_sheet_activity/i18n/nl_NL.po index 9d0351a646..8c4c1b027e 100644 --- a/hr_timesheet_sheet_activity/i18n/nl_NL.po +++ b/hr_timesheet_sheet_activity/i18n/nl_NL.po @@ -1,6 +1,6 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * hr_timesheet_sheet_activity +# * hr_timesheet_sheet_activity # msgid "" msgstr "" @@ -22,6 +22,21 @@ msgstr "" msgid "Activity Types" msgstr "Activiteit soorten" +#. module: hr_timesheet_sheet_activity +#: model:ir.model.fields,field_description:hr_timesheet_sheet_activity.field_hr_timesheet_sheet__display_name +msgid "Display Name" +msgstr "" + +#. module: hr_timesheet_sheet_activity +#: model:ir.model.fields,field_description:hr_timesheet_sheet_activity.field_hr_timesheet_sheet__id +msgid "ID" +msgstr "" + +#. module: hr_timesheet_sheet_activity +#: model:ir.model.fields,field_description:hr_timesheet_sheet_activity.field_hr_timesheet_sheet____last_update +msgid "Last Modified on" +msgstr "" + #. module: hr_timesheet_sheet_activity #: model:ir.model,name:hr_timesheet_sheet_activity.model_hr_timesheet_sheet msgid "Timesheet Sheet" diff --git a/hr_timesheet_sheet_activity/i18n/pt.po b/hr_timesheet_sheet_activity/i18n/pt.po index 8c46479c58..caaca95550 100644 --- a/hr_timesheet_sheet_activity/i18n/pt.po +++ b/hr_timesheet_sheet_activity/i18n/pt.po @@ -1,6 +1,6 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * hr_timesheet_sheet_activity +# * hr_timesheet_sheet_activity # msgid "" msgstr "" @@ -22,6 +22,21 @@ msgstr "" msgid "Activity Types" msgstr "Tipos de Atividades" +#. module: hr_timesheet_sheet_activity +#: model:ir.model.fields,field_description:hr_timesheet_sheet_activity.field_hr_timesheet_sheet__display_name +msgid "Display Name" +msgstr "" + +#. module: hr_timesheet_sheet_activity +#: model:ir.model.fields,field_description:hr_timesheet_sheet_activity.field_hr_timesheet_sheet__id +msgid "ID" +msgstr "" + +#. module: hr_timesheet_sheet_activity +#: model:ir.model.fields,field_description:hr_timesheet_sheet_activity.field_hr_timesheet_sheet____last_update +msgid "Last Modified on" +msgstr "" + #. module: hr_timesheet_sheet_activity #: model:ir.model,name:hr_timesheet_sheet_activity.model_hr_timesheet_sheet msgid "Timesheet Sheet" diff --git a/hr_timesheet_sheet_activity/models/hr_timesheet_sheet.py b/hr_timesheet_sheet_activity/models/hr_timesheet_sheet.py index c7f43a6891..7f3d0a81f9 100644 --- a/hr_timesheet_sheet_activity/models/hr_timesheet_sheet.py +++ b/hr_timesheet_sheet_activity/models/hr_timesheet_sheet.py @@ -7,7 +7,7 @@ from dateutil.rrule import MONTHLY, WEEKLY from pytz import UTC, timezone -from odoo import api, fields, models +from odoo import fields, models class HrTimesheetSheet(models.Model): @@ -19,7 +19,6 @@ def _get_subscribers(self): res = res - self._get_possible_reviewers().mapped("partner_id") return res - @api.multi def write(self, vals): res = super().write(vals) @@ -90,7 +89,6 @@ def write(self, vals): return res - @api.multi def action_timesheet_draft(self): for sheet in self: sheet.activity_schedule( @@ -101,7 +99,6 @@ def action_timesheet_draft(self): super().action_timesheet_draft() - @api.multi def action_timesheet_confirm(self): super().action_timesheet_confirm() @@ -128,7 +125,6 @@ def action_timesheet_confirm(self): user_id=reviewer.id, ) - @api.multi def action_timesheet_done(self): super().action_timesheet_done() @@ -145,7 +141,6 @@ def action_timesheet_done(self): activity = activity.sudo() activity.action_feedback() - @api.multi def action_timesheet_refuse(self): for sheet in self: sheet.activity_schedule( @@ -169,7 +164,6 @@ def action_timesheet_refuse(self): activity = activity.sudo() activity.action_feedback() - @api.multi def _activity_sheet_submission_deadline(self): """Hook for extensions""" self.ensure_one() @@ -200,13 +194,11 @@ def _activity_sheet_submission_deadline(self): return worktimes[-1][0] # Last workday of period return datetime_end.date() - @api.multi def _activity_sheet_resubmission_deadline(self): """Hook for extensions""" self.ensure_one() return None - @api.multi def _activity_sheet_review_deadline(self, reviewer): """Hook for extensions""" self.ensure_one() @@ -253,7 +245,15 @@ def _activity_sheet_review_deadline(self, reviewer): def _activity_sheet_review_max_period(self): """Hook for extensions""" self.ensure_one() - r = self.company_id.sheet_range or WEEKLY + sheet_range = self.company_id.sheet_range + if not sheet_range: + r = WEEKLY + elif sheet_range == "DAILY": + r = 1 + elif sheet_range == "WEEKLY": + r = 2 + elif sheet_range == "MONTHLY": + r = 3 if r == WEEKLY: return relativedelta(weeks=1) elif r == MONTHLY: diff --git a/hr_timesheet_sheet_activity/readme/CONTRIBUTORS.rst b/hr_timesheet_sheet_activity/readme/CONTRIBUTORS.rst index 724bc1d03a..60d0bb2791 100644 --- a/hr_timesheet_sheet_activity/readme/CONTRIBUTORS.rst +++ b/hr_timesheet_sheet_activity/readme/CONTRIBUTORS.rst @@ -1,3 +1,7 @@ * `CorporateHub `__ * Alexey Pelykh + +* `Ooops404 `__: + + * Ilyas diff --git a/hr_timesheet_sheet_activity/static/description/index.html b/hr_timesheet_sheet_activity/static/description/index.html index 5392121631..1961555caa 100644 --- a/hr_timesheet_sheet_activity/static/description/index.html +++ b/hr_timesheet_sheet_activity/static/description/index.html @@ -367,7 +367,7 @@

HR Timesheet Sheet Activities

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/timesheet Translate me on Weblate Try me on Runbot

+

Beta License: AGPL-3 OCA/timesheet Translate me on Weblate Try me on Runbot

This module adds the following activities related to submission and review of timesheet sheets:

    @@ -392,7 +392,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 smashing it by providing a detailed and welcomed -feedback.

    +feedback.

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

@@ -410,6 +410,10 @@

Contributors

  • Alexey Pelykh <alexey.pelykh@corphub.eu>
  • +
  • Ooops404: +
  • @@ -419,7 +423,7 @@

    Maintainers

    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.

    -

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

    +

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

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

    diff --git a/hr_timesheet_sheet_activity/tests/test_hr_timesheet_sheet_activity.py b/hr_timesheet_sheet_activity/tests/test_hr_timesheet_sheet_activity.py index a33944b2d2..f7e5b10781 100644 --- a/hr_timesheet_sheet_activity/tests/test_hr_timesheet_sheet_activity.py +++ b/hr_timesheet_sheet_activity/tests/test_hr_timesheet_sheet_activity.py @@ -19,7 +19,7 @@ def setUp(self): self.HrTimesheetSheet = self.env["hr_timesheet.sheet"] self.AccountAnalyticLine = self.env["account.analytic.line"] self.MailActivity = self.env["mail.activity"] - self.company_id = self.Company._company_default_get() + self.company_id = self.env.ref("base.main_company") self.now = fields.Datetime.now() self.group_hr_user = self.env.ref("hr.group_hr_user") self.group_hr_timesheet_user = self.env.ref( @@ -93,7 +93,7 @@ def test_activity(self): } ) - sheet = self.HrTimesheetSheet.sudo(user_1).create( + sheet = self.HrTimesheetSheet.with_user(user_1).create( { "employee_id": employee.id, } @@ -109,7 +109,7 @@ def test_activity(self): self.assertEqual(activities.res_id, sheet.id) self.assertEqual(activities.activity_type_id, self.activity_sheet_submission) - sheet.sudo(user_1).action_timesheet_confirm() + sheet.with_user(user_1).action_timesheet_confirm() activities = self.MailActivity.search( [ @@ -121,7 +121,7 @@ def test_activity(self): self.assertEqual(activities.res_id, sheet.id) self.assertEqual(activities.activity_type_id, self.activity_sheet_review) - sheet.sudo(user_2).action_timesheet_done() + sheet.with_user(user_2).action_timesheet_done() activities = self.MailActivity.search( [ @@ -130,7 +130,7 @@ def test_activity(self): ) self.assertEqual(len(activities), 0) - sheet.sudo(user_2).action_timesheet_draft() + sheet.with_user(user_2).action_timesheet_draft() activities = self.MailActivity.search( [ @@ -142,7 +142,7 @@ def test_activity(self): self.assertEqual(activities.res_id, sheet.id) self.assertEqual(activities.activity_type_id, self.activity_sheet_resubmission) - sheet.sudo(user_1).action_timesheet_confirm() + sheet.with_user(user_1).action_timesheet_confirm() activities = self.MailActivity.search( [ @@ -154,7 +154,7 @@ def test_activity(self): self.assertEqual(activities.res_id, sheet.id) self.assertEqual(activities.activity_type_id, self.activity_sheet_review) - sheet.sudo(user_1).action_timesheet_refuse() + sheet.with_user(user_1).action_timesheet_refuse() activities = self.MailActivity.search( [ @@ -222,7 +222,7 @@ def test_period_ends_on_workday(self): ) sheet = ( - self.HrTimesheetSheet.sudo(user_1) + self.HrTimesheetSheet.with_user(user_1) .with_context( { "hr_timesheet_sheet_activity_today": date(2020, 2, 7), @@ -245,7 +245,7 @@ def test_period_ends_on_workday(self): ) self.assertEqual(activity.date_deadline, date(2020, 2, 7)) - sheet.sudo(user_1).action_timesheet_confirm() + sheet.with_user(user_1).action_timesheet_confirm() activity = self.MailActivity.search( [ @@ -312,7 +312,7 @@ def test_period_ends_on_weekend(self): ) sheet = ( - self.HrTimesheetSheet.sudo(user_1) + self.HrTimesheetSheet.with_user(user_1) .with_context( { "hr_timesheet_sheet_activity_today": date(2020, 2, 7), @@ -335,7 +335,7 @@ def test_period_ends_on_weekend(self): ) self.assertEqual(activity.date_deadline, date(2020, 2, 7)) - sheet.sudo(user_1).action_timesheet_confirm() + sheet.with_user(user_1).action_timesheet_confirm() activity = self.MailActivity.search( [ @@ -402,7 +402,7 @@ def test_period_overdue(self): ) sheet = ( - self.HrTimesheetSheet.sudo(user_1) + self.HrTimesheetSheet.with_user(user_1) .with_context( { "hr_timesheet_sheet_activity_today": date(2020, 2, 7), @@ -425,7 +425,7 @@ def test_period_overdue(self): ) self.assertEqual(activity.date_deadline, date(2020, 2, 7)) - sheet.sudo(user_1).action_timesheet_confirm() + sheet.with_user(user_1).action_timesheet_confirm() activity = self.MailActivity.search( [ @@ -492,7 +492,7 @@ def test_weekend_period(self): ) sheet = ( - self.HrTimesheetSheet.sudo(user_1) + self.HrTimesheetSheet.with_user(user_1) .with_context( { "hr_timesheet_sheet_activity_today": date(2020, 2, 1), @@ -515,7 +515,7 @@ def test_weekend_period(self): ) self.assertEqual(activity.date_deadline, date(2020, 2, 1)) - sheet.sudo(user_1).action_timesheet_confirm() + sheet.with_user(user_1).action_timesheet_confirm() activity = self.MailActivity.search( [ diff --git a/hr_timesheet_sheet_activity/views/mail_activity.xml b/hr_timesheet_sheet_activity/views/mail_activity.xml index 90dadcaac7..5db223dcb5 100644 --- a/hr_timesheet_sheet_activity/views/mail_activity.xml +++ b/hr_timesheet_sheet_activity/views/mail_activity.xml @@ -11,7 +11,6 @@ > Activity Types mail.activity.type - form tree,form [('res_model_id.model', '=', 'hr_timesheet.sheet')] {'default_res_model': 'hr_timesheet.sheet'} From 371ea35e54b43187bb4f8904e2a61e85e4d47bcd Mon Sep 17 00:00:00 2001 From: Francesco Foresti Date: Wed, 30 Nov 2022 14:12:04 +0000 Subject: [PATCH 08/10] Added translation using Weblate (Italian) --- hr_timesheet_sheet_activity/README.rst | 15 +++-- hr_timesheet_sheet_activity/i18n/it.po | 58 +++++++++++++++++++ .../static/description/index.html | 34 ++++++----- 3 files changed, 85 insertions(+), 22 deletions(-) create mode 100644 hr_timesheet_sheet_activity/i18n/it.po diff --git a/hr_timesheet_sheet_activity/README.rst b/hr_timesheet_sheet_activity/README.rst index 784a0e1453..52d2ce2771 100644 --- a/hr_timesheet_sheet_activity/README.rst +++ b/hr_timesheet_sheet_activity/README.rst @@ -2,10 +2,13 @@ HR Timesheet Sheet Activities ============================= -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:fe04fe07b7e649beb3b78bb931a004609d534e967cd81dbf3756234698c6784a + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status @@ -19,11 +22,11 @@ HR Timesheet Sheet Activities .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png :target: https://translation.odoo-community.org/projects/timesheet-14-0/timesheet-14-0-hr_timesheet_sheet_activity :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/117/14.0 - :alt: Try me on Runbot +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/timesheet&target_branch=14.0 + :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| This module adds the following activities related to submission and review of timesheet sheets: @@ -42,7 +45,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 smashing it by providing a detailed and welcomed +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. diff --git a/hr_timesheet_sheet_activity/i18n/it.po b/hr_timesheet_sheet_activity/i18n/it.po new file mode 100644 index 0000000000..c25849122e --- /dev/null +++ b/hr_timesheet_sheet_activity/i18n/it.po @@ -0,0 +1,58 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_timesheet_sheet_activity +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-10-11 08:38+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_timesheet_sheet_activity +#: model:ir.actions.act_window,name:hr_timesheet_sheet_activity.action_view_hr_timesheet_sheet_mail_activity_types +#: model:ir.ui.menu,name:hr_timesheet_sheet_activity.menu_view_hr_timesheet_sheet_mail_activity_types +msgid "Activity Types" +msgstr "Tipi attività" + +#. module: hr_timesheet_sheet_activity +#: model:ir.model.fields,field_description:hr_timesheet_sheet_activity.field_hr_timesheet_sheet__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: hr_timesheet_sheet_activity +#: model:ir.model.fields,field_description:hr_timesheet_sheet_activity.field_hr_timesheet_sheet__id +msgid "ID" +msgstr "ID" + +#. module: hr_timesheet_sheet_activity +#: model:ir.model.fields,field_description:hr_timesheet_sheet_activity.field_hr_timesheet_sheet____last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: hr_timesheet_sheet_activity +#: model:ir.model,name:hr_timesheet_sheet_activity.model_hr_timesheet_sheet +msgid "Timesheet Sheet" +msgstr "Prospetto foglio ore" + +#. module: hr_timesheet_sheet_activity +#: model:mail.activity.type,name:hr_timesheet_sheet_activity.activity_sheet_resubmission +msgid "Timesheet Sheet Re-submission" +msgstr "Re-invio prospetto foglio ore" + +#. module: hr_timesheet_sheet_activity +#: model:mail.activity.type,name:hr_timesheet_sheet_activity.activity_sheet_review +msgid "Timesheet Sheet Review" +msgstr "Revisione prospetto foglio ore" + +#. module: hr_timesheet_sheet_activity +#: model:mail.activity.type,name:hr_timesheet_sheet_activity.activity_sheet_submission +msgid "Timesheet Sheet Submission" +msgstr "Invio prospetto foglio ore" diff --git a/hr_timesheet_sheet_activity/static/description/index.html b/hr_timesheet_sheet_activity/static/description/index.html index 1961555caa..67a9d0c99c 100644 --- a/hr_timesheet_sheet_activity/static/description/index.html +++ b/hr_timesheet_sheet_activity/static/description/index.html @@ -1,20 +1,20 @@ - + - + HR Timesheet Sheet Activities