Initial commit: OCA Technical packages (595 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:43:03 +02:00
commit 2cc02aac6e
24950 changed files with 2318079 additions and 0 deletions

View file

@ -0,0 +1,44 @@
# HR Attendance Modification Tracking.
Odoo addon: hr_attendance_modification_tracking
## Installation
```bash
pip install odoo-bringout-oca-hr-attendance-hr_attendance_modification_tracking
```
## Dependencies
This addon depends on:
- hr_attendance
## Manifest Information
- **Name**: HR Attendance Modification Tracking.
- **Version**: 16.0.1.0.1
- **Category**: N/A
- **License**: AGPL-3
- **Installable**: True
## Source
Based on [OCA/hr-attendance](https://github.com/OCA/hr-attendance) branch 16.0, addon `hr_attendance_modification_tracking`.
## License
This package maintains the original AGPL-3 license from the upstream Odoo project.
## Documentation
- Overview: doc/OVERVIEW.md
- Architecture: doc/ARCHITECTURE.md
- Models: doc/MODELS.md
- Controllers: doc/CONTROLLERS.md
- Wizards: doc/WIZARDS.md
- Install: doc/INSTALL.md
- Usage: doc/USAGE.md
- Configuration: doc/CONFIGURATION.md
- Dependencies: doc/DEPENDENCIES.md
- Troubleshooting: doc/TROUBLESHOOTING.md
- FAQ: doc/FAQ.md

View file

@ -0,0 +1,32 @@
# Architecture
```mermaid
flowchart TD
U[Users] -->|HTTP| V[Views and QWeb Templates]
V --> C[Controllers]
V --> W[Wizards Transient Models]
C --> M[Models and ORM]
W --> M
M --> R[Reports]
DX[Data XML] --> M
S[Security ACLs and Groups] -. enforces .-> M
subgraph Hr_attendance_modification_tracking Module - hr_attendance_modification_tracking
direction LR
M:::layer
W:::layer
C:::layer
V:::layer
R:::layer
S:::layer
DX:::layer
end
classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px
```
Notes
- Views include tree/form/kanban templates and report templates.
- Controllers provide website/portal routes when present.
- Wizards are UI flows implemented with `models.TransientModel`.
- Data XML loads data/demo records; Security defines groups and access.

View file

@ -0,0 +1,3 @@
# Configuration
Refer to Odoo settings for hr_attendance_modification_tracking. Configure related models, access rights, and options as needed.

View file

@ -0,0 +1,3 @@
# Controllers
This module does not define custom HTTP controllers.

View file

@ -0,0 +1,5 @@
# Dependencies
This addon depends on:
- [hr_attendance](../../odoo-bringout-oca-ocb-hr_attendance)

View file

@ -0,0 +1,4 @@
# FAQ
- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged).
- Q: How to enable? A: Start server with --addon hr_attendance_modification_tracking or install in UI.

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-oca-hr-attendance-hr_attendance_modification_tracking"
# or
uv pip install odoo-bringout-oca-hr-attendance-hr_attendance_modification_tracking"
```

View file

@ -0,0 +1,13 @@
# Models
Detected core models and extensions in hr_attendance_modification_tracking.
```mermaid
classDiagram
class hr_attendance
class hr_employee_base
```
Notes
- Classes show model technical names; fields omitted for brevity.
- Items listed under _inherit are extensions of existing models.

View file

@ -0,0 +1,6 @@
# Overview
Packaged Odoo addon: hr_attendance_modification_tracking. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon hr_attendance_modification_tracking
- License: LGPL-3

View file

@ -0,0 +1,3 @@
# Reports
This module does not define custom reports.

View file

@ -0,0 +1,8 @@
# Security
This module does not define custom security rules or access controls beyond Odoo defaults.
Default Odoo security applies:
- Base user access through standard groups
- Model access inherited from dependencies
- No custom row-level security rules

View file

@ -0,0 +1,5 @@
# Troubleshooting
- Ensure Python and Odoo environment matches repo guidance.
- Check database connectivity and logs if startup fails.
- Validate that dependent addons listed in DEPENDENCIES.md are installed.

View file

@ -0,0 +1,7 @@
# Usage
Start Odoo including this addon (from repo root):
```bash
python3 scripts/nix_odoo_web_server.py --db-name mydb --addon hr_attendance_modification_tracking
```

View file

@ -0,0 +1,3 @@
# Wizards
This module does not include UI wizards.

View file

@ -0,0 +1,93 @@
====================================
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/16.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-16-0/hr-attendance-16-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=16.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 <https://github.com/OCA/hr-attendance/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 <https://github.com/OCA/hr-attendance/issues/new?body=module:%20hr_attendance_modification_tracking%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Creu Blanca
* Landoo
Contributors
~~~~~~~~~~~~
* Jaime Arroyo <jaime.arroyo@creublanca.es>
* Enric Tobella <etobella@creublanca.es>
* Saran Lim. <saranl@ecosoft.co.th>
* Nagore Salaberria <ns@landoo.es>
* Josean Soroa <js@landoo.es>
* Aritz Olea <ao@landoo.es>
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 <https://github.com/OCA/hr-attendance/tree/16.0/hr_attendance_modification_tracking>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -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

View file

@ -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": "16.0.1.0.1",
"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,
}

View file

@ -0,0 +1,11 @@
# Copyright 2020 Creu Blanca
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
def pre_init_hook(cr):
cr.execute(
"""
ALTER TABLE hr_attendance
ADD COLUMN IF NOT EXISTS time_changed_manually BOOLEAN
"""
)

View file

@ -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 "Potrebna akcija"
#. 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 "Broj priloga"
#. module: hr_attendance_modification_tracking
#: model:ir.model,name:hr_attendance_modification_tracking.model_hr_attendance
msgid "Attendance"
msgstr "Prisutnost"
#. module: hr_attendance_modification_tracking
#: model:ir.model,name:hr_attendance_modification_tracking.model_hr_employee_base
msgid "Basic Employee"
msgstr "Obični zaposlenik"
#. 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 "Prijava"
#. 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 "Odjava"
#. module: hr_attendance_modification_tracking
#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__employee_id
msgid "Employee"
msgstr "Zaposleni"
#. module: hr_attendance_modification_tracking
#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_follower_ids
msgid "Followers"
msgstr "Pratioci"
#. 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 "Pratioci (Partneri)"
#. module: hr_attendance_modification_tracking
#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__has_message
msgid "Has Message"
msgstr "Ima poruku"
#. 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 "Ako je zakačeno, nove poruke će zahtjevati vašu pažnju"
#. 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 "Ako je označeno neke poruke mogu imati grešku u dostavi."
#. 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 "Pratilac"
#. 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 "Zadnja prijava"
#. 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 "Zadnja odjava"
#. 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 "Glavna zakačka"
#. 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 "Greška pri isporuci poruke"
#. module: hr_attendance_modification_tracking
#: model:ir.model.fields,field_description:hr_attendance_modification_tracking.field_hr_attendance__message_ids
msgid "Messages"
msgstr "Poruke"
#. 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 "Broj akcija"
#. 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 "Broj grešaka"
#. 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 "Broj poruka koje zahtijevaju aktivnost"
#. 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 "Broj poruka sa greškama pri isporuci"
#. module: hr_attendance_modification_tracking
#: model_terms:ir.ui.view,arch_db:hr_attendance_modification_tracking.hr_attendance_view_tree_open
msgid "Open"
msgstr "Otvori"
#. 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 "Vrijeme promijenjeno"
#. 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 "Vrijeme promijenjeno"

View file

@ -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 <carlesantoli@hotmail.com>\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 ""

View file

@ -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 ""

View file

@ -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 <informatica@totmaterial.es>\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"

View file

@ -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 <pierreverkest84@gmail.com>\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"

View file

@ -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 ""

View file

@ -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 <stefano.consolaro@mymage.it>\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"

View file

@ -0,0 +1,4 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import hr_attendance
from . import hr_employee

View file

@ -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)

View file

@ -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)

View file

@ -0,0 +1,6 @@
* Jaime Arroyo <jaime.arroyo@creublanca.es>
* Enric Tobella <etobella@creublanca.es>
* Saran Lim. <saranl@ecosoft.co.th>
* Nagore Salaberria <ns@landoo.es>
* Josean Soroa <js@landoo.es>
* Aritz Olea <ao@landoo.es>

View file

@ -0,0 +1,12 @@
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.

View file

@ -0,0 +1,440 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>HR Attendance Modification Tracking.</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic, pre.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="hr-attendance-modification-tracking">
<h1 class="title">HR Attendance Modification Tracking.</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:035cfbd2951314e08e735a434f8d20ee906715dc18a4833da2042f2689b1f83a
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/hr-attendance/tree/16.0/hr_attendance_modification_tracking"><img alt="OCA/hr-attendance" src="https://img.shields.io/badge/github-OCA%2Fhr--attendance-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/hr-attendance-16-0/hr-attendance-16-0-hr_attendance_modification_tracking"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/hr-attendance&amp;target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>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.</p>
<p>Use cases:</p>
<ul class="simple">
<li>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.</li>
<li>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.</li>
</ul>
<p>Note:</p>
<ul class="simple">
<li>Attendances already created wont 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.</li>
</ul>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-1">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-2">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-3">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-4">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-5">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-1">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/hr-attendance/issues">GitHub Issues</a>.
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
<a class="reference external" href="https://github.com/OCA/hr-attendance/issues/new?body=module:%20hr_attendance_modification_tracking%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#toc-entry-2">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-3">Authors</a></h2>
<ul class="simple">
<li>Creu Blanca</li>
<li>Landoo</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-4">Contributors</a></h2>
<ul class="simple">
<li>Jaime Arroyo &lt;<a class="reference external" href="mailto:jaime.arroyo&#64;creublanca.es">jaime.arroyo&#64;creublanca.es</a>&gt;</li>
<li>Enric Tobella &lt;<a class="reference external" href="mailto:etobella&#64;creublanca.es">etobella&#64;creublanca.es</a>&gt;</li>
<li>Saran Lim. &lt;<a class="reference external" href="mailto:saranl&#64;ecosoft.co.th">saranl&#64;ecosoft.co.th</a>&gt;</li>
<li>Nagore Salaberria &lt;<a class="reference external" href="mailto:ns&#64;landoo.es">ns&#64;landoo.es</a>&gt;</li>
<li>Josean Soroa &lt;<a class="reference external" href="mailto:js&#64;landoo.es">js&#64;landoo.es</a>&gt;</li>
<li>Aritz Olea &lt;<a class="reference external" href="mailto:ao&#64;landoo.es">ao&#64;landoo.es</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-5">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org">
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
</a>
<p>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.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/hr-attendance/tree/16.0/hr_attendance_modification_tracking">OCA/hr-attendance</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

View file

@ -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.",
)

View file

@ -0,0 +1,76 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2019 Creu Blanca
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
<record model="ir.ui.view" id="hr_attendance_view_form">
<field name="name">hr.attendance.form</field>
<field name="model">hr.attendance</field>
<field name="inherit_id" ref="hr_attendance.hr_attendance_view_form" />
<field name="arch" type="xml">
<field name="check_out" position="after">
<field name="time_changed_manually" />
</field>
<sheet position="after">
<div class="oe_chatter">
<field
name="message_follower_ids"
widget="mail_followers"
groups="base.group_user"
/>
<field name="message_ids" widget="mail_thread" />
</div>
</sheet>
</field>
</record>
<!-- insert in tree view 'Time Changed' new field -->
<record id="hr_attendance_view_tree" model="ir.ui.view">
<field name="name">hr.attendance.tree</field>
<field name="model">hr.attendance</field>
<field name="inherit_id" ref="hr_attendance.view_attendance_tree" />
<field name="arch" type="xml">
<xpath expr="//field[@name='check_out']" position="after">
<field name="time_changed_manually" />
</xpath>
</field>
</record>
<record id="hr_attendance_view_tree_open" model="ir.ui.view">
<field name="name">hr.attendance.tree</field>
<field name="model">hr.attendance</field>
<field name="priority">99</field>
<field name="inherit_id" ref="hr_attendance.view_attendance_tree" />
<field name="arch" type="xml">
<xpath expr="//field[last()]" position="after">
<button
name="get_formview_action"
type="object"
string="Open"
class="btn btn-primary"
/>
</xpath>
</field>
</record>
<!-- insert in search filter and Group by using a new field 'Time Changed' -->
<record id="hr_attendance_view_search" model="ir.ui.view">
<field name="name">hr.attendance.search</field>
<field name="model">hr.attendance</field>
<field name="type">search</field>
<field name="inherit_id" ref="hr_attendance.hr_attendance_view_filter" />
<field name="arch" type="xml">
<filter name="nocheckout" position="after">
<filter
name="time_changed_manually"
string="Time Changed"
domain="[('time_changed_manually', '=', True)]"
/>
</filter>
<filter name="groupby_check_out" position="after">
<field name="time_changed_manually" string="Time Changed" />
<filter
name="group_by_time_changed_manually"
string="Time Changed"
context="{'group_by':'time_changed_manually'}"
/>
</filter>
</field>
</record>
</odoo>

View file

@ -0,0 +1,43 @@
[project]
name = "odoo-bringout-oca-hr-attendance-hr_attendance_modification_tracking"
version = "16.0.0"
description = "HR Attendance Modification Tracking. -
Attendance changes will now be registered in the chatter."
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-hr-attendance-hr_attendance>=16.0.0",
"requests>=2.25.1"
]
readme = "README.md"
requires-python = ">= 3.11"
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Office/Business",
]
[project.urls]
homepage = "https://github.com/bringout/0"
repository = "https://github.com/bringout/0"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.metadata]
allow-direct-references = true
[tool.hatch.build.targets.wheel]
packages = ["hr_attendance_modification_tracking"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]