diff --git a/hr_attendance_resume_holidays/README.rst b/hr_attendance_resume_holidays/README.rst new file mode 100644 index 00000000..e46d0bda --- /dev/null +++ b/hr_attendance_resume_holidays/README.rst @@ -0,0 +1,31 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +============================= +Hr attendance resume holidays +============================= + +* In object "Hours imputations resume" new fields: leave type, leave, and + holidays hours. +* If the employee has absences, and the day of the absence is not in + "Hours imputations resume", a row will be registered in the object + "Hours imputations resume" with the information of the absence. + +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 smash it by providing detailed and welcomed feedback. + +Credits +======= + +Contributors +------------ +* Ana Juaristi +* Alfredo de la Fuente + +Do not contact contributors directly about support or help with technical issues. diff --git a/hr_attendance_resume_holidays/__init__.py b/hr_attendance_resume_holidays/__init__.py new file mode 100644 index 00000000..1fd704ff --- /dev/null +++ b/hr_attendance_resume_holidays/__init__.py @@ -0,0 +1,3 @@ +# Copyright 2019 Alfredo de la Fuente - AvanzOSC +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html +from . import models diff --git a/hr_attendance_resume_holidays/__manifest__.py b/hr_attendance_resume_holidays/__manifest__.py new file mode 100644 index 00000000..d95fb4ae --- /dev/null +++ b/hr_attendance_resume_holidays/__manifest__.py @@ -0,0 +1,19 @@ +# Copyright 2019 Alfredo de la Fuente - AvanzOSC +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html +{ + "name": "Hr Attendance Resume Holidays", + "version": "12.0.1.0.0", + "license": "AGPL-3", + "depends": [ + "hr_attendance_resume_absences", + "hr_holidays", + ], + "author": "AvanzOSC", + "website": "http://www.avanzosc.es", + "category": "Human Resources", + "data": [ + "views/hr_attendance_resume_view.xml", + "views/hr_leave_report_view.xml", + ], + "installable": True, +} diff --git a/hr_attendance_resume_holidays/_common.py b/hr_attendance_resume_holidays/_common.py new file mode 100644 index 00000000..c4e66a56 --- /dev/null +++ b/hr_attendance_resume_holidays/_common.py @@ -0,0 +1,21 @@ +# Copyright 2019 Alfredo de la Fuente - AvanzOSC +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html +from odoo import fields, _ + + +def _catch_dayofweek(date): + day = str(date.weekday()) + if day == '0': + return _('Monday') + if day == '1': + return _('Tuesday') + if day == '2': + return _('Wednesday') + if day == '3': + return _('Thursday') + if day == '4': + return _('Friday') + if day == '5': + return _('Saturday') + if day == '6': + return _('Sunday') diff --git a/hr_attendance_resume_holidays/i18n/es.po b/hr_attendance_resume_holidays/i18n/es.po new file mode 100644 index 00000000..06de025b --- /dev/null +++ b/hr_attendance_resume_holidays/i18n/es.po @@ -0,0 +1,122 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_attendance_resume_holidays +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-11-18 09:05+0000\n" +"PO-Revision-Date: 2019-11-18 09:05+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_attendance_resume_holidays +#: model:ir.model,name:hr_attendance_resume_holidays.model_hr_attendance +msgid "Attendance" +msgstr "Asistencia" + +#. module: hr_attendance_resume_holidays +#: model_terms:ir.actions.act_window,help:hr_attendance_resume_holidays.action_open_hr_leave_report_from_manager +msgid "Create a new leave request" +msgstr "Crear una nueva petición de ausencia" + +#. module: hr_attendance_resume_holidays +#: model:ir.model.fields,field_description:hr_attendance_resume_holidays.field_hr_attendance_resume__created_from_holidays +msgid "Created from holidays" +msgstr "Creado desde vacaciones" + +#. module: hr_attendance_resume_holidays +#: model:ir.model.fields,field_description:hr_attendance_resume_holidays.field_hr_leave__date_to +msgid "End Date" +msgstr "Fecha finalización" + +#. module: hr_attendance_resume_holidays +#: code:addons/hr_attendance_resume_holidays/_common.py:17 +#, python-format +msgid "Friday" +msgstr "Viernes" + +#. module: hr_attendance_resume_holidays +#: model:ir.model.fields,field_description:hr_attendance_resume_holidays.field_hr_attendance_resume__holiday_hours +msgid "Holiday hours" +msgstr "Horas vacaciones" + +#. module: hr_attendance_resume_holidays +#: model:ir.model,name:hr_attendance_resume_holidays.model_hr_leave +#: model:ir.model.fields,field_description:hr_attendance_resume_holidays.field_hr_attendance_resume__leave_id +#: model_terms:ir.ui.view,arch_db:hr_attendance_resume_holidays.hr_attendance_resume_view_search +msgid "Leave" +msgstr "Ausencia" + +#. module: hr_attendance_resume_holidays +#: model:ir.model.fields,field_description:hr_attendance_resume_holidays.field_hr_attendance_resume__holiday_status_id +#: model_terms:ir.ui.view,arch_db:hr_attendance_resume_holidays.hr_attendance_resume_view_search +msgid "Leave type" +msgstr "Tipo ausencia" + +#. module: hr_attendance_resume_holidays +#: model:ir.actions.act_window,name:hr_attendance_resume_holidays.action_open_hr_leave_report_from_manager +msgid "Leaves Summary" +msgstr "Resumen de ausencias" + +#. module: hr_attendance_resume_holidays +#: code:addons/hr_attendance_resume_holidays/_common.py:9 +#, python-format +msgid "Monday" +msgstr "Lunes" + +#. module: hr_attendance_resume_holidays +#: code:addons/hr_attendance_resume_holidays/_common.py:19 +#, python-format +msgid "Saturday" +msgstr "Sábado" + +#. module: hr_attendance_resume_holidays +#: model:ir.model.fields,field_description:hr_attendance_resume_holidays.field_hr_leave__date_from +msgid "Start Date" +msgstr "Fecha de inicio" + +#. module: hr_attendance_resume_holidays +#: model:ir.ui.menu,name:hr_attendance_resume_holidays.menu_hr_leave_report_from_manager +msgid "Summary" +msgstr "Resumen" + +#. module: hr_attendance_resume_holidays +#: code:addons/hr_attendance_resume_holidays/_common.py:21 +#, python-format +msgid "Sunday" +msgstr "Domingo" + +#. module: hr_attendance_resume_holidays +#: model:ir.model.fields,field_description:hr_attendance_resume_holidays.field_hr_attendance_resume__theoretical_time_final +msgid "Theoretical time" +msgstr "Tiempo teorico" + +#. module: hr_attendance_resume_holidays +#: code:addons/hr_attendance_resume_holidays/_common.py:15 +#, python-format +msgid "Thursday" +msgstr "Jueves" + +#. module: hr_attendance_resume_holidays +#: code:addons/hr_attendance_resume_holidays/_common.py:11 +#, python-format +msgid "Tuesday" +msgstr "Martes" + +#. module: hr_attendance_resume_holidays +#: code:addons/hr_attendance_resume_holidays/_common.py:13 +#, python-format +msgid "Wednesday" +msgstr "Miércoles" + +#. module: hr_attendance_resume_holidays +#: model:ir.model,name:hr_attendance_resume_holidays.model_hr_attendance_resume +msgid "hr.attendance.resume" +msgstr "" + diff --git a/hr_attendance_resume_holidays/i18n/hr_attendance_resume_holidays.pot b/hr_attendance_resume_holidays/i18n/hr_attendance_resume_holidays.pot new file mode 100644 index 00000000..24a515dc --- /dev/null +++ b/hr_attendance_resume_holidays/i18n/hr_attendance_resume_holidays.pot @@ -0,0 +1,122 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_attendance_resume_holidays +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-11-18 09:04+0000\n" +"PO-Revision-Date: 2019-11-18 09:04+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_attendance_resume_holidays +#: model:ir.model,name:hr_attendance_resume_holidays.model_hr_attendance +msgid "Attendance" +msgstr "" + +#. module: hr_attendance_resume_holidays +#: model_terms:ir.actions.act_window,help:hr_attendance_resume_holidays.action_open_hr_leave_report_from_manager +msgid "Create a new leave request" +msgstr "" + +#. module: hr_attendance_resume_holidays +#: model:ir.model.fields,field_description:hr_attendance_resume_holidays.field_hr_attendance_resume__created_from_holidays +msgid "Created from holidays" +msgstr "" + +#. module: hr_attendance_resume_holidays +#: model:ir.model.fields,field_description:hr_attendance_resume_holidays.field_hr_leave__date_to +msgid "End Date" +msgstr "" + +#. module: hr_attendance_resume_holidays +#: code:addons/hr_attendance_resume_holidays/_common.py:17 +#, python-format +msgid "Friday" +msgstr "" + +#. module: hr_attendance_resume_holidays +#: model:ir.model.fields,field_description:hr_attendance_resume_holidays.field_hr_attendance_resume__holiday_hours +msgid "Holiday hours" +msgstr "" + +#. module: hr_attendance_resume_holidays +#: model:ir.model,name:hr_attendance_resume_holidays.model_hr_leave +#: model:ir.model.fields,field_description:hr_attendance_resume_holidays.field_hr_attendance_resume__leave_id +#: model_terms:ir.ui.view,arch_db:hr_attendance_resume_holidays.hr_attendance_resume_view_search +msgid "Leave" +msgstr "" + +#. module: hr_attendance_resume_holidays +#: model:ir.model.fields,field_description:hr_attendance_resume_holidays.field_hr_attendance_resume__holiday_status_id +#: model_terms:ir.ui.view,arch_db:hr_attendance_resume_holidays.hr_attendance_resume_view_search +msgid "Leave type" +msgstr "" + +#. module: hr_attendance_resume_holidays +#: model:ir.actions.act_window,name:hr_attendance_resume_holidays.action_open_hr_leave_report_from_manager +msgid "Leaves Summary" +msgstr "" + +#. module: hr_attendance_resume_holidays +#: code:addons/hr_attendance_resume_holidays/_common.py:9 +#, python-format +msgid "Monday" +msgstr "" + +#. module: hr_attendance_resume_holidays +#: code:addons/hr_attendance_resume_holidays/_common.py:19 +#, python-format +msgid "Saturday" +msgstr "" + +#. module: hr_attendance_resume_holidays +#: model:ir.model.fields,field_description:hr_attendance_resume_holidays.field_hr_leave__date_from +msgid "Start Date" +msgstr "" + +#. module: hr_attendance_resume_holidays +#: model:ir.ui.menu,name:hr_attendance_resume_holidays.menu_hr_leave_report_from_manager +msgid "Summary" +msgstr "" + +#. module: hr_attendance_resume_holidays +#: code:addons/hr_attendance_resume_holidays/_common.py:21 +#, python-format +msgid "Sunday" +msgstr "" + +#. module: hr_attendance_resume_holidays +#: model:ir.model.fields,field_description:hr_attendance_resume_holidays.field_hr_attendance_resume__theoretical_time_final +msgid "Theoretical time" +msgstr "" + +#. module: hr_attendance_resume_holidays +#: code:addons/hr_attendance_resume_holidays/_common.py:15 +#, python-format +msgid "Thursday" +msgstr "" + +#. module: hr_attendance_resume_holidays +#: code:addons/hr_attendance_resume_holidays/_common.py:11 +#, python-format +msgid "Tuesday" +msgstr "" + +#. module: hr_attendance_resume_holidays +#: code:addons/hr_attendance_resume_holidays/_common.py:13 +#, python-format +msgid "Wednesday" +msgstr "" + +#. module: hr_attendance_resume_holidays +#: model:ir.model,name:hr_attendance_resume_holidays.model_hr_attendance_resume +msgid "hr.attendance.resume" +msgstr "" + diff --git a/hr_attendance_resume_holidays/models/__init__.py b/hr_attendance_resume_holidays/models/__init__.py new file mode 100644 index 00000000..a5fffdaf --- /dev/null +++ b/hr_attendance_resume_holidays/models/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2019 Alfredo de la Fuente - AvanzOSC +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html +from . import hr_attendance +from . import hr_leave diff --git a/hr_attendance_resume_holidays/models/hr_attendance.py b/hr_attendance_resume_holidays/models/hr_attendance.py new file mode 100644 index 00000000..fbc43a33 --- /dev/null +++ b/hr_attendance_resume_holidays/models/hr_attendance.py @@ -0,0 +1,129 @@ +# Copyright 2019 Alfredo de la fuente - AvanzOSC +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html +from odoo import models, fields, api +from dateutil.relativedelta import relativedelta +from .._common import _catch_dayofweek + + +class HrAttendance(models.Model): + _inherit = 'hr.attendance' + + def _impute_employee_attendances_day(self): + resume = super(HrAttendance, self)._impute_employee_attendances_day() + cond = [('employee_id', '=', resume.employee_id.id), + ('request_date_from', '<=', resume.date), + ('request_date_to', '>=', resume.date), + ('state', '=', 'validate')] + leave = self.env['hr.leave'].search(cond, limit=1) + if leave: + vals = {'leave_id': leave.id} + resume.write(vals) + return resume + + def _impute_employee_attendances(self): + resume_obj = self.env['hr.attendance.resume'] + result = super(HrAttendance, self)._impute_employee_attendances() + if not self: + return result + with_imputation_date = self.filtered( + lambda x: x.imputation_date) + if not with_imputation_date: + return result + min_fec = min(with_imputation_date, key=lambda x: x.imputation_date) + date_from = min_fec.imputation_date + max_fec = max(with_imputation_date, key=lambda x: x.imputation_date) + date_to = max_fec.imputation_date + employee = min_fec.employee_id + cond = [('employee_id', '=', employee.id), + ('date', '>=', date_from), + ('date', '<=', date_to), + ('created_from_holidays', '=', True)] + resumes = resume_obj.search(cond) + if resumes: + resumes.unlink() + while date_from <= date_to: + cond = [('employee_id', '=', employee.id), + ('date', '=', date_from)] + resume = resume_obj.search(cond, limit=1) + if not resume: + leave = self._search_no_imputed_holidays(employee, date_from) + if leave: + self._create_resume_from_no_imputed_holidays( + leave, employee, date_from) + date_from = (date_from + relativedelta(days=1)) + return result + + def _search_no_imputed_holidays(self, employee, date): + cond = [('employee_id', '=', employee.id), + ('request_date_from', '<=', date), + ('request_date_to', '>=', date), + ('state', '=', 'validate')] + leave = self.env['hr.leave'].search(cond, limit=1) + return leave + + def _create_resume_from_no_imputed_holidays(self, leave, employee, date): + calendar = employee._get_employee_calendar(date) + work_time, hour_from, hour_to = employee._get_day_info( + calendar, date) + if work_time == 0.0: + return False + vals = {'employee_id': employee.id, + 'date': date, + 'leave_id': leave.id, + 'created_from_holidays': True, + 'theoretical_time': work_time, + 'day_week_literal': _catch_dayofweek(date)} + return self.env['hr.attendance.resume'].create(vals) + + +class HrAttendanceResume(models.Model): + _inherit = 'hr.attendance.resume' + + leave_id = fields.Many2one( + string='Leave', comodel_name='hr.leave') + holiday_status_id = fields.Many2one( + string='Leave type', comodel_name='hr.leave.type', + related='leave_id.holiday_status_id', store=True) + theoretical_time_final = fields.Float( + string='Theoretical time', compute='_compute_theoretical_time_final', + store=True) + holiday_hours = fields.Float( + string='Holiday hours', compute='_compute_theoretical_time_final', + store=True) + created_from_holidays = fields.Boolean( + string='Created from holidays', default=False) + + @api.depends('theoretical_time', 'leave_id') + def _compute_theoretical_time_final(self): + for record in self: + record.theoretical_time_final = record.theoretical_time + record.holiday_hours = 0 + if record.leave_id: + if (round(record.theoretical_time, 2) == + round(record.leave_id.hours_per_day, 2)): + record.theoretical_time_final = 0.0 + else: + record.theoretical_time_final = ( + record.theoretical_time - + record.leave_id.hours_per_day) + if record.theoretical_time: + record.holiday_hours = record.leave_id.hours_per_day + else: + calendar = record.employee_id._get_employee_calendar( + record.date) + employee = record.employee_id + work, hour_from, hour_to = employee._get_day_work_time( + calendar, record.date) + record.holiday_hours = work + + @api.depends('theoretical_time_final', 'presence_time', 'bonus_hours', + 'rest_exceeded') + def _compute_imputable_diference(self): + for record in self: + record.imputable_time = ( + record.presence_time + record.bonus_hours - record.rest_exceeded) + difference_hours = ( + record.imputable_time - record.theoretical_time_final) + if difference_hours != 0: + record.difference_hours = difference_hours + record.difference_minutes = round(difference_hours * 60) diff --git a/hr_attendance_resume_holidays/models/hr_leave.py b/hr_attendance_resume_holidays/models/hr_leave.py new file mode 100644 index 00000000..4f403102 --- /dev/null +++ b/hr_attendance_resume_holidays/models/hr_leave.py @@ -0,0 +1,23 @@ +# Copyright 2019 Alfredo de la fuente - AvanzOSC +# License AGPL-3 - See http://www.gnu.org/licenses/agrpl-3.0.html +from odoo import models, fields, api + + +class Hrleave(models.Model): + _inherit = 'hr.leave' + + @api.multi + def get_date_from_to(self): + date_from = fields.Datetime.now + date_to = fields.Datetime.now + if 'from_resume' in self.env.context: + date_from = ('{} 08:00:00').format( + self.env.context.get('request_date')) + date_to = ('{} 20:00:00').format( + self.env.context.get('request_date')) + for leave in self: + leave.date_from = date_from + leave.date_to = date_to + + date_from = fields.Datetime(default=get_date_from_to) + date_to = fields.Datetime(default=get_date_from_to) diff --git a/hr_attendance_resume_holidays/views/hr_attendance_resume_view.xml b/hr_attendance_resume_holidays/views/hr_attendance_resume_view.xml new file mode 100644 index 00000000..feb2779c --- /dev/null +++ b/hr_attendance_resume_holidays/views/hr_attendance_resume_view.xml @@ -0,0 +1,55 @@ + + + + hr.attendance.resume + + + + + + + True + + + + + + + + + + hr.attendance.resume + + + + + + + + + + + + + + hr.attendance.resume + + + + + + + True + + + + + + + + + + + diff --git a/hr_attendance_resume_holidays/views/hr_leave_report_view.xml b/hr_attendance_resume_holidays/views/hr_leave_report_view.xml new file mode 100644 index 00000000..942453f4 --- /dev/null +++ b/hr_attendance_resume_holidays/views/hr_leave_report_view.xml @@ -0,0 +1,35 @@ + + + + [('holiday_type','=','employee'),('employee_id.user_id','=',uid)] + + + [('holiday_type','=','employee'),('employee_id.user_id','=',uid)] + + + Leaves Summary + hr.leave.report + hr.employee + form + tree,kanban,form + + { + 'search_default_group_type': 1, + 'search_default_year': 1 , + 'search_default_my_leaves': 1, + } + +

+ Create a new leave request +

+
+ [('holiday_type','=','employee')] + +
+ +