diff --git a/hr_attendance_modification_tracking/README.rst b/hr_attendance_modification_tracking/README.rst new file mode 100644 index 00000000..d388c34b --- /dev/null +++ b/hr_attendance_modification_tracking/README.rst @@ -0,0 +1,100 @@ +==================================== +HR Attendance Modification Tracking. +==================================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:035cfbd2951314e08e735a434f8d20ee906715dc18a4833da2042f2689b1f83a + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fhr--attendance-lightgray.png?logo=github + :target: https://github.com/OCA/hr-attendance/tree/17.0/hr_attendance_modification_tracking + :alt: OCA/hr-attendance +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/hr-attendance-17-0/hr-attendance-17-0-hr_attendance_modification_tracking + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/hr-attendance&target_branch=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Attendance changes will now be registered in the chatter. This will help +prevent cheating in check-in or check-out time. List and form views also +include this change information. + +Use cases: + +- Attendances created from kiosk or check-in/check-out screens, are + created as automatic. If their check-in or check-out dates are + modified by any user, attendances are checked as 'Manually changed'. +- Attendances created from form view will apply a 60 seconds tolerance + between entered and real times. If this tolerance is surpassed, + attendances are checked as 'Manually changed'. + +Note: + +- Attendances already created won't be checked automatically on + installation since it could take a large amount of time. If this is + wanted it will be necessary to do it manually later. + +**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 to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Creu Blanca +* Landoo + +Contributors +------------ + +- Jaime Arroyo +- Enric Tobella +- Saran Lim. +- Nagore Salaberria +- Josean Soroa +- Aritz Olea +- `Heliconia Solutions Pvt. Ltd. `__ + +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/hr-attendance `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/hr_attendance_modification_tracking/__init__.py b/hr_attendance_modification_tracking/__init__.py new file mode 100644 index 00000000..4f088955 --- /dev/null +++ b/hr_attendance_modification_tracking/__init__.py @@ -0,0 +1,4 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import models +from .hooks import pre_init_hook diff --git a/hr_attendance_modification_tracking/__manifest__.py b/hr_attendance_modification_tracking/__manifest__.py new file mode 100644 index 00000000..f4827547 --- /dev/null +++ b/hr_attendance_modification_tracking/__manifest__.py @@ -0,0 +1,17 @@ +# Copyright 2019 Creu Blanca +# Copyright 2020 Landoo +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "HR Attendance Modification Tracking.", + "summary": """ + Attendance changes will now be registered in the chatter.""", + "version": "17.0.1.0.0", + "license": "AGPL-3", + "author": "Creu Blanca, Landoo, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/hr-attendance", + "depends": ["hr_attendance"], + "data": ["views/hr_attendance_view.xml"], + "pre_init_hook": "pre_init_hook", + "installable": True, +} diff --git a/hr_attendance_modification_tracking/hooks.py b/hr_attendance_modification_tracking/hooks.py new file mode 100644 index 00000000..7ec355e7 --- /dev/null +++ b/hr_attendance_modification_tracking/hooks.py @@ -0,0 +1,11 @@ +# Copyright 2020 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +def pre_init_hook(env): + env.cr.execute( + """ + ALTER TABLE hr_attendance + ADD COLUMN IF NOT EXISTS time_changed_manually BOOLEAN + """ + ) diff --git a/hr_attendance_modification_tracking/i18n/ca.po b/hr_attendance_modification_tracking/i18n/ca.po new file mode 100644 index 00000000..6a606278 --- /dev/null +++ b/hr_attendance_modification_tracking/i18n/ca.po @@ -0,0 +1,153 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_attendance_modification_tracking +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-02-05 22:13+0000\n" +"Last-Translator: Carles Antoli \n" +"Language-Team: none\n" +"Language: ca\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_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model,name:hr_attendance_modification_tracking.model_hr_attendance +msgid "Attendance" +msgstr "Assistència" + +#. module: hr_attendance_modification_tracking +#: model:ir.model,name:hr_attendance_modification_tracking.model_hr_employee_base +msgid "Basic Employee" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__check_in +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee__last_check_in +msgid "Check In" +msgstr "Entrada" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__check_out +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee__last_check_out +msgid "Check Out" +msgstr "Sortida" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__employee_id +msgid "Employee" +msgstr "Empleat" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__has_message +msgid "Has Message" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__message_needaction +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee_base__last_check_in +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee_public__last_check_in +msgid "Last Check In" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee_base__last_check_out +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee_public__last_check_out +msgid "Last Check Out" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_main_attachment_id +msgid "Main Attachment" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_ids +msgid "Messages" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_has_error_counter +msgid "Number of errors" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model_terms:ir.ui.view,arch_db:hr_attendance_modification_tracking.hr_attendance_view_tree_open +msgid "Open" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__time_changed_manually +msgid "" +"This attendance has been manually changed by user. If attendance is created " +"from form view, a 60 seconds tolerance will be applied." +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model_terms:ir.ui.view,arch_db:hr_attendance_modification_tracking.hr_attendance_view_search +msgid "Time Changed" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__time_changed_manually +msgid "Time changed" +msgstr "" diff --git a/hr_attendance_modification_tracking/i18n/ca_ES.po b/hr_attendance_modification_tracking/i18n/ca_ES.po new file mode 100644 index 00000000..ce8cd7a8 --- /dev/null +++ b/hr_attendance_modification_tracking/i18n/ca_ES.po @@ -0,0 +1,151 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_attendance_modification_tracking +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: ca_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" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model,name:hr_attendance_modification_tracking.model_hr_attendance +msgid "Attendance" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model,name:hr_attendance_modification_tracking.model_hr_employee_base +msgid "Basic Employee" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__check_in +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee__last_check_in +msgid "Check In" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__check_out +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee__last_check_out +msgid "Check Out" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__employee_id +msgid "Employee" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__has_message +msgid "Has Message" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__message_needaction +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee_base__last_check_in +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee_public__last_check_in +msgid "Last Check In" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee_base__last_check_out +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee_public__last_check_out +msgid "Last Check Out" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_main_attachment_id +msgid "Main Attachment" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_ids +msgid "Messages" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_has_error_counter +msgid "Number of errors" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model_terms:ir.ui.view,arch_db:hr_attendance_modification_tracking.hr_attendance_view_tree_open +msgid "Open" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__time_changed_manually +msgid "" +"This attendance has been manually changed by user. If attendance is created " +"from form view, a 60 seconds tolerance will be applied." +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model_terms:ir.ui.view,arch_db:hr_attendance_modification_tracking.hr_attendance_view_search +msgid "Time Changed" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__time_changed_manually +msgid "Time changed" +msgstr "" diff --git a/hr_attendance_modification_tracking/i18n/es.po b/hr_attendance_modification_tracking/i18n/es.po new file mode 100644 index 00000000..2f62e926 --- /dev/null +++ b/hr_attendance_modification_tracking/i18n/es.po @@ -0,0 +1,163 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_attendance_modification_tracking +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-03-01 00:00+0000\n" +"Last-Translator: Ivorra78 \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 4.17\n" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_needaction +msgid "Action Needed" +msgstr "Acción Necesaria" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_attachment_count +msgid "Attachment Count" +msgstr "Conteo de Anexos" + +#. module: hr_attendance_modification_tracking +#: model:ir.model,name:hr_attendance_modification_tracking.model_hr_attendance +msgid "Attendance" +msgstr "Asistencia" + +#. module: hr_attendance_modification_tracking +#: model:ir.model,name:hr_attendance_modification_tracking.model_hr_employee_base +msgid "Basic Employee" +msgstr "Empleado Básico" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__check_in +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee__last_check_in +msgid "Check In" +msgstr "Entrada" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__check_out +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee__last_check_out +msgid "Check Out" +msgstr "Salida" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__employee_id +msgid "Employee" +msgstr "Empleado" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_follower_ids +msgid "Followers" +msgstr "Seguidores/as" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_partner_ids +msgid "Followers (Partners)" +msgstr "Seguidores/as (Socios)" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__has_message +msgid "Has Message" +msgstr "Tiene Mensaje" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__message_needaction +msgid "If checked, new messages require your attention." +msgstr "Si están marcados, nuevos mensajes requieren su atención." + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "Si está seleccionado, algunos mensajes tienen un error de entrega." + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_is_follower +msgid "Is Follower" +msgstr "Es seguidor/a" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee_base__last_check_in +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee_public__last_check_in +msgid "Last Check In" +msgstr "Último Registro de Entrada" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee_base__last_check_out +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee_public__last_check_out +msgid "Last Check Out" +msgstr "Último Registro de Salida" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_main_attachment_id +msgid "Main Attachment" +msgstr "Adjunto Principal" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_has_error +msgid "Message Delivery error" +msgstr "Error de Entrega de Mensaje" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_ids +msgid "Messages" +msgstr "Mensajes" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_needaction_counter +msgid "Number of Actions" +msgstr "Número de Acciones" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_has_error_counter +msgid "Number of errors" +msgstr "Número de Errores" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "Número de mensajes que requieren una acción" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "Número de mensajes con error de entrega" + +#. module: hr_attendance_modification_tracking +#: model_terms:ir.ui.view,arch_db:hr_attendance_modification_tracking.hr_attendance_view_tree_open +msgid "Open" +msgstr "Abierto" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__time_changed_manually +msgid "" +"This attendance has been manually changed by user. If attendance is created " +"from form view, a 60 seconds tolerance will be applied." +msgstr "" +"Esta asistencia ha sido modificada manualmente por el usuario. Si la " +"asistencia se crea desde la vista de formulario, se aplicará una tolerancia " +"de 60 segundos." + +#. module: hr_attendance_modification_tracking +#: model_terms:ir.ui.view,arch_db:hr_attendance_modification_tracking.hr_attendance_view_search +msgid "Time Changed" +msgstr "Tiempo editado" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__time_changed_manually +msgid "Time changed" +msgstr "Tiempo editado" + +#, python-format +#~ msgid "" +#~ "It is not possible to register a new entry because there is already an " +#~ "existing one" +#~ msgstr "" +#~ "No es posible registrar entrada de nuevo porque ya hay una existente" diff --git a/hr_attendance_modification_tracking/i18n/fr.po b/hr_attendance_modification_tracking/i18n/fr.po new file mode 100644 index 00000000..156512f7 --- /dev/null +++ b/hr_attendance_modification_tracking/i18n/fr.po @@ -0,0 +1,162 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_attendance_modification_tracking +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2021-12-20 23:39+0000\n" +"Last-Translator: Pierre Verkest \n" +"Language-Team: none\n" +"Language: fr\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.3.2\n" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_needaction +msgid "Action Needed" +msgstr "Action requise" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_attachment_count +msgid "Attachment Count" +msgstr "Nombre de pièces jointes" + +#. module: hr_attendance_modification_tracking +#: model:ir.model,name:hr_attendance_modification_tracking.model_hr_attendance +msgid "Attendance" +msgstr "Présence" + +#. module: hr_attendance_modification_tracking +#: model:ir.model,name:hr_attendance_modification_tracking.model_hr_employee_base +msgid "Basic Employee" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__check_in +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee__last_check_in +msgid "Check In" +msgstr "Arrivée" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__check_out +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee__last_check_out +msgid "Check Out" +msgstr "Départ" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__employee_id +msgid "Employee" +msgstr "Employé" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__has_message +msgid "Has Message" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__message_needaction +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee_base__last_check_in +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee_public__last_check_in +msgid "Last Check In" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee_base__last_check_out +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee_public__last_check_out +msgid "Last Check Out" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_main_attachment_id +msgid "Main Attachment" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_ids +msgid "Messages" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_has_error_counter +msgid "Number of errors" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model_terms:ir.ui.view,arch_db:hr_attendance_modification_tracking.hr_attendance_view_tree_open +msgid "Open" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__time_changed_manually +msgid "" +"This attendance has been manually changed by user. If attendance is created " +"from form view, a 60 seconds tolerance will be applied." +msgstr "" +"Cette ligne de présence a été modifié manuellement par un utilisateur. Si la " +"présence est créé depuis la vue formulaire, une tolérance de 60 secondes est " +"utilisé." + +#. module: hr_attendance_modification_tracking +#: model_terms:ir.ui.view,arch_db:hr_attendance_modification_tracking.hr_attendance_view_search +msgid "Time Changed" +msgstr "Heure modifiée" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__time_changed_manually +msgid "Time changed" +msgstr "Heure modifiée" + +#~ msgid "Display Name" +#~ msgstr "Libellé" + +#~ msgid "Last Modified on" +#~ msgstr "Dernière modification le" diff --git a/hr_attendance_modification_tracking/i18n/hr_attendance_modification_tracking.pot b/hr_attendance_modification_tracking/i18n/hr_attendance_modification_tracking.pot new file mode 100644 index 00000000..5a7e81ec --- /dev/null +++ b/hr_attendance_modification_tracking/i18n/hr_attendance_modification_tracking.pot @@ -0,0 +1,150 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_attendance_modification_tracking +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.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_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model,name:hr_attendance_modification_tracking.model_hr_attendance +msgid "Attendance" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model,name:hr_attendance_modification_tracking.model_hr_employee_base +msgid "Basic Employee" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__check_in +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee__last_check_in +msgid "Check In" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__check_out +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee__last_check_out +msgid "Check Out" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__employee_id +msgid "Employee" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__has_message +msgid "Has Message" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__message_needaction +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee_base__last_check_in +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee_public__last_check_in +msgid "Last Check In" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee_base__last_check_out +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee_public__last_check_out +msgid "Last Check Out" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_main_attachment_id +msgid "Main Attachment" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_ids +msgid "Messages" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_has_error_counter +msgid "Number of errors" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model_terms:ir.ui.view,arch_db:hr_attendance_modification_tracking.hr_attendance_view_tree_open +msgid "Open" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__time_changed_manually +msgid "" +"This attendance has been manually changed by user. If attendance is created " +"from form view, a 60 seconds tolerance will be applied." +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model_terms:ir.ui.view,arch_db:hr_attendance_modification_tracking.hr_attendance_view_search +msgid "Time Changed" +msgstr "" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__time_changed_manually +msgid "Time changed" +msgstr "" diff --git a/hr_attendance_modification_tracking/i18n/it.po b/hr_attendance_modification_tracking/i18n/it.po new file mode 100644 index 00000000..3bd85ee7 --- /dev/null +++ b/hr_attendance_modification_tracking/i18n/it.po @@ -0,0 +1,182 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_attendance_modification_tracking +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-06-06 21:49+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_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_needaction +msgid "Action Needed" +msgstr "Azione richiesta" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_attachment_count +msgid "Attachment Count" +msgstr "Numero allegati" + +#. module: hr_attendance_modification_tracking +#: model:ir.model,name:hr_attendance_modification_tracking.model_hr_attendance +msgid "Attendance" +msgstr "Presenza" + +#. module: hr_attendance_modification_tracking +#: model:ir.model,name:hr_attendance_modification_tracking.model_hr_employee_base +msgid "Basic Employee" +msgstr "Dipendente base" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__check_in +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee__last_check_in +msgid "Check In" +msgstr "Check-in" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__check_out +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee__last_check_out +msgid "Check Out" +msgstr "Check-out" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__employee_id +msgid "Employee" +msgstr "Dipendente" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_follower_ids +msgid "Followers" +msgstr "Seguito da" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_partner_ids +msgid "Followers (Partners)" +msgstr "Seguito da (partner)" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__has_message +msgid "Has Message" +msgstr "Ha un messaggio" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__message_needaction +msgid "If checked, new messages require your attention." +msgstr "Se selezionata, nuovi messaggi richiedono attenzione." + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "Se selezionata, alcuni messaggi hanno un errore di consegna." + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_is_follower +msgid "Is Follower" +msgstr "Segue" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee_base__last_check_in +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee_public__last_check_in +msgid "Last Check In" +msgstr "Ultimo check-in" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee_base__last_check_out +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_employee_public__last_check_out +msgid "Last Check Out" +msgstr "Ultimo check-out" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_main_attachment_id +msgid "Main Attachment" +msgstr "Allegato principale" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_has_error +msgid "Message Delivery error" +msgstr "Errore di consegna messaggio" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_ids +msgid "Messages" +msgstr "Messaggi" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_needaction_counter +msgid "Number of Actions" +msgstr "Numero di azioni" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_has_error_counter +msgid "Number of errors" +msgstr "Numero di errori" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "Numero di messaggi che richiedono un'azione" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "Numero di messaggi con errore di consegna" + +#. module: hr_attendance_modification_tracking +#: model_terms:ir.ui.view,arch_db:hr_attendance_modification_tracking.hr_attendance_view_tree_open +msgid "Open" +msgstr "Apri" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,help:hr_attendance_modification_tracking.field_hr_attendance__time_changed_manually +msgid "" +"This attendance has been manually changed by user. If attendance is created " +"from form view, a 60 seconds tolerance will be applied." +msgstr "" +"Questa presenza è stata modificata manualmente da un utente. Se la presenza " +"è creata da una vista scheda, sarà applicata una tolleranza di 60 secondi." + +#. module: hr_attendance_modification_tracking +#: model_terms:ir.ui.view,arch_db:hr_attendance_modification_tracking.hr_attendance_view_search +msgid "Time Changed" +msgstr "Orario cambiato" + +#. module: hr_attendance_modification_tracking +#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__time_changed_manually +msgid "Time changed" +msgstr "Orario cambiato" + +#~ msgid "Display Name" +#~ msgstr "Nome visualizzato" + +#~ msgid "Followers (Channels)" +#~ msgstr "Seguito da (canali)" + +#~ msgid "ID" +#~ msgstr "ID" + +#~ msgid "Last Modified on" +#~ msgstr "Ultima modifica il" + +#~ msgid "Number of messages which requires an action" +#~ msgstr "Numero di messaggi che richiedono un'azione" + +#~ msgid "Number of unread messages" +#~ msgstr "Numero di messaggi non letti" + +#~ msgid "SMS Delivery error" +#~ msgstr "Errore consegna SMS" + +#~ msgid "Unread Messages" +#~ msgstr "Messaggi non letti" + +#~ msgid "Unread Messages Counter" +#~ msgstr "Numero messaggi non letti" diff --git a/hr_attendance_modification_tracking/models/__init__.py b/hr_attendance_modification_tracking/models/__init__.py new file mode 100644 index 00000000..3e26fd84 --- /dev/null +++ b/hr_attendance_modification_tracking/models/__init__.py @@ -0,0 +1,4 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import hr_attendance +from . import hr_employee diff --git a/hr_attendance_modification_tracking/models/hr_attendance.py b/hr_attendance_modification_tracking/models/hr_attendance.py new file mode 100644 index 00000000..d846ff3c --- /dev/null +++ b/hr_attendance_modification_tracking/models/hr_attendance.py @@ -0,0 +1,54 @@ +# Copyright 2019 Creu Blanca +# Copyright 2021 Landoo +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from datetime import timedelta + +from odoo import api, fields, models + + +class HrAttendance(models.Model): + _name = "hr.attendance" + _inherit = ["hr.attendance", "mail.thread"] + + employee_id = fields.Many2one(tracking=True) + check_in = fields.Datetime(tracking=True) + check_out = fields.Datetime(tracking=True) + time_changed_manually = fields.Boolean( + string="Time changed", + default=False, + readonly=True, + help="This attendance has been manually changed by user. If attendance" + " is created from form view, a 60 seconds tolerance will " + "be applied.", + ) + + @api.model_create_multi + def create(self, vals_list): + tolerance = timedelta(seconds=60) + now = fields.Datetime.now() + for vals in vals_list: + for check in ["check_in", "check_out"]: + if ( + vals.get(check, False) + and abs(fields.Datetime.from_string(vals.get(check)) - now) + > tolerance + ): + vals.update({"time_changed_manually": True}) + break + return super().create(vals_list) + + def write(self, vals): + tolerance = timedelta(seconds=60) + now = fields.Datetime.now() + for record in self: + for check in ["check_in", "check_out"]: + if vals.get(check, False): + if getattr(record, check, False): + record.time_changed_manually = True + else: + check_str = vals.get(check) + diff = abs(fields.Datetime.from_string(check_str) - now) + if diff > tolerance: + record.time_changed_manually = True + return super().write(vals) diff --git a/hr_attendance_modification_tracking/models/hr_employee.py b/hr_attendance_modification_tracking/models/hr_employee.py new file mode 100644 index 00000000..a3c10b63 --- /dev/null +++ b/hr_attendance_modification_tracking/models/hr_employee.py @@ -0,0 +1,14 @@ +# Copyright 2023 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class HrEmployeeBase(models.AbstractModel): + _inherit = "hr.employee.base" + + last_check_in = fields.Datetime(tracking=False) + last_check_out = fields.Datetime(tracking=False) + + def _valid_field_parameter(self, field, name): + return name == "tracking" or super()._valid_field_parameter(field, name) diff --git a/hr_attendance_modification_tracking/pyproject.toml b/hr_attendance_modification_tracking/pyproject.toml new file mode 100644 index 00000000..4231d0cc --- /dev/null +++ b/hr_attendance_modification_tracking/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/hr_attendance_modification_tracking/readme/CONTRIBUTORS.md b/hr_attendance_modification_tracking/readme/CONTRIBUTORS.md new file mode 100644 index 00000000..5101f827 --- /dev/null +++ b/hr_attendance_modification_tracking/readme/CONTRIBUTORS.md @@ -0,0 +1,7 @@ +- Jaime Arroyo \<\> +- Enric Tobella \<\> +- Saran Lim. \<\> +- Nagore Salaberria \<\> +- Josean Soroa \<\> +- Aritz Olea \<\> +- [Heliconia Solutions Pvt. Ltd.](https://www.heliconia.io) diff --git a/hr_attendance_modification_tracking/readme/DESCRIPTION.md b/hr_attendance_modification_tracking/readme/DESCRIPTION.md new file mode 100644 index 00000000..0ed60840 --- /dev/null +++ b/hr_attendance_modification_tracking/readme/DESCRIPTION.md @@ -0,0 +1,18 @@ +Attendance changes will now be registered in the chatter. This will help +prevent cheating in check-in or check-out time. List and form views also +include this change information. + +Use cases: + +- Attendances created from kiosk or check-in/check-out screens, are + created as automatic. If their check-in or check-out dates are + modified by any user, attendances are checked as 'Manually changed'. +- Attendances created from form view will apply a 60 seconds tolerance + between entered and real times. If this tolerance is surpassed, + attendances are checked as 'Manually changed'. + +Note: + +- Attendances already created won't be checked automatically on + installation since it could take a large amount of time. If this is + wanted it will be necessary to do it manually later. diff --git a/hr_attendance_modification_tracking/static/description/icon.png b/hr_attendance_modification_tracking/static/description/icon.png new file mode 100644 index 00000000..3a0328b5 Binary files /dev/null and b/hr_attendance_modification_tracking/static/description/icon.png differ diff --git a/hr_attendance_modification_tracking/static/description/index.html b/hr_attendance_modification_tracking/static/description/index.html new file mode 100644 index 00000000..6158e922 --- /dev/null +++ b/hr_attendance_modification_tracking/static/description/index.html @@ -0,0 +1,447 @@ + + + + + +HR Attendance Modification Tracking. + + + +
+

