From eb02b8e6b95c40a9c83ad1b11d213a919327bb7f Mon Sep 17 00:00:00 2001 From: Mayank Patel Date: Wed, 11 Sep 2024 05:47:45 +0000 Subject: [PATCH] [REM] hr_payroll_overtime: available in professional H14528 --- hr_payroll_overtime/__init__.py | 1 - hr_payroll_overtime/__manifest__.py | 22 - hr_payroll_overtime/data/overtime_data.xml | 12 - hr_payroll_overtime/i18n/es.po | 353 ------------ hr_payroll_overtime/models/__init__.py | 4 - hr_payroll_overtime/models/hr_contract.py | 8 - hr_payroll_overtime/models/hr_payslip.py | 173 ------ hr_payroll_overtime/models/hr_work_entry.py | 79 --- .../models/resource_calendar.py | 18 - .../security/ir.model.access.csv | 7 - hr_payroll_overtime/tests/__init__.py | 1 - hr_payroll_overtime/tests/test_overtime.py | 527 ------------------ .../views/hr_contract_views.xml | 15 - .../views/hr_payslip_views.xml | 19 - .../views/hr_work_entry_views.xml | 102 ---- .../views/resource_calendar_views.xml | 15 - 16 files changed, 1356 deletions(-) delete mode 100644 hr_payroll_overtime/__init__.py delete mode 100644 hr_payroll_overtime/__manifest__.py delete mode 100644 hr_payroll_overtime/data/overtime_data.xml delete mode 100644 hr_payroll_overtime/i18n/es.po delete mode 100644 hr_payroll_overtime/models/__init__.py delete mode 100644 hr_payroll_overtime/models/hr_contract.py delete mode 100644 hr_payroll_overtime/models/hr_payslip.py delete mode 100644 hr_payroll_overtime/models/hr_work_entry.py delete mode 100644 hr_payroll_overtime/models/resource_calendar.py delete mode 100644 hr_payroll_overtime/security/ir.model.access.csv delete mode 100644 hr_payroll_overtime/tests/__init__.py delete mode 100644 hr_payroll_overtime/tests/test_overtime.py delete mode 100644 hr_payroll_overtime/views/hr_contract_views.xml delete mode 100644 hr_payroll_overtime/views/hr_payslip_views.xml delete mode 100644 hr_payroll_overtime/views/hr_work_entry_views.xml delete mode 100644 hr_payroll_overtime/views/resource_calendar_views.xml diff --git a/hr_payroll_overtime/__init__.py b/hr_payroll_overtime/__init__.py deleted file mode 100644 index 0650744f..00000000 --- a/hr_payroll_overtime/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from . import models diff --git a/hr_payroll_overtime/__manifest__.py b/hr_payroll_overtime/__manifest__.py deleted file mode 100644 index 98f43fc3..00000000 --- a/hr_payroll_overtime/__manifest__.py +++ /dev/null @@ -1,22 +0,0 @@ -{ - 'name': 'Payroll Overtime', - 'description': 'Provide mechanisms to calculate overtime.', - 'version': '15.0.1.0.0', - 'website': 'https://hibou.io/', - 'author': 'Hibou Corp. ', - 'license': 'AGPL-3', - 'category': 'Human Resources', - 'data': [ - 'security/ir.model.access.csv', - 'data/overtime_data.xml', - 'views/hr_contract_views.xml', - 'views/hr_payslip_views.xml', - 'views/hr_work_entry_views.xml', - 'views/resource_calendar_views.xml', - ], - 'depends': [ - 'hr_payroll_hibou', - 'hr_work_entry', - 'hr_work_entry_contract_enterprise', # only for menu! - ], -} diff --git a/hr_payroll_overtime/data/overtime_data.xml b/hr_payroll_overtime/data/overtime_data.xml deleted file mode 100644 index 9316f1ab..00000000 --- a/hr_payroll_overtime/data/overtime_data.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - Default Rules - 40.0 - 1.5 - - - - \ No newline at end of file diff --git a/hr_payroll_overtime/i18n/es.po b/hr_payroll_overtime/i18n/es.po deleted file mode 100644 index 0a518b32..00000000 --- a/hr_payroll_overtime/i18n/es.po +++ /dev/null @@ -1,353 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * hr_payroll_overtime -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 15.0+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-11-01 23:24+0000\n" -"PO-Revision-Date: 2021-11-01 23:24+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_payroll_overtime -#: code:addons/hr_payroll_overtime/models/hr_work_entry.py:0 -#, python-format -msgid "An override should only have a Date OR Day of Week." -msgstr "Una anulación solo debe tener una Fecha o un Diá de la Semana." - -#. module: hr_payroll_overtime -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_overtime_type__create_uid -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_overtime_type_override__create_uid -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_type_override__create_uid -msgid "Created by" -msgstr "Creado por" - -#. module: hr_payroll_overtime -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_overtime_type__create_date -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_overtime_type_override__create_date -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_type_override__create_date -msgid "Created on" -msgstr "Creado en" - -#. module: hr_payroll_overtime -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_overtime_type_override__date -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_type_override__date -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_type_override_abstract__date -msgid "Date" -msgstr "Fecha" - -#. module: hr_payroll_overtime -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_resource_calendar__day_week_start -msgid "Day Week Starts" -msgstr "Día que comienza la semana" - -#. module: hr_payroll_overtime -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_overtime_type_override__day_of_week -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_type_override__day_of_week -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_type_override_abstract__day_of_week -msgid "Day of Week" -msgstr "Día de la semana" - -#. module: hr_payroll_overtime -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_overtime_type_override__name -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_type_override__name -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_type_override_abstract__name -msgid "Description" -msgstr "Descripción" - -#. module: hr_payroll_overtime -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_overtime_type__display_name -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_overtime_type_override__display_name -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_type_override__display_name -msgid "Display Name" -msgstr "Nombre para mostrar" - -#. module: hr_payroll_overtime -#: model:ir.model.fields,help:hr_payroll_overtime.field_hr_work_entry_overtime_type_override__work_type_id -#: model:ir.model.fields,help:hr_payroll_overtime.field_hr_work_entry_type_override__work_type_id -#: model:ir.model.fields,help:hr_payroll_overtime.field_hr_work_entry_type_override_abstract__work_type_id -msgid "Distinct Work Type for when this applies." -msgstr "Tipo de trabajo distinto para cuando esto aplica" - -#. module: hr_payroll_overtime -#: model:ir.model,name:hr_payroll_overtime.model_hr_contract -msgid "Employee Contract" -msgstr "Contrato del empleado" - -#. module: hr_payroll_overtime -#: model:ir.model.fields.selection,name:hr_payroll_overtime.selection__hr_work_entry_overtime_type_override__day_of_week__5 -#: model:ir.model.fields.selection,name:hr_payroll_overtime.selection__hr_work_entry_type_override__day_of_week__5 -#: model:ir.model.fields.selection,name:hr_payroll_overtime.selection__hr_work_entry_type_override_abstract__day_of_week__5 -#: model:ir.model.fields.selection,name:hr_payroll_overtime.selection__resource_calendar__day_week_start__5 -msgid "Friday" -msgstr "Viernes" - -#. module: hr_payroll_overtime -#: model:ir.model,name:hr_payroll_overtime.model_hr_work_entry_type -msgid "HR Work Entry Type" -msgstr "Tipo de entrada de trabajo de RRHH" - -#. module: hr_payroll_overtime -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_overtime_type__hours_per_day -msgid "Hours/Day" -msgstr "Horas/Día" - -#. module: hr_payroll_overtime -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_overtime_type__hours_per_week -msgid "Hours/Week" -msgstr "Horas/Semana" - -#. module: hr_payroll_overtime -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_overtime_type__id -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_overtime_type_override__id -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_type_override__id -msgid "ID" -msgstr "ID" - -#. module: hr_payroll_overtime -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_overtime_type____last_update -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_overtime_type_override____last_update -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_type_override____last_update -msgid "Last Modified on" -msgstr "Última Modificación el" - -#. module: hr_payroll_overtime -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_overtime_type__write_uid -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_overtime_type_override__write_uid -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_type_override__write_uid -msgid "Last Updated by" -msgstr "Última Actualización por" - -#. module: hr_payroll_overtime -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_overtime_type__write_date -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_overtime_type_override__write_date -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_type_override__write_date -msgid "Last Updated on" -msgstr "Última Actualización el" - -#. module: hr_payroll_overtime -#: model:ir.model.fields.selection,name:hr_payroll_overtime.selection__hr_work_entry_overtime_type_override__day_of_week__1 -#: model:ir.model.fields.selection,name:hr_payroll_overtime.selection__hr_work_entry_type_override__day_of_week__1 -#: model:ir.model.fields.selection,name:hr_payroll_overtime.selection__hr_work_entry_type_override_abstract__day_of_week__1 -#: model:ir.model.fields.selection,name:hr_payroll_overtime.selection__resource_calendar__day_week_start__1 -msgid "Monday" -msgstr "Lunes" - -#. module: hr_payroll_overtime -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_overtime_type__multiplier -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_overtime_type_override__multiplier -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_type_override__multiplier -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_type_override_abstract__multiplier -msgid "Multiplier" -msgstr "Multiplicador" - -#. module: hr_payroll_overtime -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_overtime_type__name -msgid "Name" -msgstr "Nombre" - -#. module: hr_payroll_overtime -#: model_terms:ir.actions.act_window,help:hr_payroll_overtime.hr_work_entry_overtime_type_action_main -msgid "No Overtime Rules" -msgstr "Sin reglas de horas extra" - -#. module: hr_payroll_overtime -#: model:ir.model.fields,help:hr_payroll_overtime.field_hr_work_entry_overtime_type__hours_per_day -msgid "Number of hours worked in a single day to trigger overtime." -msgstr "Número de horas trabajadas en un día para activar horas extra" - -#. module: hr_payroll_overtime -#: model:ir.model.fields,help:hr_payroll_overtime.field_hr_work_entry_overtime_type__hours_per_week -msgid "Number of hours worked in a week to trigger overtime." -msgstr "Número de horas trabajadas en una semana para activar horas extras" - -#. module: hr_payroll_overtime -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_overtime_type_override__work_type_id -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_type_override__work_type_id -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_type_override_abstract__work_type_id -msgid "Override Work Type" -msgstr "Anular Tipo de Trabajo" - -#. module: hr_payroll_overtime -#: model:ir.model.fields,help:hr_payroll_overtime.field_hr_work_entry_overtime_type__override_ids -msgid "Override lines with a Date will be considered before Day of Week." -msgstr "" -"Anular líneas con una fecha que será considerada antes del Día de la Semana" - -#. module: hr_payroll_overtime -#: model:ir.model.fields,help:hr_payroll_overtime.field_hr_work_entry_type__override_ids -msgid "Override work entry type on payslip." -msgstr "Anular el tipo de entrada de trabajo en el recibo de nómina" - -#. module: hr_payroll_overtime -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_overtime_type__override_ids -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_type__override_ids -#: model_terms:ir.ui.view,arch_db:hr_payroll_overtime.hr_work_entry_overtime_type_form -msgid "Overrides" -msgstr "Anula" - -#. module: hr_payroll_overtime -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_contract__is_overtime_exempt -msgid "Overtime Exempt" -msgstr "Exento de Horas Extras" - -#. module: hr_payroll_overtime -#: model:ir.model,name:hr_payroll_overtime.model_hr_work_entry_overtime_type_override -msgid "Overtime Rule Override" -msgstr "Anular Regla de Horas Extra" - -#. module: hr_payroll_overtime -#: model:ir.actions.act_window,name:hr_payroll_overtime.hr_work_entry_overtime_type_action_main -#: model:ir.model,name:hr_payroll_overtime.model_hr_work_entry_overtime_type -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_overtime_type_override__overtime_type_id -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_type__overtime_type_id -#: model:ir.ui.menu,name:hr_payroll_overtime.hr_work_entry_overtime_type_menu_main -#: model_terms:ir.ui.view,arch_db:hr_payroll_overtime.hr_work_entry_overtime_type_form -#: model_terms:ir.ui.view,arch_db:hr_payroll_overtime.hr_work_entry_overtime_type_tree -msgid "Overtime Rules" -msgstr "Reglas de Horas Extra" - -#. module: hr_payroll_overtime -#: model_terms:ir.ui.view,arch_db:hr_payroll_overtime.hr_work_entry_overtime_type_search -msgid "Overtime Rules Search" -msgstr "Busqueda de reglas de horas extra" - -#. module: hr_payroll_overtime -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_type__overtime_work_type_id -msgid "Overtime Work Type" -msgstr "Tipo de trabajo de horas extra" - -#. module: hr_payroll_overtime -#: model:ir.model,name:hr_payroll_overtime.model_hr_payslip -msgid "Pay Slip" -msgstr "Recibo de nómina" - -#. module: hr_payroll_overtime -#: model:ir.model,name:hr_payroll_overtime.model_hr_payslip_worked_days -msgid "Payslip Worked Days" -msgstr "Días trabajados en el recibo de nómina" - -#. module: hr_payroll_overtime -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_payslip_worked_days__rate -msgid "Rate" -msgstr "Tasa" - -#. module: hr_payroll_overtime -#: model:ir.model.fields,help:hr_payroll_overtime.field_hr_work_entry_overtime_type_override__multiplier -#: model:ir.model.fields,help:hr_payroll_overtime.field_hr_work_entry_type_override__multiplier -#: model:ir.model.fields,help:hr_payroll_overtime.field_hr_work_entry_type_override_abstract__multiplier -msgid "Rate for override. E.g. maybe you have \"Sunday Pay\" at 2.0x" -msgstr "Tasa de anulación. ej. Quizas usted tiene \"Pago de Domingo\" a 2.0x" - -#. module: hr_payroll_overtime -#: model:ir.model.fields,help:hr_payroll_overtime.field_hr_work_entry_overtime_type__multiplier -msgid "Rate for when overtime is reached." -msgstr "Tasa para cuando se alcanzan las horas extras." - -#. module: hr_payroll_overtime -#: code:addons/hr_payroll_overtime/models/hr_payslip.py:0 -#, python-format -msgid "" -"RecursionError raised. Ensure you have not overtime loops, you should have " -"an end work type that does not have any \"overtime\" version, and would be " -"considered the \"highest overtime\" work type and rate." -msgstr "" -"Error de Recursividad Generado. Asegurese que no tiene ciclos de horas extra, " -"deber tener un tipo de trabajo final que no tenga ninguna versión de \"Tiempo Extra\" y " -"se consideraría el tipo de trabajo y tasa de \"Horas Extras más Altas\"" - -#. module: hr_payroll_overtime -#: model:ir.model,name:hr_payroll_overtime.model_resource_calendar -msgid "Resource Working Time" -msgstr "Tiempo de trabajo de recursos" - -#. module: hr_payroll_overtime -#: model:ir.model.fields.selection,name:hr_payroll_overtime.selection__hr_work_entry_overtime_type_override__day_of_week__6 -#: model:ir.model.fields.selection,name:hr_payroll_overtime.selection__hr_work_entry_type_override__day_of_week__6 -#: model:ir.model.fields.selection,name:hr_payroll_overtime.selection__hr_work_entry_type_override_abstract__day_of_week__6 -#: model:ir.model.fields.selection,name:hr_payroll_overtime.selection__resource_calendar__day_week_start__6 -msgid "Saturday" -msgstr "Sábado" - -#. module: hr_payroll_overtime -#: model:ir.model.fields.selection,name:hr_payroll_overtime.selection__hr_work_entry_overtime_type_override__day_of_week__7 -#: model:ir.model.fields.selection,name:hr_payroll_overtime.selection__hr_work_entry_type_override__day_of_week__7 -#: model:ir.model.fields.selection,name:hr_payroll_overtime.selection__hr_work_entry_type_override_abstract__day_of_week__7 -#: model:ir.model.fields.selection,name:hr_payroll_overtime.selection__resource_calendar__day_week_start__7 -msgid "Sunday" -msgstr "Domingo" - -#. module: hr_payroll_overtime -#: model:ir.model.fields.selection,name:hr_payroll_overtime.selection__hr_work_entry_overtime_type_override__day_of_week__4 -#: model:ir.model.fields.selection,name:hr_payroll_overtime.selection__hr_work_entry_type_override__day_of_week__4 -#: model:ir.model.fields.selection,name:hr_payroll_overtime.selection__hr_work_entry_type_override_abstract__day_of_week__4 -#: model:ir.model.fields.selection,name:hr_payroll_overtime.selection__resource_calendar__day_week_start__4 -msgid "Thursday" -msgstr "Jueves" - -#. module: hr_payroll_overtime -#: model:ir.model.fields.selection,name:hr_payroll_overtime.selection__hr_work_entry_overtime_type_override__day_of_week__2 -#: model:ir.model.fields.selection,name:hr_payroll_overtime.selection__hr_work_entry_type_override__day_of_week__2 -#: model:ir.model.fields.selection,name:hr_payroll_overtime.selection__hr_work_entry_type_override_abstract__day_of_week__2 -#: model:ir.model.fields.selection,name:hr_payroll_overtime.selection__resource_calendar__day_week_start__2 -msgid "Tuesday" -msgstr "Martes" - -#. module: hr_payroll_overtime -#: model:ir.model.fields.selection,name:hr_payroll_overtime.selection__hr_work_entry_overtime_type_override__day_of_week__3 -#: model:ir.model.fields.selection,name:hr_payroll_overtime.selection__hr_work_entry_type_override__day_of_week__3 -#: model:ir.model.fields.selection,name:hr_payroll_overtime.selection__hr_work_entry_type_override_abstract__day_of_week__3 -#: model:ir.model.fields.selection,name:hr_payroll_overtime.selection__resource_calendar__day_week_start__3 -msgid "Wednesday" -msgstr "Miércoles" - -#. module: hr_payroll_overtime -#: model:ir.model.fields,field_description:hr_payroll_overtime.field_hr_work_entry_type_override__original_type_id -msgid "Work Entry Type" -msgstr "Tipo de entrada de trabajo" - -#. module: hr_payroll_overtime -#: model:ir.model,name:hr_payroll_overtime.model_hr_work_entry_type_override -msgid "Work Type Override" -msgstr "Anular Tipo de Trabajo" - -#. module: hr_payroll_overtime -#: code:addons/hr_payroll_overtime/models/hr_payslip.py:0 -#, python-format -msgid "Work type \"%s\" (id %s) must not have itself as its next overtime type." -msgstr "El tipo de trabajo \"%s\" (id %s) no debe tener a sí mismo como su próximo Tipo de Horas Extra." - -#. module: hr_payroll_overtime -#: code:addons/hr_payroll_overtime/models/hr_payslip.py:0 -#, python-format -msgid "" -"Work type \"%s\" (id %s) must not have itself as its next overtime type. " -"This occurred due to an override \"%s\" from overtime rules \"%s\"." -msgstr "El tipo de trabajo \"%s\" (id %s) no debe tener a sí mismo como su próximo Tipo de Horas Extra." -"Esto ha ocurrido debido a una anulación \"%s\" de las reglas de horas extras \"%s\"." - -#. module: hr_payroll_overtime -#: code:addons/hr_payroll_overtime/models/hr_payslip.py:0 -#, python-format -msgid "" -"Work type \"%s\" (id %s) must not have itself as its override work type. " -"This occurred due to an override line \"%s\"." -msgstr "" -"El tipo de trabajo \"%s\" (id %s) no debe tener a sí mismo como su tipo de trabajo de anulación. " -"Esto ha ocurrido debido a una línea de anulación \"%s\"." - -#. module: hr_payroll_overtime -#: model:ir.model.fields,help:hr_payroll_overtime.field_hr_contract__is_overtime_exempt -msgid "e.g. Agriculture or farm work exempt under the US FLSA." -msgstr "ej. Agricultura o trabajo agrícola exento bajo la FLSA de los EE.UU" - -#. module: hr_payroll_overtime -#: model:ir.model,name:hr_payroll_overtime.model_hr_work_entry_type_override_abstract -msgid "hr.work.entry.type.override.abstract" -msgstr "hr.work.entry.type.override.abstract" diff --git a/hr_payroll_overtime/models/__init__.py b/hr_payroll_overtime/models/__init__.py deleted file mode 100644 index 43cd2c4a..00000000 --- a/hr_payroll_overtime/models/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from . import hr_contract -from . import hr_payslip -from . import hr_work_entry -from . import resource_calendar diff --git a/hr_payroll_overtime/models/hr_contract.py b/hr_payroll_overtime/models/hr_contract.py deleted file mode 100644 index e5847963..00000000 --- a/hr_payroll_overtime/models/hr_contract.py +++ /dev/null @@ -1,8 +0,0 @@ -from odoo import fields, models - - -class HrContract(models.Model): - _inherit = 'hr.contract' - - is_overtime_exempt = fields.Boolean(string='Overtime Exempt', - help='e.g. Agriculture or farm work exempt under the US FLSA.') diff --git a/hr_payroll_overtime/models/hr_payslip.py b/hr_payroll_overtime/models/hr_payslip.py deleted file mode 100644 index 9db3e3ac..00000000 --- a/hr_payroll_overtime/models/hr_payslip.py +++ /dev/null @@ -1,173 +0,0 @@ -from collections import defaultdict -from odoo import api, fields, models, _ -from odoo.exceptions import UserError - - -class HRPayslip(models.Model): - _inherit = 'hr.payslip' - - def _get_worked_day_lines_values(self, domain=None): - worked_day_lines_values = super()._get_worked_day_lines_values(domain=domain) - return self._process_worked_day_lines_values(worked_day_lines_values, domaian=domain) - - def _process_worked_day_lines_values(self, worked_day_lines_values, domaian=None): - if not self.state in ('draft', 'verify'): - return worked_day_lines_values - - worked_day_lines_values = self._filter_worked_day_lines_values(worked_day_lines_values) - work_data = self._pre_aggregate_work_data() - work_data = self._post_aggregate_work_data(work_data) - processed_data = self._aggregate_overtime(work_data) - worked_day_lines_values += [{ - 'number_of_days': data[0], - 'number_of_hours': data[1], - 'rate': data[2], - 'contract_id': self.contract_id.id, - 'work_entry_type_id': work_type.id, - } for work_type, data in processed_data.items()] - return worked_day_lines_values - - def _filter_worked_day_lines_values(self, worked_day_lines_values): - # e.g. maybe you want to remove the stock 'WORK100' lines - # returns new worked_day_lines_values - return worked_day_lines_values - - def _pre_aggregate_work_data(self): - # returns dict(iso_date: list(tuple(hr.work.entry.type(), hours, original_record)) - return defaultdict(list) - - def _post_aggregate_work_data(self, work_data): - # takes pre_aggregate data format and converts it. - # this is to simplify algorithm and guarantee ordered by iso_date semantics - # work_data: dict(iso_date: list(tuple(hr.work.entry.type(), hours, original_record)) - # returns: list(tuple(iso_date, list(tuple(hr.work.entry.type(), hours, original_record)) - return [(iso_date, work_data[iso_date]) for iso_date in sorted(work_data.keys())] - - def _aggregate_overtime(self, work_data, day_week_start=None): - """ - - :param work_data: list(tuple(iso_date, list(tuple(hr.work.entry.type(), hours, original_record)) - :param day_week_start: day of the week to start (otherwise employee's resource calendar start day of week) - :return: dict(hr.work.entry.type(): list(days_worked, hours_worked, rate)) - """ - if not day_week_start: - if self.employee_id.resource_calendar_id.day_week_start: - day_week_start = self.employee_id.resource_calendar_id.day_week_start - else: - day_week_start = '1' - day_week_start = int(day_week_start) - if day_week_start < 1 or day_week_start > 7: - day_week_start = 1 - - def _adjust_week(isodate): - if isodate[2] < day_week_start: - return (isodate[0], isodate[1] + 1, isodate[2]) - return isodate - - result = defaultdict(lambda: [0.0, 0.0, 1.0]) - day_hours = defaultdict(float) - week_hours = defaultdict(float) - iso_days = set() - try: - for iso_date, entries in work_data: - iso_date = _adjust_week(iso_date) - for work_type, hours, _ in entries: - self._aggregate_overtime_add_work_type_hours(work_type, hours, iso_date, result, iso_days, day_hours, week_hours) - except RecursionError: - raise UserError(_('RecursionError raised. Ensure you have not overtime loops, you should have an ' - 'end work type that does not have any "overtime" version, and would be considered ' - 'the "highest overtime" work type and rate.')) - - return result - - def _aggregate_overtime_add_work_type_hours(self, work_type, hours, iso_date, working_aggregation, iso_days, day_hours, week_hours): - """ - :param work_type: work type of hours being added - :param hours: hours being added - :param iso_date: date hours were worked - :param working_aggregation: dict of work type hours as they are processed - :param iso_days: set of iso days already seen - :param day_hours: hours worked on iso dates already processed - :param week_hours: hours worked on iso week already processed - :return: - """ - override = work_type.override_for_iso_date(iso_date) - if override: - new_work_type = override.work_type_id - multiplier = override.multiplier - if work_type == new_work_type: - # trivial infinite recursion from override - raise UserError(_('Work type "%s" (id %s) must not have itself as its override work type. ' - 'This occurred due to an override line "%s".', work_type.name, work_type.id, override.name)) - # update the work_type on this step. - work_type = new_work_type - working_aggregation[work_type][2] = multiplier - - week = iso_date[1] - if not self.contract_id.is_overtime_exempt and work_type.overtime_work_type_id and work_type.overtime_type_id: - ot_h_w = work_type.overtime_type_id.hours_per_week - ot_h_d = work_type.overtime_type_id.hours_per_day - - regular_hours = hours - # adjust the hours based on overtime conditions - if ot_h_d and (day_hours[iso_date] + hours) > ot_h_d: - # daily overtime in effect - remaining_hours = max(ot_h_d - day_hours[iso_date], 0.0) - regular_hours = min(remaining_hours, hours) - elif ot_h_w: - # not daily, but weekly limits.... - remaining_hours = max(ot_h_w - week_hours[week], 0.0) - regular_hours = min(remaining_hours, hours) - ot_hours = hours - regular_hours - if regular_hours: - if iso_date not in iso_days: - iso_days.add(iso_date) - working_aggregation[work_type][0] += 1.0 - working_aggregation[work_type][1] += regular_hours - day_hours[iso_date] += regular_hours - week_hours[week] += regular_hours - if ot_hours: - overtime_work_type = work_type.overtime_work_type_id - multiplier = work_type.overtime_type_id.multiplier - override = work_type.overtime_type_id.override_for_iso_date(iso_date) - if work_type == overtime_work_type: - # trivial infinite recursion - raise UserError(_('Work type "%s" (id %s) must not have itself as its next overtime type.', work_type.name, work_type.id)) - if override: - overtime_work_type = override.work_type_id - multiplier = override.multiplier - if work_type == overtime_work_type: - # trivial infinite recursion from override - raise UserError(_('Work type "%s" (id %s) must not have itself as its next overtime type. ' - 'This occurred due to an override "%s" from overtime rules "%s".', - work_type.name, work_type.id, override.name, work_type.overtime_type_id.name)) - # we need to save this because it won't be set once it reenter, we won't know what the original - # overtime multiplier was - working_aggregation[overtime_work_type][2] = multiplier - self._aggregate_overtime_add_work_type_hours(overtime_work_type, ot_hours, iso_date, - working_aggregation, iso_days, day_hours, week_hours) - else: - # No overtime, just needs added to set - if iso_date not in iso_days: - iso_days.add(iso_date) - working_aggregation[work_type][0] += 1.0 - working_aggregation[work_type][1] += hours - day_hours[iso_date] += hours - week_hours[week] += hours - - -class HrPayslipWorkedDays(models.Model): - _inherit = 'hr.payslip.worked_days' - - rate = fields.Float(string='Rate', default=1.0) - - @api.depends('is_paid', 'number_of_hours', 'payslip_id', 'payslip_id.normal_wage', 'payslip_id.sum_worked_hours', 'rate') - def _compute_amount(self): - for worked_days in self: - if not worked_days.contract_id: - worked_days.amount = 0 - continue - if worked_days.payslip_id.wage_type == "hourly": - worked_days.amount = worked_days.payslip_id.contract_id._get_contract_wage(work_type=worked_days.work_entry_type_id) * worked_days.number_of_hours * worked_days.rate if worked_days.is_paid else 0 - else: - worked_days.amount = worked_days.payslip_id.normal_wage * worked_days.number_of_hours / (worked_days.payslip_id.sum_worked_hours or 1) if worked_days.is_paid else 0 diff --git a/hr_payroll_overtime/models/hr_work_entry.py b/hr_payroll_overtime/models/hr_work_entry.py deleted file mode 100644 index d06a3727..00000000 --- a/hr_payroll_overtime/models/hr_work_entry.py +++ /dev/null @@ -1,79 +0,0 @@ -from odoo import api, fields, models, _ -from odoo.exceptions import ValidationError - -from .resource_calendar import WEEKDAY_SELECTION - - -class WorkEntryOverride(models.AbstractModel): - _name = 'hr.work.entry.type.override.abstract' - _order = 'date desc, day_of_week' - - name = fields.Char(string='Description') - work_type_id = fields.Many2one('hr.work.entry.type', string='Override Work Type', required=True, - help='Distinct Work Type for when this applies.') - multiplier = fields.Float(string='Multiplier', - help='Rate for override. E.g. maybe you have "Sunday Pay" at 2.0x') - day_of_week = fields.Selection(WEEKDAY_SELECTION, string='Day of Week') - date = fields.Date(string='Date') - - @api.constrains('day_of_week', 'date') - def _constrain_days(self): - for override in self: - if override.day_of_week and override.date: - raise ValidationError(_('An override should only have a Date OR Day of Week.')) - - def iso_date_applies(self, iso_date): - for override in self: - if override.date and override.date.isocalendar() == iso_date: - return override - if int(override.day_of_week) == iso_date[2]: - return override - - -class HRWorkEntryType(models.Model): - _inherit = 'hr.work.entry.type' - - overtime_work_type_id = fields.Many2one('hr.work.entry.type', string='Overtime Work Type') - overtime_type_id = fields.Many2one('hr.work.entry.overtime.type', string='Overtime Rules') - override_ids = fields.One2many('hr.work.entry.type.override', 'original_type_id', string='Overrides', - help='Override work entry type on payslip.') - - def override_for_iso_date(self, iso_date): - return self.override_ids.iso_date_applies(iso_date) - - -class HRWorkEntryTypeOverride(models.Model): - _name = 'hr.work.entry.type.override' - _inherit = 'hr.work.entry.type.override.abstract' - _description = 'Work Type Override' - - original_type_id = fields.Many2one('hr.work.entry.type', - string='Work Entry Type') - - -class HRWorkEntryOvertime(models.Model): - _name = 'hr.work.entry.overtime.type' - _description = 'Overtime Rules' - - name = fields.Char(string='Name') - hours_per_day = fields.Float(string='Hours/Day', - help='Number of hours worked in a single day to trigger overtime.') - hours_per_week = fields.Float(string='Hours/Week', - help='Number of hours worked in a week to trigger overtime.') - multiplier = fields.Float(string='Multiplier', - help='Rate for when overtime is reached.') - override_ids = fields.One2many('hr.work.entry.overtime.type.override', 'overtime_type_id', - string='Overrides', - help='Override lines with a Date will be considered before Day of Week.') - - def override_for_iso_date(self, iso_date): - return self.override_ids.iso_date_applies(iso_date) - - -class HRWorkEntryOvertimeOverride(models.Model): - _name = 'hr.work.entry.overtime.type.override' - _inherit = 'hr.work.entry.type.override.abstract' - _description = 'Overtime Rule Override' - - overtime_type_id = fields.Many2one('hr.work.entry.overtime.type', - string='Overtime Rules') diff --git a/hr_payroll_overtime/models/resource_calendar.py b/hr_payroll_overtime/models/resource_calendar.py deleted file mode 100644 index 6d63a103..00000000 --- a/hr_payroll_overtime/models/resource_calendar.py +++ /dev/null @@ -1,18 +0,0 @@ -from odoo import fields, models - - -WEEKDAY_SELECTION = [ - ('1', 'Monday'), - ('2', 'Tuesday'), - ('3', 'Wednesday'), - ('4', 'Thursday'), - ('5', 'Friday'), - ('6', 'Saturday'), - ('7', 'Sunday'), -] - - -class ResourceCalendar(models.Model): - _inherit = 'resource.calendar' - - day_week_start = fields.Selection(WEEKDAY_SELECTION, string='Day Week Starts', required=True, default='1') diff --git a/hr_payroll_overtime/security/ir.model.access.csv b/hr_payroll_overtime/security/ir.model.access.csv deleted file mode 100644 index 0b0223eb..00000000 --- a/hr_payroll_overtime/security/ir.model.access.csv +++ /dev/null @@ -1,7 +0,0 @@ -id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -access_hr_work_entry_overtime_type,access_hr_work_entry_overtime_type,model_hr_work_entry_overtime_type,base.group_user,1,0,0,0 -manage_hr_work_entry_overtime_type,manage_hr_work_entry_overtime_type,model_hr_work_entry_overtime_type,hr_payroll.group_hr_payroll_manager,1,1,1,1 -access_hr_work_entry_overtime_type_override,access_hr_work_entry_overtime_type_override,model_hr_work_entry_overtime_type_override,base.group_user,1,0,0,0 -manage_hr_work_entry_overtime_type_override,manage_hr_work_entry_overtime_type_override,model_hr_work_entry_overtime_type_override,hr_payroll.group_hr_payroll_manager,1,1,1,1 -access_hr_work_entry_type_override,access_hr_work_entry_type_override,model_hr_work_entry_type_override,base.group_user,1,0,0,0 -manage_hr_work_entry_type_override,manage_hr_work_entry_type_override,model_hr_work_entry_type_override,hr_payroll.group_hr_payroll_manager,1,1,1,1 diff --git a/hr_payroll_overtime/tests/__init__.py b/hr_payroll_overtime/tests/__init__.py deleted file mode 100644 index 304ffd07..00000000 --- a/hr_payroll_overtime/tests/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from . import test_overtime diff --git a/hr_payroll_overtime/tests/test_overtime.py b/hr_payroll_overtime/tests/test_overtime.py deleted file mode 100644 index bdb60347..00000000 --- a/hr_payroll_overtime/tests/test_overtime.py +++ /dev/null @@ -1,527 +0,0 @@ -from datetime import date - -from odoo.tests import common -from odoo.exceptions import UserError, ValidationError - - -class TestOvertime(common.TransactionCase): - - def setUp(self): - super().setUp() - self.overtime_rules = self.env['hr.work.entry.overtime.type'].create({ - 'name': 'Test', - 'hours_per_week': 40.0, - 'multiplier': 1.5, - }) - self.work_type_overtime = self.env['hr.work.entry.type'].create({ - 'name': 'Test Overtime', - 'code': 'TEST_OT' - }) - self.work_type = self.env['hr.work.entry.type'].create({ - 'name': 'Test', - 'code': 'TEST', - 'overtime_type_id': self.overtime_rules.id, - 'overtime_work_type_id': self.work_type_overtime.id, - }) - self.employee = self.env.ref('hr.employee_hne') - self.contract = self.employee.contract_ids.create({ - 'name': 'testing contract', - 'employee_id': self.employee.id, - 'date_start': '2020-01-01', - 'wage': 2000.0, - }) - self.payslip = self.env['hr.payslip'].create({ - 'name': 'test slip', - 'employee_id': self.employee.id, - 'contract_id': self.contract.id, - 'date_from': '2020-06-11', - 'date_to': '2020-06-15', - }) - - def test_02_overtime_aggregation(self): - # 38 hours in 1 week - work_data = [ - ((2020, 24, 1), [ - (self.work_type, 4.0, None), - (self.work_type, 4.0, None), - ]), - ((2020, 24, 2), [ - (self.work_type, 4.0, None), - (self.work_type, 6.0, None), - ]), - ((2020, 24, 3), [ - (self.work_type, 4.0, None), - (self.work_type, 6.0, None), - ]), - ((2020, 24, 4), [ - (self.work_type, 4.0, None), - (self.work_type, 6.0, None), - ]), - ] - result_data = self.payslip._aggregate_overtime(work_data) - self.assertTrue(self.work_type in result_data) - self.assertTrue(self.work_type_overtime not in result_data) - self.assertEqual(result_data[self.work_type][0], 4) - self.assertEqual(result_data[self.work_type][1], 38.0) - - # 48 hours in 1 week - work_data += [ - ((2020, 24, 5), [ - (self.work_type, 10.0, None), - ]), - ] - result_data = self.payslip._aggregate_overtime(work_data) - self.assertTrue(self.work_type in result_data) - self.assertEqual(result_data[self.work_type][0], 5) - self.assertEqual(result_data[self.work_type][1], 40.0) - self.assertTrue(self.work_type_overtime in result_data) - self.assertEqual(result_data[self.work_type_overtime][0], 0) - self.assertEqual(result_data[self.work_type_overtime][1], 8.0) - - # 52 hours in 1 week - work_data += [ - ((2020, 24, 6), [ - (self.work_type, 4.0, None), - ]), - ] - result_data = self.payslip._aggregate_overtime(work_data) - self.assertTrue(self.work_type in result_data) - self.assertEqual(result_data[self.work_type][0], 5) - self.assertEqual(result_data[self.work_type][1], 40.0) - self.assertTrue(self.work_type_overtime in result_data) - self.assertEqual(result_data[self.work_type_overtime][0], 1) - self.assertEqual(result_data[self.work_type_overtime][1], 12.0) - - # reset and make two weeks - # 38 hours in 1 week x 2 - input_work_data = [ - ((2020, 24, 1), [ - (self.work_type, 4.0, None), - (self.work_type, 4.0, None), - ]), - ((2020, 24, 2), [ - (self.work_type, 4.0, None), - (self.work_type, 6.0, None), - ]), - ((2020, 24, 3), [ - (self.work_type, 4.0, None), - (self.work_type, 6.0, None), - ]), - ((2020, 24, 4), [ - (self.work_type, 4.0, None), - (self.work_type, 6.0, None), - ]), - ] - work_data = [] - for data in input_work_data: - work_data.append(data) - work_data.append(((data[0][0], data[0][1]+1, data[0][2]), data[1])) - - result_data = self.payslip._aggregate_overtime(work_data) - self.assertTrue(self.work_type in result_data) - self.assertTrue(self.work_type_overtime not in result_data) - self.assertEqual(result_data[self.work_type][0], 8) - self.assertEqual(result_data[self.work_type][1], 76.0) - - # 48 hours in 1 week, 38 hours in 1 week - work_data += [ - ((2020, 24, 5), [ - (self.work_type, 4.0, None), - (self.work_type, 6.0, None), - ]), - ] - result_data = self.payslip._aggregate_overtime(work_data) - self.assertTrue(self.work_type in result_data) - self.assertEqual(result_data[self.work_type][0], 9) - self.assertEqual(result_data[self.work_type][1], 78.0) - self.assertTrue(self.work_type_overtime in result_data) - self.assertEqual(result_data[self.work_type_overtime][0], 0) - self.assertEqual(result_data[self.work_type_overtime][1], 8.0) - - # 52 hours in 1 week, 38 hours in 1 week - work_data += [ - ((2020, 24, 6), [ - (self.work_type, 4.0, None), - ]), - ] - result_data = self.payslip._aggregate_overtime(work_data) - self.assertTrue(self.work_type in result_data) - self.assertEqual(result_data[self.work_type][0], 9) - self.assertEqual(result_data[self.work_type][1], 78.0) - self.assertTrue(self.work_type_overtime in result_data) - self.assertEqual(result_data[self.work_type_overtime][0], 1) - self.assertEqual(result_data[self.work_type_overtime][1], 12.0) - - def test_03_overtime_aggregation_week_start(self): - self.employee.resource_calendar_id.day_week_start = '7' - self.test_02_overtime_aggregation() - - def test_10_overtime_aggregation_daily(self): - self.overtime_rules.hours_per_day = 8.0 - self.overtime_rules.multiplier = 1.5 - # 38 hours in 1 week - work_data = [ - ((2020, 24, 1), [ - (self.work_type, 4.0, None), - (self.work_type, 4.0, None), - ]), - ((2020, 24, 2), [ - (self.work_type, 4.0, None), - (self.work_type, 6.0, None), - ]), - ((2020, 24, 3), [ - (self.work_type, 4.0, None), - (self.work_type, 6.0, None), - ]), - ((2020, 24, 4), [ - (self.work_type, 4.0, None), - (self.work_type, 6.0, None), - ]), - ] - result_data = self.payslip._aggregate_overtime(work_data) - self.assertTrue(self.work_type in result_data) - self.assertEqual(result_data[self.work_type][0], 4) - self.assertEqual(result_data[self.work_type][1], 32.0) - self.assertTrue(self.work_type_overtime in result_data) - self.assertEqual(result_data[self.work_type_overtime][0], 0) - self.assertEqual(result_data[self.work_type_overtime][1], 6.0) - - # 48 hours in 1 week - work_data += [ - ((2020, 24, 5), [ - (self.work_type, 10.0, None), - ]), - ] - result_data = self.payslip._aggregate_overtime(work_data) - self.assertTrue(self.work_type in result_data) - self.assertEqual(result_data[self.work_type][0], 5) - self.assertEqual(result_data[self.work_type][1], 40.0) - self.assertTrue(self.work_type_overtime in result_data) - self.assertEqual(result_data[self.work_type_overtime][0], 0) - self.assertEqual(result_data[self.work_type_overtime][1], 8.0) - - # 52 hours in 1 week - work_data += [ - ((2020, 24, 6), [ - (self.work_type, 4.0, None), - ]), - ] - result_data = self.payslip._aggregate_overtime(work_data) - self.assertTrue(self.work_type in result_data) - self.assertEqual(result_data[self.work_type][0], 5) - self.assertEqual(result_data[self.work_type][1], 40.0) - self.assertTrue(self.work_type_overtime in result_data) - self.assertEqual(result_data[self.work_type_overtime][0], 1) - self.assertEqual(result_data[self.work_type_overtime][1], 12.0) - - # reset and make two weeks - # 38 hours in 1 week x 2 - input_work_data = [ - ((2020, 24, 1), [ - (self.work_type, 4.0, None), - (self.work_type, 4.0, None), - ]), - ((2020, 24, 2), [ - (self.work_type, 4.0, None), - (self.work_type, 6.0, None), - ]), - ((2020, 24, 3), [ - (self.work_type, 4.0, None), - (self.work_type, 6.0, None), - ]), - ((2020, 24, 4), [ - (self.work_type, 4.0, None), - (self.work_type, 6.0, None), - ]), - ] - work_data = [] - for data in input_work_data: - work_data.append(data) - work_data.append(((data[0][0], data[0][1]+1, data[0][2]), data[1])) - - result_data = self.payslip._aggregate_overtime(work_data) - self.assertTrue(self.work_type in result_data) - self.assertTrue(self.work_type_overtime in result_data) - self.assertEqual(result_data[self.work_type][0], 8) - self.assertEqual(result_data[self.work_type][1], 64.0) - self.assertEqual(result_data[self.work_type_overtime][0], 0) - self.assertEqual(result_data[self.work_type_overtime][1], 12.0) - - # 48 hours in 1 week, 38 hours in 1 week - work_data += [ - ((2020, 24, 5), [ - (self.work_type, 4.0, None), - (self.work_type, 6.0, None), - ]), - ] - result_data = self.payslip._aggregate_overtime(work_data) - self.assertTrue(self.work_type in result_data) - self.assertEqual(result_data[self.work_type][0], 9) - self.assertEqual(result_data[self.work_type][1], 70.0) - self.assertTrue(self.work_type_overtime in result_data) - self.assertEqual(result_data[self.work_type_overtime][0], 0) - self.assertEqual(result_data[self.work_type_overtime][1], 16.0) - - # 52 hours in 1 week, 38 hours in 1 week - work_data += [ - ((2020, 24, 6), [ - (self.work_type, 4.0, None), - ]), - ] - result_data = self.payslip._aggregate_overtime(work_data) - self.assertTrue(self.work_type in result_data) - self.assertEqual(result_data[self.work_type][0], 9) - self.assertEqual(result_data[self.work_type][1], 70.0) - self.assertTrue(self.work_type_overtime in result_data) - self.assertEqual(result_data[self.work_type_overtime][0], 1) - self.assertEqual(result_data[self.work_type_overtime][1], 20.0) - - def test_11_overtime_aggregation_daily_week_start(self): - self.employee.resource_calendar_id.day_week_start = '7' - self.test_10_overtime_aggregation_daily() - - def test_12_recursive_daily(self): - # recursive will use a second overtime - self.work_type_overtime2 = self.env['hr.work.entry.type'].create({ - 'name': 'Test Overtime 2', - 'code': 'TEST_OT2' - }) - self.overtime_rules2 = self.env['hr.work.entry.overtime.type'].create({ - 'name': 'Test2', - 'hours_per_week': 999.0, - 'hours_per_day': 12.0, - 'multiplier': 2.0, - }) - self.overtime_rules.hours_per_day = 8.0 - self.overtime_rules.multiplier = 1.5 - self.work_type_overtime.overtime_type_id = self.overtime_rules2 - self.work_type_overtime.overtime_work_type_id = self.work_type_overtime2 - - work_data = [ - ((2020, 24, 1), [ - # regular day - (self.work_type, 4.0, None), - (self.work_type, 4.0, None), - ]), - ((2020, 24, 2), [ - # 2hr overtime - (self.work_type, 4.0, None), - (self.work_type, 6.0, None), - ]), - ((2020, 24, 3), [ - # 4hr overtime - (self.work_type, 6.0, None), - (self.work_type, 6.0, None), - ]), - ((2020, 24, 4), [ - # 4hr overtime - # 2hr overtime2 - (self.work_type, 6.0, None), - (self.work_type, 8.0, None), - ]), - ] - - result_data = self.payslip._aggregate_overtime(work_data) - self.assertTrue(self.work_type in result_data) - self.assertEqual(result_data[self.work_type][0], 4) - self.assertEqual(result_data[self.work_type][1], 32.0) - self.assertTrue(self.work_type_overtime in result_data) - self.assertEqual(result_data[self.work_type_overtime][0], 0) - self.assertEqual(result_data[self.work_type_overtime][1], 10.0) - self.assertTrue(self.work_type_overtime2 in result_data) - self.assertEqual(result_data[self.work_type_overtime2][0], 0) - self.assertEqual(result_data[self.work_type_overtime2][1], 2.0) - - def test_13_recursive_infinite_trivial(self): - # recursive should will use a second overtime, but not this time! - self.overtime_rules.hours_per_day = 8.0 - self.overtime_rules.multiplier = 1.5 - self.work_type.overtime_type_id = self.overtime_rules - # overtime goes to itself - self.work_type.overtime_work_type_id = self.work_type - - work_data = [ - ((2020, 24, 2), [ - # 2hr overtime - (self.work_type, 4.0, None), - (self.work_type, 6.0, None), - ]), - ] - - with self.assertRaises(UserError): - result_data = self.payslip._aggregate_overtime(work_data) - - def test_14_recursive_infinite_loop(self): - # recursive will use a second overtime, but not this time! - self.overtime_rules.hours_per_day = 8.0 - self.overtime_rules.multiplier = 1.5 - self.work_type_overtime.overtime_type_id = self.overtime_rules - # overtime goes back to worktype - self.work_type_overtime.overtime_work_type_id = self.work_type - - work_data = [ - ((2020, 24, 2), [ - # 2hr overtime - (self.work_type, 4.0, None), - (self.work_type, 6.0, None), - ]), - ] - - with self.assertRaises(UserError): - result_data = self.payslip._aggregate_overtime(work_data) - - def test_15_override_day_of_week(self): - iso_date = (2020, 24, 1) - self.overtime_rules.hours_per_day = 8.0 - self.overtime_rules.multiplier = 1.5 - work_data = [ - (iso_date, [ - (self.work_type, 4.0, None), - (self.work_type, 6.0, None), - ]), - ] - - result_data = self.payslip._aggregate_overtime(work_data) - self.assertTrue(self.work_type in result_data) - self.assertEqual(result_data[self.work_type][0], 1) - self.assertEqual(result_data[self.work_type][1], 8.0) - self.assertTrue(self.work_type_overtime in result_data) - self.assertEqual(result_data[self.work_type_overtime][0], 0) - self.assertEqual(result_data[self.work_type_overtime][1], 2.0) - self.assertEqual(result_data[self.work_type_overtime][2], 1.5) - - - # Now lets make an override line - self.overtime_rules.write({ - 'override_ids': [(0, 0, { - 'name': 'Day 1 Override', - 'multiplier': 2.0, - 'day_of_week': str(iso_date[2]), - 'work_type_id': self.work_type_overtime.id, # Note that this wouldn't be good in practice - })] - }) - result_data = self.payslip._aggregate_overtime(work_data) - self.assertTrue(self.work_type in result_data) - self.assertEqual(result_data[self.work_type][0], 1) - self.assertEqual(result_data[self.work_type][1], 8.0) - self.assertTrue(self.work_type_overtime in result_data) - self.assertEqual(result_data[self.work_type_overtime][0], 0) - self.assertEqual(result_data[self.work_type_overtime][1], 2.0) - self.assertEqual(result_data[self.work_type_overtime][2], 2.0) # rate 2x - - def test_16_override_date(self): - iso_date = (2020, 24, 1) - self.overtime_rules.hours_per_day = 8.0 - self.overtime_rules.multiplier = 1.5 - work_data = [ - (iso_date, [ - (self.work_type, 4.0, None), - (self.work_type, 6.0, None), - ]), - ] - - result_data = self.payslip._aggregate_overtime(work_data) - self.assertTrue(self.work_type in result_data) - self.assertEqual(result_data[self.work_type][0], 1) - self.assertEqual(result_data[self.work_type][1], 8.0) - self.assertTrue(self.work_type_overtime in result_data) - self.assertEqual(result_data[self.work_type_overtime][0], 0) - self.assertEqual(result_data[self.work_type_overtime][1], 2.0) - self.assertEqual(result_data[self.work_type_overtime][2], 1.5) - - # Now lets make a specific date override - self.overtime_rules.write({ - 'override_ids': [(0, 0, { - 'name': 'Day (2020, 24, 1) Override', - 'multiplier': 3.0, - 'date': date(2020, 6, 8), # date.fromisocalendar(*iso_date), - 'work_type_id': self.work_type_overtime.id, # Note that this wouldn't be good in practice - })] - }) - self.overtime_rules.flush() - result_data = self.payslip._aggregate_overtime(work_data) - self.assertTrue(self.work_type in result_data) - self.assertEqual(result_data[self.work_type][0], 1) - self.assertEqual(result_data[self.work_type][1], 8.0) - self.assertTrue(self.work_type_overtime in result_data) - self.assertEqual(result_data[self.work_type_overtime][0], 0) - self.assertEqual(result_data[self.work_type_overtime][1], 2.0) - self.assertEqual(result_data[self.work_type_overtime][2], 3.0) # rate 3x - - def test_17_override_config(self): - with self.assertRaises(ValidationError): - self.overtime_rules.write({ - 'override_ids': [(0, 0, { - 'name': 'Day (2020, 24, 1) Override', - 'multiplier': 3.0, - # cannot have both date and day_of_week - 'date': date(2020, 6, 8), - 'day_of_week': '1', - 'work_type_id': self.work_type_overtime.id, # Note that this wouldn't be good in practice - })] - }) - - def test_18_override_day_of_week_on_work_type(self): - iso_date = (2020, 24, 1) - iso_date2 = (2020, 24, 2) - - work_data = [ - (iso_date, [ - (self.work_type, 4.0, None), - ]), - (iso_date2, [ - (self.work_type, 4.0, None), - ]), - ] - - result_data = self.payslip._aggregate_overtime(work_data) - self.assertTrue(self.work_type in result_data) - self.assertEqual(result_data[self.work_type][0], 2) - self.assertEqual(result_data[self.work_type][1], 8.0) - - # Now lets make an override line - test_multiplier = 3.0 - self.work_type.write({ - 'override_ids': [(0, 0, { - 'name': 'Day 2 Override', - 'multiplier': test_multiplier, - 'day_of_week': str(iso_date[2]), - 'work_type_id': self.work_type_overtime.id, # Note that this wouldn't be good in practice - })] - }) - result_data = self.payslip._aggregate_overtime(work_data) - self.assertTrue(self.work_type in result_data) - self.assertEqual(result_data[self.work_type][0], 1) - self.assertEqual(result_data[self.work_type][1], 4.0) - self.assertTrue(self.work_type_overtime in result_data) - self.assertEqual(result_data[self.work_type_overtime][0], 1) - self.assertEqual(result_data[self.work_type_overtime][1], 4.0) - self.assertEqual(result_data[self.work_type_overtime][2], test_multiplier) - - def test_19_overtime_exempt(self): - iso_date = (2020, 24, 1) - self.overtime_rules.hours_per_day = 8.0 - work_data = [ - (iso_date, [ - (self.work_type, 4.0, None), - (self.work_type, 6.0, None), - ]), - ] - - result_data = self.payslip._aggregate_overtime(work_data) - self.assertTrue(self.work_type in result_data) - self.assertEqual(result_data[self.work_type][0], 1) - self.assertEqual(result_data[self.work_type][1], 8.0) - self.assertTrue(self.work_type_overtime in result_data) - self.assertEqual(result_data[self.work_type_overtime][0], 0) - self.assertEqual(result_data[self.work_type_overtime][1], 2.0) - self.assertEqual(result_data[self.work_type_overtime][2], 1.5) - - self.payslip.contract_id.is_overtime_exempt = True - self.assertTrue(self.payslip.contract_id) - self.assertTrue(self.payslip.contract_id.is_overtime_exempt) - result_data = self.payslip._aggregate_overtime(work_data) - self.assertTrue(self.work_type in result_data) - self.assertEqual(result_data[self.work_type][0], 1) - self.assertEqual(result_data[self.work_type][1], 10.0) - self.assertTrue(self.work_type_overtime not in result_data) diff --git a/hr_payroll_overtime/views/hr_contract_views.xml b/hr_payroll_overtime/views/hr_contract_views.xml deleted file mode 100644 index 0e6b9a61..00000000 --- a/hr_payroll_overtime/views/hr_contract_views.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - hr.contract.form.inherit - hr.contract - - - - - - - - - diff --git a/hr_payroll_overtime/views/hr_payslip_views.xml b/hr_payroll_overtime/views/hr_payslip_views.xml deleted file mode 100644 index 7b5a2601..00000000 --- a/hr_payroll_overtime/views/hr_payslip_views.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - hr.payslip.form.inherit - hr.payslip - - - - - - - - - - - - diff --git a/hr_payroll_overtime/views/hr_work_entry_views.xml b/hr_payroll_overtime/views/hr_work_entry_views.xml deleted file mode 100644 index 43ffd02a..00000000 --- a/hr_payroll_overtime/views/hr_work_entry_views.xml +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - hr.work.entry.type.form.inherit - hr.work.entry.type - - - - - - - - - - - - - - - - - - - - - - - - hr.work.entry.overtime.type.tree - hr.work.entry.overtime.type - - - - - - - - - - - - hr.work.entry.overtime.type.form - hr.work.entry.overtime.type - -
- - - - - - - - - - - - - - - - - - - - - -
-
-
- - - hr.work.entry.overtime.type.search - hr.work.entry.overtime.type - - - - - - - - - Overtime Rules - hr.work.entry.overtime.type - tree,form - -

- No Overtime Rules -

-
-
- - - -
\ No newline at end of file diff --git a/hr_payroll_overtime/views/resource_calendar_views.xml b/hr_payroll_overtime/views/resource_calendar_views.xml deleted file mode 100644 index 444dcc16..00000000 --- a/hr_payroll_overtime/views/resource_calendar_views.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - resource.calendar.form.inherit - resource.calendar - - - - - - - - - \ No newline at end of file