Move all OCA HR modules from oca-technical to dedicated oca-hr submodule

Reorganized 67 HR-related modules for better structure:
- Moved all odoo-bringout-oca-hr-* packages from packages/oca-technical/
- Now organized in dedicated packages/oca-hr/ submodule
- Includes attendance, expense, holiday, employee, and contract modules
- Maintains all module functionality while improving project organization

This creates a cleaner separation between general technical modules
and HR-specific functionality.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Ernad Husremovic 2025-08-30 17:11:41 +02:00
parent a176a436ce
commit 53fd71d6de
2527 changed files with 0 additions and 130458 deletions

View file

@ -1,44 +0,0 @@
# HR Attendance Auto Close
Odoo addon: hr_attendance_autoclose
## Installation
```bash
pip install odoo-bringout-oca-hr-attendance-hr_attendance_autoclose
```
## Dependencies
This addon depends on:
- hr_attendance_reason
## Manifest Information
- **Name**: HR Attendance Auto Close
- **Version**: 16.0.1.0.0
- **Category**: Human Resources
- **License**: AGPL-3
- **Installable**: True
## Source
Based on [OCA/hr-attendance](https://github.com/OCA/hr-attendance) branch 16.0, addon `hr_attendance_autoclose`.
## 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

@ -1,32 +0,0 @@
# 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_autoclose Module - hr_attendance_autoclose
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

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

View file

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

View file

@ -1,5 +0,0 @@
# Dependencies
This addon depends on:
- [hr_attendance_reason](https://github.com/bringout/oca-technical)

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,8 +0,0 @@
# 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

@ -1,5 +0,0 @@
# 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

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

View file

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

View file

@ -1,90 +0,0 @@
========================
HR Attendance Auto Close
========================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:56931643c0fd1e22f3f6ec466df0d4158ee820e4d48434437e20cdaa10e01021
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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_autoclose
: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_autoclose
: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|
This module close stale attendances automatically. Without this module, when
an employee forgets to check out at the end on the day and the next day the
employee does not realize of that, then the error is propagated and all the
attendances are wrong. With this module only the attendance with the issue is
wrong, and the manager knows the system closes the attendance, not the employee
**Table of contents**
.. contents::
:local:
Usage
=====
#. Go to *Attendances > Configuration > Configuration*.
#. Set the maximum number of hours allowed for an attendance.
#. Go to *Attendances > Manage Attendances > Attendances*.
#. Attendance are automatically closed if they have remained open for longer than specified in the setting.
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_autoclose%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
=======
Contributors
~~~~~~~~~~~~
* Aaron Henriquez <ahforgeflow@forgeflow.com>
* Kitti U. <kittiu@ecosoft.co.th>
* `Tecnativa <https://www.tecnativa.com>`_:
* Víctor Martínez
* Foram Shah <foram.shah@initos.com>
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_autoclose>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -1,22 +0,0 @@
# Copyright 2018 ForgeFlow, S.L.
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
{
"name": "HR Attendance Auto Close",
"version": "16.0.1.0.0",
"category": "Human Resources",
"summary": "Close stale Attendances",
"website": "https://github.com/OCA/hr-attendance",
"author": "Odoo Community Association (OCA)",
"license": "AGPL-3",
"installable": True,
"depends": ["hr_attendance_reason"],
"data": [
"data/hr_attendance_reason.xml",
"data/hr_attendance.xml",
"data/res_company.xml",
"views/hr_attendance_view.xml",
"views/hr_employee.xml",
"views/res_config_settings_view.xml",
],
}

View file

@ -1,19 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<record model="ir.cron" id="check_attendance_cron">
<field name="name">Check Attendance</field>
<field name="interval_number">1</field>
<field name="interval_type">hours</field>
<field name="numbercall">-1</field>
<field
name="nextcall"
eval="(DateTime.now() + timedelta(minutes=60)).strftime('%Y-%m-%d %H:05:00')"
/>
<field name="doall" eval="True" />
<field name="model_id" ref="hr_attendance.model_hr_attendance" />
<field name="state">code</field>
<field name="code">
model.check_for_incomplete_attendances()
</field>
</record>
</odoo>

View file

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<record id="hr_attendance_reason_check_out" model="hr.attendance.reason">
<field name="name">System automatic check out due to inactivity</field>
<field name="code">S-CO</field>
<field name="action_type">sign_out</field>
</record>
</odoo>

View file

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<record id="base.main_company" model="res.company">
<field
name="hr_attendance_autoclose_reason"
ref="hr_attendance_reason_check_out"
/>
</record>
</odoo>

View file

@ -1,98 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_attendance_autoclose
#
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_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid ""
"<span class=\"fa fa-lg fa-building-o\" title=\"Values set here are company-"
"specific.\" groups=\"base.group_multi_company\"/>"
msgstr ""
#. module: hr_attendance_autoclose
#: model:ir.model,name:hr_attendance_autoclose.model_hr_attendance
msgid "Attendance"
msgstr "Prisustva"
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid "Attendance Autoclosing"
msgstr "Automatsko zatvaranje evidencije"
#. module: hr_attendance_autoclose
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_res_company__attendance_maximum_hours_per_day
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_res_config_settings__attendance_maximum_hours_per_day
msgid "Attendance Maximum Hours Per Day"
msgstr "Maksimalan broj sati dnevno"
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid ""
"Attendance lines longer than this value will\n"
" be automatically closed."
msgstr ""
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid "Autoclose Reason"
msgstr "Razlog automatskog zatvaranja"
#. module: hr_attendance_autoclose
#: model:ir.actions.server,name:hr_attendance_autoclose.check_attendance_cron_ir_actions_server
#: model:ir.cron,cron_name:hr_attendance_autoclose.check_attendance_cron
msgid "Check Attendance"
msgstr "Provjeri prisustvo"
#. module: hr_attendance_autoclose
#: model:ir.model,name:hr_attendance_autoclose.model_res_company
msgid "Companies"
msgstr "Tvrtke"
#. module: hr_attendance_autoclose
#: model:ir.model,name:hr_attendance_autoclose.model_res_config_settings
msgid "Config Settings"
msgstr "Postavke"
#. module: hr_attendance_autoclose
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_hr_employee__no_autoclose
msgid "Don't Autoclose Attendances"
msgstr "Nemoj automatski odjaviti korisnika"
#. module: hr_attendance_autoclose
#: model:ir.model,name:hr_attendance_autoclose.model_hr_employee
msgid "Employee"
msgstr "Djelatnik"
#. module: hr_attendance_autoclose
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_res_company__hr_attendance_autoclose_reason
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_res_config_settings__hr_attendance_autoclose_reason
msgid "Hr Attendance Autoclose Reason"
msgstr "Razlog automatskog zatvaranja HR evidencije"
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid "Max Hours Per Day"
msgstr "Max sati dnevno"
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid ""
"This reason will be added to an attendance\n"
" when it's autoclosed."
msgstr ""
#. module: hr_attendance_autoclose
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_hr_attendance__open_worked_hours
msgid "Worked hours"
msgstr "Odrađeno sati"

View file

@ -1,107 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_attendance_autoclose
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 13.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2023-11-02 18:37+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_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid ""
"<span class=\"fa fa-lg fa-building-o\" title=\"Values set here are company-"
"specific.\" groups=\"base.group_multi_company\"/>"
msgstr ""
"<span class=\"fa fa-lg fa-building-o\" title=\"Values set here are company-"
"specific.\" groups=\"base.group_multi_company\"/>"
#. module: hr_attendance_autoclose
#: model:ir.model,name:hr_attendance_autoclose.model_hr_attendance
msgid "Attendance"
msgstr "Asistencia"
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid "Attendance Autoclosing"
msgstr "Autocierre de Asistencia"
#. module: hr_attendance_autoclose
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_res_company__attendance_maximum_hours_per_day
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_res_config_settings__attendance_maximum_hours_per_day
msgid "Attendance Maximum Hours Per Day"
msgstr "Horas máximas de asistencia por día"
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid ""
"Attendance lines longer than this value will\n"
" be automatically closed."
msgstr ""
"Las líneas de asistencia que superen este valor\n"
" se cerrarán automáticamente."
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid "Autoclose Reason"
msgstr "Motivo de Cierre Automático"
#. module: hr_attendance_autoclose
#: model:ir.actions.server,name:hr_attendance_autoclose.check_attendance_cron_ir_actions_server
#: model:ir.cron,cron_name:hr_attendance_autoclose.check_attendance_cron
msgid "Check Attendance"
msgstr "Comprobar asistencia"
#. module: hr_attendance_autoclose
#: model:ir.model,name:hr_attendance_autoclose.model_res_company
msgid "Companies"
msgstr "Compañías"
#. module: hr_attendance_autoclose
#: model:ir.model,name:hr_attendance_autoclose.model_res_config_settings
msgid "Config Settings"
msgstr "Ajustes de Configuración"
#. module: hr_attendance_autoclose
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_hr_employee__no_autoclose
msgid "Don't Autoclose Attendances"
msgstr "No auto-cerrar asistencias"
#. module: hr_attendance_autoclose
#: model:ir.model,name:hr_attendance_autoclose.model_hr_employee
msgid "Employee"
msgstr "Empleado/a"
#. module: hr_attendance_autoclose
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_res_company__hr_attendance_autoclose_reason
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_res_config_settings__hr_attendance_autoclose_reason
msgid "Hr Attendance Autoclose Reason"
msgstr "Razón de Cierre Automático de Asistencia de Recursos Humanos"
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid "Max Hours Per Day"
msgstr "Horas Máximas por Día"
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid ""
"This reason will be added to an attendance\n"
" when it's autoclosed."
msgstr ""
"Este motivo se agregará a una asistencia.\n"
" cuando sea cerrada automáticamente."
#. module: hr_attendance_autoclose
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_hr_attendance__open_worked_hours
msgid "Worked hours"
msgstr "Horas trabajadas"

View file

@ -1,99 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_attendance_autoclose
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: Automatically generated\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"
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid ""
"<span class=\"fa fa-lg fa-building-o\" title=\"Values set here are company-"
"specific.\" groups=\"base.group_multi_company\"/>"
msgstr ""
#. module: hr_attendance_autoclose
#: model:ir.model,name:hr_attendance_autoclose.model_hr_attendance
msgid "Attendance"
msgstr ""
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid "Attendance Autoclosing"
msgstr ""
#. module: hr_attendance_autoclose
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_res_company__attendance_maximum_hours_per_day
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_res_config_settings__attendance_maximum_hours_per_day
msgid "Attendance Maximum Hours Per Day"
msgstr ""
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid ""
"Attendance lines longer than this value will\n"
" be automatically closed."
msgstr ""
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid "Autoclose Reason"
msgstr ""
#. module: hr_attendance_autoclose
#: model:ir.actions.server,name:hr_attendance_autoclose.check_attendance_cron_ir_actions_server
#: model:ir.cron,cron_name:hr_attendance_autoclose.check_attendance_cron
msgid "Check Attendance"
msgstr ""
#. module: hr_attendance_autoclose
#: model:ir.model,name:hr_attendance_autoclose.model_res_company
msgid "Companies"
msgstr ""
#. module: hr_attendance_autoclose
#: model:ir.model,name:hr_attendance_autoclose.model_res_config_settings
msgid "Config Settings"
msgstr ""
#. module: hr_attendance_autoclose
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_hr_employee__no_autoclose
msgid "Don't Autoclose Attendances"
msgstr ""
#. module: hr_attendance_autoclose
#: model:ir.model,name:hr_attendance_autoclose.model_hr_employee
msgid "Employee"
msgstr ""
#. module: hr_attendance_autoclose
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_res_company__hr_attendance_autoclose_reason
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_res_config_settings__hr_attendance_autoclose_reason
msgid "Hr Attendance Autoclose Reason"
msgstr ""
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid "Max Hours Per Day"
msgstr ""
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid ""
"This reason will be added to an attendance\n"
" when it's autoclosed."
msgstr ""
#. module: hr_attendance_autoclose
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_hr_attendance__open_worked_hours
msgid "Worked hours"
msgstr ""

View file

@ -1,102 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_attendance_autoclose
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2019-11-13 16:34+0000\n"
"Last-Translator: Bole <bole@dajmi5.com>\n"
"Language-Team: none\n"
"Language: hr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 3.8\n"
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid ""
"<span class=\"fa fa-lg fa-building-o\" title=\"Values set here are company-"
"specific.\" groups=\"base.group_multi_company\"/>"
msgstr ""
#. module: hr_attendance_autoclose
#: model:ir.model,name:hr_attendance_autoclose.model_hr_attendance
msgid "Attendance"
msgstr "Prisustva"
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid "Attendance Autoclosing"
msgstr ""
#. module: hr_attendance_autoclose
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_res_company__attendance_maximum_hours_per_day
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_res_config_settings__attendance_maximum_hours_per_day
msgid "Attendance Maximum Hours Per Day"
msgstr "Maksimalan broj sati dnevno"
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid ""
"Attendance lines longer than this value will\n"
" be automatically closed."
msgstr ""
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid "Autoclose Reason"
msgstr ""
#. module: hr_attendance_autoclose
#: model:ir.actions.server,name:hr_attendance_autoclose.check_attendance_cron_ir_actions_server
#: model:ir.cron,cron_name:hr_attendance_autoclose.check_attendance_cron
msgid "Check Attendance"
msgstr "Provjeri prisustvo"
#. module: hr_attendance_autoclose
#: model:ir.model,name:hr_attendance_autoclose.model_res_company
msgid "Companies"
msgstr "Tvrtke"
#. module: hr_attendance_autoclose
#: model:ir.model,name:hr_attendance_autoclose.model_res_config_settings
msgid "Config Settings"
msgstr ""
#. module: hr_attendance_autoclose
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_hr_employee__no_autoclose
msgid "Don't Autoclose Attendances"
msgstr "Nemoj automatski odjaviti korisnika"
#. module: hr_attendance_autoclose
#: model:ir.model,name:hr_attendance_autoclose.model_hr_employee
msgid "Employee"
msgstr "Djelatnik"
#. module: hr_attendance_autoclose
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_res_company__hr_attendance_autoclose_reason
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_res_config_settings__hr_attendance_autoclose_reason
msgid "Hr Attendance Autoclose Reason"
msgstr ""
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid "Max Hours Per Day"
msgstr ""
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid ""
"This reason will be added to an attendance\n"
" when it's autoclosed."
msgstr ""
#. module: hr_attendance_autoclose
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_hr_attendance__open_worked_hours
msgid "Worked hours"
msgstr "Odrađeno sati"

View file

@ -1,98 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_attendance_autoclose
#
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_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid ""
"<span class=\"fa fa-lg fa-building-o\" title=\"Values set here are company-"
"specific.\" groups=\"base.group_multi_company\"/>"
msgstr ""
#. module: hr_attendance_autoclose
#: model:ir.model,name:hr_attendance_autoclose.model_hr_attendance
msgid "Attendance"
msgstr ""
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid "Attendance Autoclosing"
msgstr ""
#. module: hr_attendance_autoclose
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_res_company__attendance_maximum_hours_per_day
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_res_config_settings__attendance_maximum_hours_per_day
msgid "Attendance Maximum Hours Per Day"
msgstr ""
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid ""
"Attendance lines longer than this value will\n"
" be automatically closed."
msgstr ""
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid "Autoclose Reason"
msgstr ""
#. module: hr_attendance_autoclose
#: model:ir.actions.server,name:hr_attendance_autoclose.check_attendance_cron_ir_actions_server
#: model:ir.cron,cron_name:hr_attendance_autoclose.check_attendance_cron
msgid "Check Attendance"
msgstr ""
#. module: hr_attendance_autoclose
#: model:ir.model,name:hr_attendance_autoclose.model_res_company
msgid "Companies"
msgstr ""
#. module: hr_attendance_autoclose
#: model:ir.model,name:hr_attendance_autoclose.model_res_config_settings
msgid "Config Settings"
msgstr ""
#. module: hr_attendance_autoclose
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_hr_employee__no_autoclose
msgid "Don't Autoclose Attendances"
msgstr ""
#. module: hr_attendance_autoclose
#: model:ir.model,name:hr_attendance_autoclose.model_hr_employee
msgid "Employee"
msgstr ""
#. module: hr_attendance_autoclose
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_res_company__hr_attendance_autoclose_reason
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_res_config_settings__hr_attendance_autoclose_reason
msgid "Hr Attendance Autoclose Reason"
msgstr ""
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid "Max Hours Per Day"
msgstr ""
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid ""
"This reason will be added to an attendance\n"
" when it's autoclosed."
msgstr ""
#. module: hr_attendance_autoclose
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_hr_attendance__open_worked_hours
msgid "Worked hours"
msgstr ""

View file

@ -1,119 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_attendance_autoclose
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2023-11-12 17:38+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_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid ""
"<span class=\"fa fa-lg fa-building-o\" title=\"Values set here are company-"
"specific.\" groups=\"base.group_multi_company\"/>"
msgstr ""
"<span class=\"fa fa-lg fa-building-o\" title=\"I valori impostati qui sono "
"specifici per azienda.\" groups=\"base.group_multi_company\"/>"
#. module: hr_attendance_autoclose
#: model:ir.model,name:hr_attendance_autoclose.model_hr_attendance
msgid "Attendance"
msgstr "Presenza"
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid "Attendance Autoclosing"
msgstr "Auto chiusura presenza"
#. module: hr_attendance_autoclose
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_res_company__attendance_maximum_hours_per_day
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_res_config_settings__attendance_maximum_hours_per_day
msgid "Attendance Maximum Hours Per Day"
msgstr "Massimo numero di ore di presenza al giorno"
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid ""
"Attendance lines longer than this value will\n"
" be automatically closed."
msgstr ""
"Le presenze più lunghe di questo \n"
" valore saranno chiuse automaticamente."
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid "Autoclose Reason"
msgstr "Motivazione chiusura automatica"
#. module: hr_attendance_autoclose
#: model:ir.actions.server,name:hr_attendance_autoclose.check_attendance_cron_ir_actions_server
#: model:ir.cron,cron_name:hr_attendance_autoclose.check_attendance_cron
msgid "Check Attendance"
msgstr "Controlla presenze"
#. module: hr_attendance_autoclose
#: model:ir.model,name:hr_attendance_autoclose.model_res_company
msgid "Companies"
msgstr "Aziende"
#. module: hr_attendance_autoclose
#: model:ir.model,name:hr_attendance_autoclose.model_res_config_settings
msgid "Config Settings"
msgstr "Impostazioni configurazione"
#. module: hr_attendance_autoclose
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_hr_employee__no_autoclose
msgid "Don't Autoclose Attendances"
msgstr "Non chiudere le presenze automaticamente"
#. module: hr_attendance_autoclose
#: model:ir.model,name:hr_attendance_autoclose.model_hr_employee
msgid "Employee"
msgstr "Dipendente"
#. module: hr_attendance_autoclose
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_res_company__hr_attendance_autoclose_reason
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_res_config_settings__hr_attendance_autoclose_reason
msgid "Hr Attendance Autoclose Reason"
msgstr "Motivazione chiusura automatica presenze RU"
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid "Max Hours Per Day"
msgstr "Massimo di ore al giorno"
#. module: hr_attendance_autoclose
#: model_terms:ir.ui.view,arch_db:hr_attendance_autoclose.res_config_settings_view_form
msgid ""
"This reason will be added to an attendance\n"
" when it's autoclosed."
msgstr ""
"Questa motivazione sarà aggiunta ad una presenza\n"
" quando viene chiusa automaticamente."
#. module: hr_attendance_autoclose
#: model:ir.model.fields,field_description:hr_attendance_autoclose.field_hr_attendance__open_worked_hours
msgid "Worked hours"
msgstr "Ore lavorate"
#~ msgid "Display Name"
#~ msgstr "Nome visualizzato"
#~ msgid "ID"
#~ msgstr "ID"
#~ msgid "Last Modified on"
#~ msgstr "Ultima modifica il"
#~ msgid "System automatic check out due to inactivity"
#~ msgstr "Presenza chiusa automaticamente dal sistema causa inattività"

View file

@ -1,4 +0,0 @@
from . import hr_attendance
from . import hr_employee
from . import res_company
from . import res_config_settings

View file

@ -1,57 +0,0 @@
# Copyright 2018 ForgeFlow, S.L.
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
from datetime import datetime, timedelta
from odoo import api, fields, models
class HrAttendance(models.Model):
_inherit = "hr.attendance"
open_worked_hours = fields.Float(
string="Worked hours",
compute="_compute_open_worked_hours",
)
@api.depends("check_out", "check_in")
def _compute_open_worked_hours(self):
for item in self:
item_from = item.check_out if item.check_out else datetime.now()
delta = item_from - item.check_in
item.open_worked_hours = delta.total_seconds() / 3600.0
def autoclose_attendance(self, reason):
self.ensure_one()
max_hours = self.employee_id.company_id.attendance_maximum_hours_per_day
leave_time = self.check_in + timedelta(hours=max_hours)
vals = {"check_out": leave_time}
if reason:
vals["attendance_reason_ids"] = [(4, reason.id)]
self.write(vals)
def needs_autoclose(self):
self.ensure_one()
max_hours = self.employee_id.company_id.attendance_maximum_hours_per_day
close = not self.employee_id.no_autoclose
return close and max_hours and self.open_worked_hours > max_hours
@api.model
def check_for_incomplete_attendances(self):
stale_attendances = self.search([("check_out", "=", False)])
reason = self.env.company.hr_attendance_autoclose_reason
for att in stale_attendances.filtered(lambda a: a.needs_autoclose()):
att.autoclose_attendance(reason)
@api.constrains("check_in", "check_out", "employee_id")
def _check_validity(self):
"""If this is an automatic checkout the constraint is invalid
as there may be old attendances not closed
"""
reason = self.env.company.hr_attendance_autoclose_reason
if reason and self.filtered(
lambda att: att.attendance_reason_ids
and reason in att.attendance_reason_ids
):
return True
return super()._check_validity()

View file

@ -1,13 +0,0 @@
# Copyright 2019 Creu Blanca
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class HrEmployee(models.Model):
_inherit = "hr.employee"
no_autoclose = fields.Boolean(
string="Don't Autoclose Attendances", groups="hr.group_hr_user"
)

View file

@ -1,16 +0,0 @@
# Copyright 2018 ForgeFlow, S.L.
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
from odoo import fields, models
class ResCompany(models.Model):
_inherit = "res.company"
attendance_maximum_hours_per_day = fields.Float(digits=(2, 2), default=11.0)
hr_attendance_autoclose_reason = fields.Many2one(
"hr.attendance.reason",
default=lambda self: self.env.ref(
"hr.attendance_reason.hr_attendance_reason_check_out",
raise_if_not_found=False,
),
)

View file

@ -1,14 +0,0 @@
from odoo import fields, models
class ResConfigSettings(models.TransientModel):
_inherit = "res.config.settings"
attendance_maximum_hours_per_day = fields.Float(
related="company_id.attendance_maximum_hours_per_day",
readonly=False,
)
hr_attendance_autoclose_reason = fields.Many2one(
related="company_id.hr_attendance_autoclose_reason",
readonly=False,
)

View file

@ -1,8 +0,0 @@
* Aaron Henriquez <ahforgeflow@forgeflow.com>
* Kitti U. <kittiu@ecosoft.co.th>
* `Tecnativa <https://www.tecnativa.com>`_:
* Víctor Martínez
* Foram Shah <foram.shah@initos.com>

View file

@ -1,5 +0,0 @@
This module close stale attendances automatically. Without this module, when
an employee forgets to check out at the end on the day and the next day the
employee does not realize of that, then the error is propagated and all the
attendances are wrong. With this module only the attendance with the issue is
wrong, and the manager knows the system closes the attendance, not the employee

View file

@ -1,4 +0,0 @@
#. Go to *Attendances > Configuration > Configuration*.
#. Set the maximum number of hours allowed for an attendance.
#. Go to *Attendances > Manage Attendances > Attendances*.
#. Attendance are automatically closed if they have remained open for longer than specified in the setting.

View file

@ -1,440 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!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 Auto Close</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
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: grey; } /* 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 {
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-auto-close">
<h1 class="title">HR Attendance Auto Close</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:56931643c0fd1e22f3f6ec466df0d4158ee820e4d48434437e20cdaa10e01021
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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_autoclose"><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_autoclose"><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>This module close stale attendances automatically. Without this module, when
an employee forgets to check out at the end on the day and the next day the
employee does not realize of that, then the error is propagated and all the
attendances are wrong. With this module only the attendance with the issue is
wrong, and the manager knows the system closes the attendance, not the employee</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#usage" id="toc-entry-1">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-2">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-3">Credits</a><ul>
<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="usage">
<h1><a class="toc-backref" href="#toc-entry-1">Usage</a></h1>
<ol class="arabic simple">
<li>Go to <em>Attendances &gt; Configuration &gt; Configuration</em>.</li>
<li>Set the maximum number of hours allowed for an attendance.</li>
<li>Go to <em>Attendances &gt; Manage Attendances &gt; Attendances</em>.</li>
<li>Attendance are automatically closed if they have remained open for longer than specified in the setting.</li>
</ol>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-2">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_autoclose%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-3">Credits</a></h1>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-4">Contributors</a></h2>
<ul>
<li><p class="first">Aaron Henriquez &lt;<a class="reference external" href="mailto:ahforgeflow&#64;forgeflow.com">ahforgeflow&#64;forgeflow.com</a>&gt;</p>
</li>
<li><p class="first">Kitti U. &lt;<a class="reference external" href="mailto:kittiu&#64;ecosoft.co.th">kittiu&#64;ecosoft.co.th</a>&gt;</p>
</li>
<li><p class="first"><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a>:</p>
<blockquote>
<ul class="simple">
<li>Víctor Martínez</li>
</ul>
</blockquote>
</li>
<li><p class="first">Foram Shah &lt;<a class="reference external" href="mailto:foram.shah&#64;initos.com">foram.shah&#64;initos.com</a>&gt;</p>
</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_autoclose">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

@ -1 +0,0 @@
from . import test_hr_attendance_auto_close

View file

@ -1,65 +0,0 @@
# Copyright 2018 ForgeFlow, S.L.
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
from datetime import datetime
from dateutil.relativedelta import relativedelta
from odoo.tests import common, new_test_user, users
from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT as DF
class TestHrAttendanceReason(common.TransactionCase):
def setUp(self):
super().setUp()
self.hr_attendance = self.env["hr.attendance"]
self.employee = self.env["hr.employee"].create({"name": "Employee"})
new_test_user(self.env, login="test-user")
def test_employee_edit(self):
dti = datetime.now()
dto = datetime.now() + relativedelta(hours=7)
att = self.hr_attendance.create(
{
"employee_id": self.employee.id,
"check_in": dti.strftime(DF),
"check_out": dto.strftime(DF),
}
)
self.assertEqual(att.open_worked_hours, 7.0, "Wrong hours")
dt = datetime.now().replace(
hour=0, minute=0, second=0, microsecond=0
) - relativedelta(hours=15)
att = self.hr_attendance.create(
{"employee_id": self.employee.id, "check_in": dt.strftime(DF)}
)
self.hr_attendance.check_for_incomplete_attendances()
self.assertEqual(att.worked_hours, 11.0, "Attendance not closed")
reason = self.env.company.hr_attendance_autoclose_reason
reason.unlink()
dti += relativedelta(hours=10)
dto += relativedelta(hours=10)
att2 = self.hr_attendance.create(
{
"employee_id": self.employee.id,
"check_in": dti.strftime(DF),
"check_out": dto.strftime(DF),
}
)
self.hr_attendance.check_for_incomplete_attendances()
self.assertFalse(att2.attendance_reason_ids)
@users("test-user")
def test_hr_employee_can_still_read_employee_and_hr_public_employee(self):
"""This test ensure the following comment from hr.employee model has been take
in consideration::
NB: Any field only available on the model hr.employee (i.e. not on the
hr.employee.public model) should have `groups="hr.group_hr_user"` on its
definition to avoid being prefetched when the user hasn't access to the
hr.employee model. Indeed, the prefetch loads the data for all the fields
that are available according to the group defined on them.
"""
for empl in self.env["hr.employee"].search([]):
self.assertTrue(empl.name)

View file

@ -1,28 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="hr_attendance_view_form" model="ir.ui.view">
<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="priority">400</field>
<field name="arch" type="xml">
<field name="check_out" position="after">
<field name="open_worked_hours" widget="float_time" />
</field>
</field>
</record>
<record id="view_attendance_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="priority">400</field>
<field name="arch" type="xml">
<field name="check_out" position="after">
<field name="open_worked_hours" widget="float_time" />
</field>
<field name="worked_hours" position="attributes">
<attribute name="invisible">1</attribute>
</field>
</field>
</record>
</odoo>

View file

@ -1,18 +0,0 @@
<?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="view_employee_form_inherit_hr_attendance">
<field name="name">hr.employee.form (in hr_attendance_autoclose)</field>
<field name="model">hr.employee</field>
<field
name="inherit_id"
ref="hr_attendance.view_employee_form_inherit_hr_attendance"
/>
<field name="arch" type="xml">
<xpath expr="//group[@name='identification_group']" position="inside">
<field name="no_autoclose" />
</xpath>
</field>
</record>
</odoo>

View file

@ -1,70 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="hr_attendance.res_config_settings_view_form" />
<field name="arch" type="xml">
<xpath expr="//div[@data-key='hr_attendance']" position="inside">
<h2>Attendance Autoclosing</h2>
<div
class="row mt16 o_settings_container"
name="attendance_autoclose_settings_container"
>
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_left_pane" />
<div class="o_setting_right_pane">
<label
string="Max Hours Per Day"
for="attendance_maximum_hours_per_day"
/>
<span
class="fa fa-lg fa-building-o"
title="Values set here are company-specific."
groups="base.group_multi_company"
/>
<div class="row">
<div class="text-muted col-lg-8">
Attendance lines longer than this value will
be automatically closed.
</div>
</div>
<div class="content-group mt16">
<field
name="attendance_maximum_hours_per_day"
widget="float_time"
/>
</div>
</div>
</div>
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_left_pane" />
<div class="o_setting_right_pane">
<label
string="Autoclose Reason"
for="hr_attendance_autoclose_reason"
/>
<span
class="fa fa-lg fa-building-o"
title="Values set here are company-specific."
groups="base.group_multi_company"
/>
<div class="row">
<div class="text-muted col-lg-8">
This reason will be added to an attendance
when it's autoclosed.
</div>
</div>
<div class="content-group mt16">
<field
name="hr_attendance_autoclose_reason"
can_create="true"
can_write="true"
/>
</div>
</div>
</div>
</div>
</xpath>
</field>
</record>
</odoo>

View file

@ -1,42 +0,0 @@
[project]
name = "odoo-bringout-oca-hr-attendance-hr_attendance_autoclose"
version = "16.0.0"
description = "HR Attendance Auto Close - Close stale Attendances"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-hr-attendance-hr_attendance_reason>=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_autoclose"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]

View file

@ -1,45 +0,0 @@
# Add calendar view to attendance, hr_attendance_calendar_view
Odoo addon: hr_attendance_calendar_view
## Installation
```bash
pip install odoo-bringout-oca-hr-attendance-hr_attendance_calendar_view
```
## Dependencies
This addon depends on:
- base
- hr_attendance
## Manifest Information
- **Name**: Add calendar view to attendance, hr_attendance_calendar_view
- **Version**: 16.0.1.0.0
- **Category**: Human Resources
- **License**: AGPL-3
- **Installable**: False
## Source
Based on [OCA/hr-attendance](https://github.com/OCA/hr-attendance) branch 16.0, addon `hr_attendance_calendar_view`.
## 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

@ -1,32 +0,0 @@
# 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_calendar_view Module - hr_attendance_calendar_view
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

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

View file

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

View file

@ -1,6 +0,0 @@
# Dependencies
This addon depends on:
- base
- [hr_attendance](https://github.com/bringout/oca-ocb-hr/tree/dc1405e12dbe76ffb119a0feb323b56ae2c58522/odoo-bringout-oca-ocb-hr_attendance)

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,8 +0,0 @@
# 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

@ -1,5 +0,0 @@
# 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

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

View file

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

View file

@ -1,66 +0,0 @@
============================================================
Add calendar view to attendance, hr_attendance_calendar_view
============================================================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:7f70efbae52a175e0a934fe1a21bad086460643b0029288e566580753f7c224e
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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_calendar_view
: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_calendar_view
: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|
Calendar view for attendances.
**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_calendar_view%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
=======
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_calendar_view>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -1,17 +0,0 @@
# Copyright 2023 JumpTo
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "Add calendar view to attendance, hr_attendance_calendar_view",
"summary": """
This module adds the calendar view as an option to display attendance""",
"license": "AGPL-3",
"author": "Odoo Community Association (OCA)",
"website": "https://github.com/OCA/hr-attendance",
"category": "Human Resources",
"version": "16.0.1.0.0",
"depends": ["base", "hr_attendance"],
"data": [
"views/hr_attendance_calendar_views.xml",
],
}

View file

@ -1,19 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_attendance_calendar_view
#
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_calendar_view
#: model_terms:ir.ui.view,arch_db:hr_attendance_calendar_view.view_attendance_calendar
msgid "Employee attendances"
msgstr "Prisutnosti zaposlenih"

View file

@ -1,19 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_attendance_calendar_view
#
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_calendar_view
#: model_terms:ir.ui.view,arch_db:hr_attendance_calendar_view.view_attendance_calendar
msgid "Employee attendances"
msgstr ""

View file

@ -1,22 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_attendance_calendar_view
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2023-11-12 17:38+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_calendar_view
#: model_terms:ir.ui.view,arch_db:hr_attendance_calendar_view.view_attendance_calendar
msgid "Employee attendances"
msgstr "Presenze dipendente"

View file

@ -1,407 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!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>Add calendar view to attendance, hr_attendance_calendar_view</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
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: grey; } /* 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 {
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="add-calendar-view-to-attendance-hr-attendance-calendar-view">
<h1 class="title">Add calendar view to attendance, hr_attendance_calendar_view</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:7f70efbae52a175e0a934fe1a21bad086460643b0029288e566580753f7c224e
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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_calendar_view"><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_calendar_view"><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>Calendar view for attendances.</p>
<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="#maintainers" id="toc-entry-3">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_calendar_view%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="maintainers">
<h2><a class="toc-backref" href="#toc-entry-3">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_calendar_view">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

@ -1,21 +0,0 @@
<odoo>
<record id="hr_attendance.hr_attendance_action" model="ir.actions.act_window">
<field name="view_mode">tree,kanban,calendar,form</field>
</record>
<record id="view_attendance_calendar" model="ir.ui.view">
<field name="name">hr.attendance.calendar</field>
<field name="model">hr.attendance</field>
<field name="arch" type="xml">
<!-- enable quick_add will result of an error as model hr.attendance doesnt have editable name field -->
<calendar
string="Employee attendances"
date_start="check_in"
date_stop="check_out"
color="employee_id"
quick_add="false"
>
<field name="employee_id" />
</calendar>
</field>
</record>
</odoo>

View file

@ -1,44 +0,0 @@
[project]
name = "odoo-bringout-oca-hr-attendance-hr_attendance_calendar_view"
version = "16.0.0"
description = "Add calendar view to attendance, hr_attendance_calendar_view -
This module adds the calendar view as an option to display attendance"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-ocb-base>=16.0.0",
"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_calendar_view"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]

View file

@ -1,44 +0,0 @@
# Hr Attendance Geolocation
Odoo addon: hr_attendance_geolocation
## Installation
```bash
pip install odoo-bringout-oca-hr-attendance-hr_attendance_geolocation
```
## Dependencies
This addon depends on:
- hr_attendance
## Manifest Information
- **Name**: Hr Attendance Geolocation
- **Version**: 16.0.1.0.2
- **Category**: N/A
- **License**: AGPL-3
- **Installable**: False
## Source
Based on [OCA/hr-attendance](https://github.com/OCA/hr-attendance) branch 16.0, addon `hr_attendance_geolocation`.
## 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

@ -1,32 +0,0 @@
# 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_geolocation Module - hr_attendance_geolocation
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

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,8 +0,0 @@
# 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

@ -1,5 +0,0 @@
# 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

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

View file

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

View file

@ -1,79 +0,0 @@
=========================
Hr Attendance Geolocation
=========================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:e8682cd0217726a3dc3bab7206ccf82e01102a87ecc8ec6163d319f60ba4586d
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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_geolocation
: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_geolocation
: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|
With this module the geolocation of the user is tracked at the
check-in/check-out step.
This feature is available only in secure contexts (HTTPS).
**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_geolocation%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
~~~~~~~
* ForgeFlow S.L.
Contributors
~~~~~~~~~~~~
* Adria Gil Sorribes <adria.gil@forgeFlow.com>
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_geolocation>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -1,23 +0,0 @@
# Copyright 2019 ForgeFlow S.L.
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "Hr Attendance Geolocation",
"summary": """
With this module the geolocation of the user is tracked at the
check-in/check-out step""",
"version": "16.0.1.0.2",
"license": "AGPL-3",
"author": "ForgeFlow S.L., Odoo Community Association (OCA)",
"website": "https://github.com/OCA/hr-attendance",
"depends": ["hr_attendance"],
"data": [
"views/hr_attendance_views.xml",
"data/location_data.xml",
],
"assets": {
"web.assets_backend": [
"hr_attendance_geolocation/static/src/js/attendance_geolocation.js",
],
},
}

View file

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<record forcecreate="True" id="decimal_location" model="decimal.precision">
<field name="name">Location</field>
<field name="digits" eval="7" />
</record>
</odoo>

View file

@ -1,86 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_attendance_geolocation
#
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_geolocation
#: model_terms:ir.ui.view,arch_db:hr_attendance_geolocation.hr_attendance_view_form
msgid ""
"<br/>\n"
" Longitude:"
msgstr ""
#. module: hr_attendance_geolocation
#: model:ir.model,name:hr_attendance_geolocation.model_hr_attendance
msgid "Attendance"
msgstr "Prisutnost"
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_in_latitude
msgid "Check In Latitude"
msgstr "Geografska širina prijave"
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_in_longitude
msgid "Check In Longitude"
msgstr "Geografska dužina prijave"
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_out_latitude
msgid "Check Out Latitude"
msgstr "Geografska širina odjave"
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_out_longitude
msgid "Check Out Longitude"
msgstr "Geografska dužina odjave"
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_in_latitude_text
msgid "Check-in Latitude"
msgstr "Geografska širina prijave"
#. module: hr_attendance_geolocation
#: model_terms:ir.ui.view,arch_db:hr_attendance_geolocation.hr_attendance_view_form
msgid "Check-in Location"
msgstr "Lokacija prijave"
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_in_longitude_text
msgid "Check-in Longitude"
msgstr "Geografska dužina prijave"
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_out_latitude_text
msgid "Check-out Latitude"
msgstr "Geografska širina odjave"
#. module: hr_attendance_geolocation
#: model_terms:ir.ui.view,arch_db:hr_attendance_geolocation.hr_attendance_view_form
msgid "Check-out Location"
msgstr "Lokacija odjave"
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_out_longitude_text
msgid "Check-out Longitude"
msgstr "Geografska dužina odjave"
#. module: hr_attendance_geolocation
#: model:ir.model,name:hr_attendance_geolocation.model_hr_employee
msgid "Employee"
msgstr "Zaposleni"
#. module: hr_attendance_geolocation
#: model_terms:ir.ui.view,arch_db:hr_attendance_geolocation.hr_attendance_view_form
msgid "Latitude:"
msgstr "Geografska širina:"

View file

@ -1,91 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_attendance_geolocation
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2023-11-02 18:37+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_geolocation
#: model_terms:ir.ui.view,arch_db:hr_attendance_geolocation.hr_attendance_view_form
msgid ""
"<br/>\n"
" Longitude:"
msgstr ""
"<br/>\n"
" Longitud:"
#. module: hr_attendance_geolocation
#: model:ir.model,name:hr_attendance_geolocation.model_hr_attendance
msgid "Attendance"
msgstr "Asistencias"
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_in_latitude
msgid "Check In Latitude"
msgstr "Latitud de Registro"
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_in_longitude
msgid "Check In Longitude"
msgstr "Longitud de Registro"
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_out_latitude
msgid "Check Out Latitude"
msgstr "Latitud de Salida"
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_out_longitude
msgid "Check Out Longitude"
msgstr "Longitud de Salida"
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_in_latitude_text
msgid "Check-in Latitude"
msgstr "Latitud de Registro"
#. module: hr_attendance_geolocation
#: model_terms:ir.ui.view,arch_db:hr_attendance_geolocation.hr_attendance_view_form
msgid "Check-in Location"
msgstr "Ubicación de Registro"
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_in_longitude_text
msgid "Check-in Longitude"
msgstr "Longitud de Registro"
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_out_latitude_text
msgid "Check-out Latitude"
msgstr "Latitud de Salida"
#. module: hr_attendance_geolocation
#: model_terms:ir.ui.view,arch_db:hr_attendance_geolocation.hr_attendance_view_form
msgid "Check-out Location"
msgstr "Ubicación de Salida"
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_out_longitude_text
msgid "Check-out Longitude"
msgstr "Longitud de Salida"
#. module: hr_attendance_geolocation
#: model:ir.model,name:hr_attendance_geolocation.model_hr_employee
msgid "Employee"
msgstr "Empleado/a"
#. module: hr_attendance_geolocation
#: model_terms:ir.ui.view,arch_db:hr_attendance_geolocation.hr_attendance_view_form
msgid "Latitude:"
msgstr "Latitud:"

View file

@ -1,86 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_attendance_geolocation
#
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_geolocation
#: model_terms:ir.ui.view,arch_db:hr_attendance_geolocation.hr_attendance_view_form
msgid ""
"<br/>\n"
" Longitude:"
msgstr ""
#. module: hr_attendance_geolocation
#: model:ir.model,name:hr_attendance_geolocation.model_hr_attendance
msgid "Attendance"
msgstr ""
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_in_latitude
msgid "Check In Latitude"
msgstr ""
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_in_longitude
msgid "Check In Longitude"
msgstr ""
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_out_latitude
msgid "Check Out Latitude"
msgstr ""
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_out_longitude
msgid "Check Out Longitude"
msgstr ""
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_in_latitude_text
msgid "Check-in Latitude"
msgstr ""
#. module: hr_attendance_geolocation
#: model_terms:ir.ui.view,arch_db:hr_attendance_geolocation.hr_attendance_view_form
msgid "Check-in Location"
msgstr ""
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_in_longitude_text
msgid "Check-in Longitude"
msgstr ""
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_out_latitude_text
msgid "Check-out Latitude"
msgstr ""
#. module: hr_attendance_geolocation
#: model_terms:ir.ui.view,arch_db:hr_attendance_geolocation.hr_attendance_view_form
msgid "Check-out Location"
msgstr ""
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_out_longitude_text
msgid "Check-out Longitude"
msgstr ""
#. module: hr_attendance_geolocation
#: model:ir.model,name:hr_attendance_geolocation.model_hr_employee
msgid "Employee"
msgstr ""
#. module: hr_attendance_geolocation
#: model_terms:ir.ui.view,arch_db:hr_attendance_geolocation.hr_attendance_view_form
msgid "Latitude:"
msgstr ""

View file

@ -1,91 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_attendance_geolocation
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2023-11-23 19:36+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_geolocation
#: model_terms:ir.ui.view,arch_db:hr_attendance_geolocation.hr_attendance_view_form
msgid ""
"<br/>\n"
" Longitude:"
msgstr ""
"<br/>\n"
" Longitudine:"
#. module: hr_attendance_geolocation
#: model:ir.model,name:hr_attendance_geolocation.model_hr_attendance
msgid "Attendance"
msgstr "Presenza"
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_in_latitude
msgid "Check In Latitude"
msgstr "Latitudine check-in"
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_in_longitude
msgid "Check In Longitude"
msgstr "Longitudine check-in"
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_out_latitude
msgid "Check Out Latitude"
msgstr "Latitudine check-out"
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_out_longitude
msgid "Check Out Longitude"
msgstr "Longitudine check-out"
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_in_latitude_text
msgid "Check-in Latitude"
msgstr "Latitudine check-in"
#. module: hr_attendance_geolocation
#: model_terms:ir.ui.view,arch_db:hr_attendance_geolocation.hr_attendance_view_form
msgid "Check-in Location"
msgstr "Ubicazione check-in"
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_in_longitude_text
msgid "Check-in Longitude"
msgstr "Longitudine check-in"
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_out_latitude_text
msgid "Check-out Latitude"
msgstr "Latitudine check-out"
#. module: hr_attendance_geolocation
#: model_terms:ir.ui.view,arch_db:hr_attendance_geolocation.hr_attendance_view_form
msgid "Check-out Location"
msgstr "Ubicazione check-out"
#. module: hr_attendance_geolocation
#: model:ir.model.fields,field_description:hr_attendance_geolocation.field_hr_attendance__check_out_longitude_text
msgid "Check-out Longitude"
msgstr "Longitudine check-out"
#. module: hr_attendance_geolocation
#: model:ir.model,name:hr_attendance_geolocation.model_hr_employee
msgid "Employee"
msgstr "Dipendente"
#. module: hr_attendance_geolocation
#: model_terms:ir.ui.view,arch_db:hr_attendance_geolocation.hr_attendance_view_form
msgid "Latitude:"
msgstr "Latitudine:"

View file

@ -1,2 +0,0 @@
from . import hr_attendance
from . import hr_employee

View file

@ -1,80 +0,0 @@
# Copyright 2019 ForgeFlow S.L.
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models
class HrAttendance(models.Model):
_inherit = "hr.attendance"
check_in_latitude = fields.Float(digits="Location", readonly=True)
check_in_latitude_text = fields.Char(
"Check-in Latitude", compute="_compute_check_in_latitude_text"
)
check_in_longitude = fields.Float(digits="Location", readonly=True)
check_in_longitude_text = fields.Char(
"Check-in Longitude", compute="_compute_check_in_longitude_text"
)
check_out_latitude = fields.Float(digits="Location", readonly=True)
check_out_latitude_text = fields.Char(
"Check-out Latitude", compute="_compute_check_out_latitude_text"
)
check_out_longitude = fields.Float(digits="Location", readonly=True)
check_out_longitude_text = fields.Char(
"Check-out Longitude", compute="_compute_check_out_longitude_text"
)
def _get_raw_value_from_geolocation(self, dd):
d = int(dd)
m = int((dd - d) * 60)
s = (dd - d - m / 60) * 3600.00
z = round(s, 2)
return "%sº %s' %s\"" % (abs(d), abs(m), abs(z))
def _get_latitude_raw_value(self, dd):
return "%s %s" % (
"N" if int(dd) >= 0 else "S",
self._get_raw_value_from_geolocation(dd),
)
def _get_longitude_raw_value(self, dd):
return "%s %s" % (
"E" if int(dd) >= 0 else "W",
self._get_raw_value_from_geolocation(dd),
)
@api.depends("check_in_latitude")
def _compute_check_in_latitude_text(self):
for item in self:
item.check_in_latitude_text = (
self._get_latitude_raw_value(item.check_in_latitude)
if item.check_in_latitude
else False
)
@api.depends("check_in_longitude")
def _compute_check_in_longitude_text(self):
for item in self:
item.check_in_longitude_text = (
self._get_longitude_raw_value(item.check_in_longitude)
if item.check_in_longitude
else False
)
@api.depends("check_out_latitude")
def _compute_check_out_latitude_text(self):
for item in self:
item.check_out_latitude_text = (
self._get_latitude_raw_value(item.check_out_latitude)
if item.check_out_latitude
else False
)
@api.depends("check_out_longitude")
def _compute_check_out_longitude_text(self):
for item in self:
item.check_out_longitude_text = (
self._get_longitude_raw_value(item.check_out_longitude)
if item.check_out_longitude
else False
)

View file

@ -1,30 +0,0 @@
# Copyright 2019 ForgeFlow S.L.
# Copyright 2023 Tecnativa - Víctor Martínez
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import models
class HrEmployee(models.Model):
_inherit = "hr.employee"
def _attendance_action_change(self):
res = super()._attendance_action_change()
latitude = self.env.context.get("latitude", False)
longitude = self.env.context.get("longitude", False)
if latitude and longitude:
if self.attendance_state == "checked_in":
res.write(
{
"check_in_latitude": latitude,
"check_in_longitude": longitude,
}
)
else:
res.write(
{
"check_out_latitude": latitude,
"check_out_longitude": longitude,
}
)
return res

View file

@ -1 +0,0 @@
* Adria Gil Sorribes <adria.gil@forgeFlow.com>

View file

@ -1,4 +0,0 @@
With this module the geolocation of the user is tracked at the
check-in/check-out step.
This feature is available only in secure contexts (HTTPS).

View file

@ -1,425 +0,0 @@
<!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 Geolocation</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-geolocation">
<h1 class="title">Hr Attendance Geolocation</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:e8682cd0217726a3dc3bab7206ccf82e01102a87ecc8ec6163d319f60ba4586d
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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_geolocation"><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_geolocation"><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>With this module the geolocation of the user is tracked at the
check-in/check-out step.</p>
<p>This feature is available only in secure contexts (HTTPS).</p>
<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_geolocation%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>ForgeFlow S.L.</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-4">Contributors</a></h2>
<ul class="simple">
<li>Adria Gil Sorribes &lt;<a class="reference external" href="mailto:adria.gil&#64;forgeFlow.com">adria.gil&#64;forgeFlow.com</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_geolocation">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

@ -1,149 +0,0 @@
odoo.define("hr_attendance_geolocation.attendances_geolocation", function (require) {
"use strict";
var MyAttendances = require("hr_attendance.my_attendances");
var KioskConfirm = require("hr_attendance.kiosk_confirm");
const session = require("web.session");
MyAttendances.include({
// eslint-disable-next-line no-unused-vars
init: function (parent, action) {
this._super.apply(this, arguments);
this.location = (null, null);
this.errorCode = null;
},
update_attendance: function () {
var self = this;
var options = {
enableHighAccuracy: true,
timeout: 5000,
maximumAge: 60000,
};
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(
self._manual_attendance.bind(self),
self._getPositionError.bind(self),
options
);
}
},
_manual_attendance: function (position) {
var self = this;
const ctx = Object.assign(session.user_context, {
latitude: position.coords.latitude,
longitude: position.coords.longitude,
});
this._rpc({
model: "hr.employee",
method: "attendance_manual",
args: [
[self.employee.id],
"hr_attendance.hr_attendance_action_my_attendances",
],
context: ctx,
}).then(function (result) {
if (result.action) {
self.do_action(result.action);
} else if (result.warning) {
self.do_warn(result.warning);
}
});
},
_getPositionError: function (error) {
console.warn("ERROR(" + error.code + "): " + error.message);
const position = {
coords: {
latitude: 0.0,
longitude: 0.0,
},
};
this._manual_attendance(position);
},
});
KioskConfirm.include({
events: _.extend(KioskConfirm.prototype.events, {
"click .o_hr_attendance_sign_in_out_icon": _.debounce(
function () {
this.update_attendance();
},
200,
true
),
"click .o_hr_attendance_pin_pad_button_ok": _.debounce(
function () {
this.pin_pad = true;
this.update_attendance();
},
200,
true
),
}),
// eslint-disable-next-line no-unused-vars
init: function (parent, action) {
this._super.apply(this, arguments);
this.pin_pad = false;
},
update_attendance: function () {
var self = this;
var options = {
enableHighAccuracy: true,
timeout: 5000,
maximumAge: 0,
};
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(
self._manual_attendance.bind(self),
self._getPositionError.bind(self),
options
);
}
},
_manual_attendance: function (position) {
var self = this;
var pinBoxVal = null;
if (this.pin_pad) {
this.$(".o_hr_attendance_pin_pad_button_ok").attr(
"disabled",
"disabled"
);
pinBoxVal = this.$(".o_hr_attendance_PINbox").val();
}
const ctx = Object.assign(session.user_context, {
latitude: position.coords.latitude,
longitude: position.coords.longitude,
});
this._rpc({
model: "hr.employee",
method: "attendance_manual",
args: [[this.employee_id], this.next_action, pinBoxVal],
context: ctx,
}).then(function (result) {
if (result.action) {
self.do_action(result.action);
} else if (result.warning) {
self.displayNotification({title: result.warning, type: "danger"});
if (self.pin_pad) {
self.$(".o_hr_attendance_PINbox").val("");
setTimeout(function () {
self.$(".o_hr_attendance_pin_pad_button_ok").removeAttr(
"disabled"
);
}, 500);
}
self.pin_pad = false;
}
});
},
_getPositionError: function (error) {
console.warn("ERROR(" + error.code + "): " + error.message);
const position = {
coords: {
latitude: 0.0,
longitude: 0.0,
},
};
this._manual_attendance(position);
},
});
});

View file

@ -1 +0,0 @@
from . import test_hr_attendance_geolocation

View file

@ -1,33 +0,0 @@
# Copyright 2019 ForgeFlow, S.L.
# Copyright 2023 Tecnativa - Víctor Martínez
# License LGPL-3 - See http://www.gnu.org/licenses/lgpl-3.0.html
from odoo.tests.common import TransactionCase
class TestHrAttendanceGeolocation(TransactionCase):
def setUp(self):
super().setUp()
self.hr_attendance_model = self.env["hr.attendance"]
self.hr_employee_model = self.env["hr.employee"]
self.employee = self.hr_employee_model.create({"name": "Employee A"})
self.location = ["41.3910970", "2.1548569"]
def test_attendance_geolocation(self):
# Called from js
lat, long = self.location
self.employee.with_context(latitude=lat, longitude=long).attendance_manual({})
attendances = self.hr_attendance_model.search(
[("employee_id", "=", self.employee.id)]
)
self.assertEqual(len(attendances), 1, "One attendance should have been created")
self.assertAlmostEqual(
attendances[0].check_in_latitude, float(self.location[0]), places=7
)
self.assertAlmostEqual(
attendances[0].check_in_longitude, float(self.location[1]), places=7
)
self.assertTrue(attendances[0].check_in_latitude_text)
self.assertTrue(attendances[0].check_in_longitude_text)
self.assertFalse(attendances[0].check_out_latitude_text)
self.assertFalse(attendances[0].check_out_longitude_text)

View file

@ -1,59 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="hr_attendance_view_form" model="ir.ui.view">
<field name="model">hr.attendance</field>
<field name="inherit_id" ref="hr_attendance.hr_attendance_view_form" />
<field name="arch" type="xml">
<xpath expr="//form/sheet/group" position="after">
<group
name="locations"
col="2"
groups="hr_attendance.group_hr_attendance_manager"
>
<label for="check_in_latitude_text" string="Check-in Location" />
<span class="oe_inline">
Latitude: <field name="check_in_latitude_text" nolabel="1" /><br
/>
Longitude: <field name="check_in_longitude_text" nolabel="1" />
</span>
<label for="check_out_latitude_text" string="Check-out Location" />
<span class="oe_inline">
Latitude: <field
name="check_out_latitude_text"
nolabel="1"
/><br />
Longitude: <field name="check_out_longitude_text" nolabel="1" />
</span>
</group>
</xpath>
</field>
</record>
<record id="view_attendance_tree" model="ir.ui.view">
<field name="model">hr.attendance</field>
<field name="inherit_id" ref="hr_attendance.view_attendance_tree" />
<field name="arch" type="xml">
<field name="worked_hours" position="after">
<field
name="check_in_latitude_text"
groups="hr_attendance.group_hr_attendance_manager"
optional="show"
/>
<field
name="check_in_longitude_text"
groups="hr_attendance.group_hr_attendance_manager"
optional="show"
/>
<field
name="check_out_latitude_text"
groups="hr_attendance.group_hr_attendance_manager"
optional="show"
/>
<field
name="check_out_longitude_text"
groups="hr_attendance.group_hr_attendance_manager"
optional="show"
/>
</field>
</field>
</record>
</odoo>

Some files were not shown because too many files have changed in this diff Show more