HR Attendance Modification Tracking.

+ + +

Beta License: AGPL-3 OCA/hr-attendance Translate me on Weblate Try me on Runboat

+

Attendance changes will now be registered in the chatter. This will help +prevent cheating in check-in or check-out time. List and form views also +include this change information.

+

Use cases:

+
    +
  • Attendances created from kiosk or check-in/check-out screens, are +created as automatic. If their check-in or check-out dates are +modified by any user, attendances are checked as ‘Manually changed’.
  • +
  • Attendances created from form view will apply a 60 seconds tolerance +between entered and real times. If this tolerance is surpassed, +attendances are checked as ‘Manually changed’.
  • +
+

Note:

+
    +
  • Attendances already created won’t be checked automatically on +installation since it could take a large amount of time. If this is +wanted it will be necessary to do it manually later.
  • +
+

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

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Creu Blanca
  • +
  • Landoo
  • +
+
+
+

Contributors

+ +
+
+

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/hr-attendance project on GitHub.

+

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

+
+
+
+ + diff --git a/hr_attendance_modification_tracking/tests/__init__.py b/hr_attendance_modification_tracking/tests/__init__.py new file mode 100644 index 00000000..1d4d5a82 --- /dev/null +++ b/hr_attendance_modification_tracking/tests/__init__.py @@ -0,0 +1 @@ +from . import test_hr_attendance diff --git a/hr_attendance_modification_tracking/tests/test_hr_attendance.py b/hr_attendance_modification_tracking/tests/test_hr_attendance.py new file mode 100644 index 00000000..328f911d --- /dev/null +++ b/hr_attendance_modification_tracking/tests/test_hr_attendance.py @@ -0,0 +1,145 @@ +# Copyright 2019 Creu Blanca +# Copyright 2021 Landoo +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from datetime import datetime + +from dateutil.relativedelta import relativedelta + +from odoo.tests.common import TransactionCase +from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT as DF + + +class TestHrAttendanceTracking(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.hr_attendance = cls.env["hr.attendance"] + cls.employee_01 = cls.env["hr.employee"].create({"name": "Employee01"}) + cls.employee_02 = cls.env["hr.employee"].create({"name": "Employee02"}) + cls.employee_03 = cls.env["hr.employee"].create({"name": "Employee03"}) + cls.employee_04 = cls.env["hr.employee"].create({"name": "Employee04"}) + cls.employee_05 = cls.env["hr.employee"].create({"name": "Employee05"}) + cls.employee_06 = cls.env["hr.employee"].create({"name": "Employee06"}) + + def test_attendance_edit_01(self): + # We can't check kiosk and check-in/check-out form + # So we will check attendance creation from form view + ##################################################### + # Use case 1: + # Create an attendance with correct (now) check-in and leave it open + # Expected: manually_changed = False + dti = datetime.now() + att = self.hr_attendance.create( + {"employee_id": self.employee_01.id, "check_in": dti.strftime(DF)} + ) + self.assertEqual( + att.time_changed_manually, False, "Use case 1: Wrong value, not changes." + ) + + def test_attendance_edit_02(self): + # Use case 2: + # Create an attendance with incorrect (now - 10 minutes) check-in and + # leave it open. Maximum tolerance is one minute from now. + # Expected: manually_changed = True + dti = datetime.now() - relativedelta(minutes=10) + att = self.hr_attendance.create( + {"employee_id": self.employee_02.id, "check_in": dti.strftime(DF)} + ) + self.assertEqual( + att.time_changed_manually, + True, + "Use case 2: Wrong value, tolerance exceeded", + ) + + def test_attendance_edit_03(self): + # Use case 3: + # Create an attendance with incorrect (now + 10 minutes) check-in + # and leave it open.Maximum tolerance is one minute from now. + # Expected: manually_changed = True + dti = datetime.now() + relativedelta(minutes=10) + att = self.hr_attendance.create( + {"employee_id": self.employee_03.id, "check_in": dti.strftime(DF)} + ) + self.assertEqual( + att.time_changed_manually, + True, + "Use case 3: Wrong value, tolerance exceeded.", + ) + + def test_attendance_edit_04(self): + # Use case 4: + # Create an attendance with correct (now - 15 sec) check-in and correct + # (now + 15 sec) check-out. + # Expected: manually_changed = False + dti = datetime.now() - relativedelta(seconds=15) + dto = datetime.now() + relativedelta(seconds=15) + att = self.hr_attendance.create( + { + "employee_id": self.employee_04.id, + "check_in": dti.strftime(DF), + "check_out": dto.strftime(DF), + } + ) + self.assertEqual( + att.time_changed_manually, + False, + "Use case 4: Wrong value, tolerance not exceeded.", + ) + + def test_attendance_edit_05(self): + # Use case 5: + # Change previous attendance check-out to now + 1 hour + # Expected: manually_changed = True + dti = datetime.now() - relativedelta(seconds=15) + dto = datetime.now() + relativedelta(hours=1) + att = self.hr_attendance.create( + { + "employee_id": self.employee_04.id, + "check_in": dti.strftime(DF), + "check_out": dto.strftime(DF), + } + ) + self.assertEqual( + att.time_changed_manually, True, "Use case 5: Wrong value, data changed." + ) + + def test_attendance_edit_06(self): + # Use case 6: + # Create an attendance with correct (now - 15 sec) check-in and incorrect + # (now + 15 min) check-out + # Expected: manually_changed = True + dti = datetime.now() - relativedelta(seconds=15) + dto = datetime.now() + relativedelta(minutes=15) + att = self.hr_attendance.create( + { + "employee_id": self.employee_05.id, + "check_in": dti.strftime(DF), + "check_out": dto.strftime(DF), + } + ) + self.assertEqual( + att.time_changed_manually, + True, + "Use case 6 : Wrong value, tolerance exceeded.", + ) + + def test_attendance_edit_07(self): + # Use case 7: + # Create an attendance with correct (now - 15 sec) check-in and + # manually write leave current check-out + # Expected: manually_changed = False + dti = datetime.now() - relativedelta(seconds=15) + att = self.hr_attendance.create( + { + "employee_id": self.employee_06.id, + "check_in": dti.strftime(DF), + } + ) + dto = datetime.now() + att.write({"check_out": dto.strftime(DF)}) + self.assertEqual( + att.time_changed_manually, + False, + "Use case 7: Wrong value, time not changed manually.", + ) diff --git a/hr_attendance_modification_tracking/views/hr_attendance_view.xml b/hr_attendance_modification_tracking/views/hr_attendance_view.xml new file mode 100644 index 00000000..47929ae9 --- /dev/null +++ b/hr_attendance_modification_tracking/views/hr_attendance_view.xml @@ -0,0 +1,66 @@ + + + + + hr.attendance.form + hr.attendance + + + + + + + + + + hr.attendance.tree + hr.attendance + + + + + + + + + hr.attendance.tree + hr.attendance + 99 + + + +