Initial commit: OCA Technical packages (595 packages)

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

View file

@ -0,0 +1,44 @@
# HR Attendance RFID
Odoo addon: hr_attendance_rfid
## Installation
```bash
pip install odoo-bringout-oca-hr-attendance-hr_attendance_rfid
```
## Dependencies
This addon depends on:
- hr_attendance
## Manifest Information
- **Name**: HR Attendance RFID
- **Version**: 16.0.1.0.1
- **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_rfid`.
## License
This package maintains the original AGPL-3 license from the upstream Odoo project.
## Documentation
- Overview: doc/OVERVIEW.md
- Architecture: doc/ARCHITECTURE.md
- Models: doc/MODELS.md
- Controllers: doc/CONTROLLERS.md
- Wizards: doc/WIZARDS.md
- Install: doc/INSTALL.md
- Usage: doc/USAGE.md
- Configuration: doc/CONFIGURATION.md
- Dependencies: doc/DEPENDENCIES.md
- Troubleshooting: doc/TROUBLESHOOTING.md
- FAQ: doc/FAQ.md

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -0,0 +1,42 @@
# Security
Access control and security definitions in hr_attendance_rfid.
## Access Control Lists (ACLs)
Model access permissions defined in:
- **[ir.model.access.csv](../hr_attendance_rfid/security/ir.model.access.csv)**
- 4 model access rules
## Record Rules
Row-level security rules defined in:
## Security Groups & Configuration
Security groups and permissions defined in:
- **[hr_attendance_rfid.xml](../hr_attendance_rfid/security/hr_attendance_rfid.xml)**
- 1 security groups defined
```mermaid
graph TB
subgraph "Security Layers"
A[Users] --> B[Groups]
B --> C[Access Control Lists]
C --> D[Models]
B --> E[Record Rules]
E --> F[Individual Records]
end
```
Security files overview:
- **[hr_attendance_rfid.xml](../hr_attendance_rfid/security/hr_attendance_rfid.xml)**
- Security groups, categories, and XML-based rules
- **[ir.model.access.csv](../hr_attendance_rfid/security/ir.model.access.csv)**
- Model access permissions (CRUD rights)
Notes
- Access Control Lists define which groups can access which models
- Record Rules provide row-level security (filter records by user/group)
- Security groups organize users and define permission sets
- All security is enforced at the ORM level by Odoo

View file

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

View file

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

View file

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

View file

@ -0,0 +1,113 @@
==================
HR Attendance RFID
==================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:ba61dae08726a27391dce81b89daadfbfa0e51538f59faf7820d0cd8016b981d
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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_rfid
: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_rfid
: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 extends the functionality of HR Attendance in order to allow
the logging of employee attendances using an RFID based employee
attendance system.
**Table of contents**
.. contents::
:local:
Configuration
=============
To use this module, you need to use an external system that calls the method
'register_attendance' of the model 'hr.employee' passing as parameter the
code of the RFID card.
Developers of a compatible RFID based employee attendance system should
be familiar with the outputs of this method and implement proper calls and
management of responses.
It is advisory to create an exclusive user to perform this task. As
user doesn't need several access, it is just essential to perform the check
in/out, a group has been created. Add your attendance device user to
RFID Attendance group.
Usage
=====
#. The HR employee responsible to set up new employees should go to
'Attendances -> Manage Attendances -> Employees' and register the
RFID card code of each of your employees. You can use an USB plugged
RFID reader connected to your computer for this purpose.
#. The employee should put his/her card to the RFID based employee
attendance system. It is expected that the system will provide some form
of output of the registration event.
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_rfid%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
~~~~~~~
* Comunitea
* ForgeFlow
Contributors
~~~~~~~~~~~~
* Omar Catiñeira Saavedra <omar@comunitea.com>
* Héctor Villarreal Ortega <hector.villarreal@forgeflow.com>
* Jordi Ballester Alomar <jordi.ballester@forgeflow.com>
* Brian McMaster <brian@mcmpest.com>
* `Tecnativa <https://www.tecnativa.com>`_:
* Víctor Martínez
* Juany Davila <juany.davila@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_rfid>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

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

View file

@ -0,0 +1,21 @@
# Copyright 2017 Comunitea Servicios Tecnológicos S.L.
# Copyright 2018-19 ForgeFlow S.L. (https://www.forgeflow.com)
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
{
"name": "HR Attendance RFID",
"version": "16.0.1.0.1",
"category": "Human Resources",
"website": "https://github.com/OCA/hr-attendance",
"author": "Comunitea, ForgeFlow, Odoo Community Association (OCA)",
"license": "AGPL-3",
"application": False,
"installable": True,
"depends": ["hr_attendance"],
"data": [
"security/hr_attendance_rfid.xml",
"security/ir.model.access.csv",
"data/ir_rule.xml",
"views/hr_employee_view.xml",
],
}

View file

@ -0,0 +1,16 @@
<odoo noupdate="1">
<record id="hr_attendance_rfid_rule" model="ir.rule">
<field name="name">RFID Attendance Rule</field>
<field name="model_id" ref="hr_attendance.model_hr_attendance" />
<field name="global" eval="False" />
<field name="domain_force">[(1, '=', 1)]</field>
<field
name="groups"
eval="[(4, ref('hr_attendance_rfid.group_hr_attendance_rfid'))]"
/>
<field name="perm_read" eval="True" />
<field name="perm_write" eval="True" />
<field name="perm_create" eval="True" />
<field name="perm_unlink" eval="False" />
</record>
</odoo>

View file

@ -0,0 +1,59 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_attendance_rfid
#
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_rfid
#. odoo-python
#: code:addons/hr_attendance_rfid/models/hr_employee.py:0
#, python-format
msgid "Attendance recorded for employee %s"
msgstr "Evidencija zabilježena za zaposlenika %s"
#. module: hr_attendance_rfid
#: model:ir.model,name:hr_attendance_rfid.model_hr_employee_base
msgid "Basic Employee"
msgstr "Obični zaposlenik"
#. module: hr_attendance_rfid
#. odoo-python
#: code:addons/hr_attendance_rfid/models/hr_employee.py:0
#, python-format
msgid "No attendance was recorded for employee %s"
msgstr "Nema zabilježene evidencije za zaposlenika %s"
#. module: hr_attendance_rfid
#. odoo-python
#: code:addons/hr_attendance_rfid/models/hr_employee.py:0
#, python-format
msgid "No employee found with card %s"
msgstr "Nema pronađenog zaposlenika s karticom %s"
#. module: hr_attendance_rfid
#: model:res.groups,name:hr_attendance_rfid.group_hr_attendance_rfid
msgid "RFID Attendance"
msgstr "RFID evidencija"
#. module: hr_attendance_rfid
#: model:ir.model.fields,field_description:hr_attendance_rfid.field_hr_employee__rfid_card_code
#: model:ir.model.fields,field_description:hr_attendance_rfid.field_hr_employee_base__rfid_card_code
#: model:ir.model.fields,field_description:hr_attendance_rfid.field_hr_employee_public__rfid_card_code
msgid "RFID Card Code"
msgstr "RFID kod kartice"
#. module: hr_attendance_rfid
#: model:ir.model.constraint,message:hr_attendance_rfid.constraint_hr_employee_base_rfid_card_code_uniq
#: model:ir.model.constraint,message:hr_attendance_rfid.constraint_hr_employee_public_rfid_card_code_uniq
#: model:ir.model.constraint,message:hr_attendance_rfid.constraint_hr_employee_rfid_card_code_uniq
msgid "The rfid code should be unique."
msgstr "RFID kod treba biti jedinstven."

View file

@ -0,0 +1,62 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_attendance_rfid
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2023-11-15 17: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_rfid
#. odoo-python
#: code:addons/hr_attendance_rfid/models/hr_employee.py:0
#, python-format
msgid "Attendance recorded for employee %s"
msgstr "Asistencia registrada para el empleado %s"
#. module: hr_attendance_rfid
#: model:ir.model,name:hr_attendance_rfid.model_hr_employee_base
msgid "Basic Employee"
msgstr "Empleado básico"
#. module: hr_attendance_rfid
#. odoo-python
#: code:addons/hr_attendance_rfid/models/hr_employee.py:0
#, python-format
msgid "No attendance was recorded for employee %s"
msgstr "No se registró asistencia para el empleado %s"
#. module: hr_attendance_rfid
#. odoo-python
#: code:addons/hr_attendance_rfid/models/hr_employee.py:0
#, python-format
msgid "No employee found with card %s"
msgstr "No se encontró ningún empleado con la tarjeta %s"
#. module: hr_attendance_rfid
#: model:res.groups,name:hr_attendance_rfid.group_hr_attendance_rfid
msgid "RFID Attendance"
msgstr "Asistencia RFID"
#. module: hr_attendance_rfid
#: model:ir.model.fields,field_description:hr_attendance_rfid.field_hr_employee__rfid_card_code
#: model:ir.model.fields,field_description:hr_attendance_rfid.field_hr_employee_base__rfid_card_code
#: model:ir.model.fields,field_description:hr_attendance_rfid.field_hr_employee_public__rfid_card_code
msgid "RFID Card Code"
msgstr "Código de Tarjeta RFID"
#. module: hr_attendance_rfid
#: model:ir.model.constraint,message:hr_attendance_rfid.constraint_hr_employee_base_rfid_card_code_uniq
#: model:ir.model.constraint,message:hr_attendance_rfid.constraint_hr_employee_public_rfid_card_code_uniq
#: model:ir.model.constraint,message:hr_attendance_rfid.constraint_hr_employee_rfid_card_code_uniq
msgid "The rfid code should be unique."
msgstr "El código de la tarjeta RFID debe ser único."

View file

@ -0,0 +1,60 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_attendance_rfid
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: es_ES\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
#. module: hr_attendance_rfid
#. odoo-python
#: code:addons/hr_attendance_rfid/models/hr_employee.py:0
#, python-format
msgid "Attendance recorded for employee %s"
msgstr ""
#. module: hr_attendance_rfid
#: model:ir.model,name:hr_attendance_rfid.model_hr_employee_base
msgid "Basic Employee"
msgstr ""
#. module: hr_attendance_rfid
#. odoo-python
#: code:addons/hr_attendance_rfid/models/hr_employee.py:0
#, python-format
msgid "No attendance was recorded for employee %s"
msgstr ""
#. module: hr_attendance_rfid
#. odoo-python
#: code:addons/hr_attendance_rfid/models/hr_employee.py:0
#, python-format
msgid "No employee found with card %s"
msgstr ""
#. module: hr_attendance_rfid
#: model:res.groups,name:hr_attendance_rfid.group_hr_attendance_rfid
msgid "RFID Attendance"
msgstr ""
#. module: hr_attendance_rfid
#: model:ir.model.fields,field_description:hr_attendance_rfid.field_hr_employee__rfid_card_code
#: model:ir.model.fields,field_description:hr_attendance_rfid.field_hr_employee_base__rfid_card_code
#: model:ir.model.fields,field_description:hr_attendance_rfid.field_hr_employee_public__rfid_card_code
msgid "RFID Card Code"
msgstr ""
#. module: hr_attendance_rfid
#: model:ir.model.constraint,message:hr_attendance_rfid.constraint_hr_employee_base_rfid_card_code_uniq
#: model:ir.model.constraint,message:hr_attendance_rfid.constraint_hr_employee_public_rfid_card_code_uniq
#: model:ir.model.constraint,message:hr_attendance_rfid.constraint_hr_employee_rfid_card_code_uniq
msgid "The rfid code should be unique."
msgstr ""

View file

@ -0,0 +1,62 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_attendance_rfid
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2019-05-23 20:19+0000\n"
"Last-Translator: Kévin Allard <kallard@efficom-lille.com>\n"
"Language-Team: none\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 3.6.1\n"
#. module: hr_attendance_rfid
#. odoo-python
#: code:addons/hr_attendance_rfid/models/hr_employee.py:0
#, python-format
msgid "Attendance recorded for employee %s"
msgstr "Présence enregistrée pour l'employé(e) %s"
#. module: hr_attendance_rfid
#: model:ir.model,name:hr_attendance_rfid.model_hr_employee_base
msgid "Basic Employee"
msgstr ""
#. module: hr_attendance_rfid
#. odoo-python
#: code:addons/hr_attendance_rfid/models/hr_employee.py:0
#, python-format
msgid "No attendance was recorded for employee %s"
msgstr "Aucune présence n'a été enregistrée pour l'employé(e) %s"
#. module: hr_attendance_rfid
#. odoo-python
#: code:addons/hr_attendance_rfid/models/hr_employee.py:0
#, python-format
msgid "No employee found with card %s"
msgstr "Aucun employé(e) trouvé avec la carte %s"
#. module: hr_attendance_rfid
#: model:res.groups,name:hr_attendance_rfid.group_hr_attendance_rfid
msgid "RFID Attendance"
msgstr "Présence RFID"
#. module: hr_attendance_rfid
#: model:ir.model.fields,field_description:hr_attendance_rfid.field_hr_employee__rfid_card_code
#: model:ir.model.fields,field_description:hr_attendance_rfid.field_hr_employee_base__rfid_card_code
#: model:ir.model.fields,field_description:hr_attendance_rfid.field_hr_employee_public__rfid_card_code
msgid "RFID Card Code"
msgstr "Code de carte RFID"
#. module: hr_attendance_rfid
#: model:ir.model.constraint,message:hr_attendance_rfid.constraint_hr_employee_base_rfid_card_code_uniq
#: model:ir.model.constraint,message:hr_attendance_rfid.constraint_hr_employee_public_rfid_card_code_uniq
#: model:ir.model.constraint,message:hr_attendance_rfid.constraint_hr_employee_rfid_card_code_uniq
msgid "The rfid code should be unique."
msgstr "Le code rfid doit être unique."

View file

@ -0,0 +1,59 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_attendance_rfid
#
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_rfid
#. odoo-python
#: code:addons/hr_attendance_rfid/models/hr_employee.py:0
#, python-format
msgid "Attendance recorded for employee %s"
msgstr ""
#. module: hr_attendance_rfid
#: model:ir.model,name:hr_attendance_rfid.model_hr_employee_base
msgid "Basic Employee"
msgstr ""
#. module: hr_attendance_rfid
#. odoo-python
#: code:addons/hr_attendance_rfid/models/hr_employee.py:0
#, python-format
msgid "No attendance was recorded for employee %s"
msgstr ""
#. module: hr_attendance_rfid
#. odoo-python
#: code:addons/hr_attendance_rfid/models/hr_employee.py:0
#, python-format
msgid "No employee found with card %s"
msgstr ""
#. module: hr_attendance_rfid
#: model:res.groups,name:hr_attendance_rfid.group_hr_attendance_rfid
msgid "RFID Attendance"
msgstr ""
#. module: hr_attendance_rfid
#: model:ir.model.fields,field_description:hr_attendance_rfid.field_hr_employee__rfid_card_code
#: model:ir.model.fields,field_description:hr_attendance_rfid.field_hr_employee_base__rfid_card_code
#: model:ir.model.fields,field_description:hr_attendance_rfid.field_hr_employee_public__rfid_card_code
msgid "RFID Card Code"
msgstr ""
#. module: hr_attendance_rfid
#: model:ir.model.constraint,message:hr_attendance_rfid.constraint_hr_employee_base_rfid_card_code_uniq
#: model:ir.model.constraint,message:hr_attendance_rfid.constraint_hr_employee_public_rfid_card_code_uniq
#: model:ir.model.constraint,message:hr_attendance_rfid.constraint_hr_employee_rfid_card_code_uniq
msgid "The rfid code should be unique."
msgstr ""

View file

@ -0,0 +1,62 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_attendance_rfid
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 15.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2023-07-04 15:09+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_rfid
#. odoo-python
#: code:addons/hr_attendance_rfid/models/hr_employee.py:0
#, python-format
msgid "Attendance recorded for employee %s"
msgstr "Presenza registrata per il dipendente %s"
#. module: hr_attendance_rfid
#: model:ir.model,name:hr_attendance_rfid.model_hr_employee_base
msgid "Basic Employee"
msgstr "Dipendente base"
#. module: hr_attendance_rfid
#. odoo-python
#: code:addons/hr_attendance_rfid/models/hr_employee.py:0
#, python-format
msgid "No attendance was recorded for employee %s"
msgstr "Nessuna presenza registrata per il dipendente %s"
#. module: hr_attendance_rfid
#. odoo-python
#: code:addons/hr_attendance_rfid/models/hr_employee.py:0
#, python-format
msgid "No employee found with card %s"
msgstr "Nessun dipendete trovato con tesserino %s"
#. module: hr_attendance_rfid
#: model:res.groups,name:hr_attendance_rfid.group_hr_attendance_rfid
msgid "RFID Attendance"
msgstr "Presenza RFID"
#. module: hr_attendance_rfid
#: model:ir.model.fields,field_description:hr_attendance_rfid.field_hr_employee__rfid_card_code
#: model:ir.model.fields,field_description:hr_attendance_rfid.field_hr_employee_base__rfid_card_code
#: model:ir.model.fields,field_description:hr_attendance_rfid.field_hr_employee_public__rfid_card_code
msgid "RFID Card Code"
msgstr "Codice tesserino RFID"
#. module: hr_attendance_rfid
#: model:ir.model.constraint,message:hr_attendance_rfid.constraint_hr_employee_base_rfid_card_code_uniq
#: model:ir.model.constraint,message:hr_attendance_rfid.constraint_hr_employee_public_rfid_card_code_uniq
#: model:ir.model.constraint,message:hr_attendance_rfid.constraint_hr_employee_rfid_card_code_uniq
msgid "The rfid code should be unique."
msgstr "Il codice RFID deve essere univoco."

View file

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

View file

@ -0,0 +1,77 @@
# Copyright 2017 Comunitea Servicios Tecnológicos S.L.
# Copyright 2018-19 ForgeFlow S.L. (https://www.forgeflow.com)
# Copyright 2020 Tecnativa - Víctor Martínez
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
import logging
from odoo import _, api, fields, models
_logger = logging.getLogger(__name__)
class HrEmployeeBase(models.AbstractModel):
_inherit = "hr.employee.base"
_sql_constraints = [
(
"rfid_card_code_uniq",
"UNIQUE(rfid_card_code)",
"The rfid code should be unique.",
)
]
rfid_card_code = fields.Char("RFID Card Code", copy=False)
@api.model
def register_attendance(self, card_code):
"""Register the attendance of the employee.
:returns: dictionary
'rfid_card_code': char
'employee_name': char
'employee_id': int
'error_message': char
'logged': boolean
'action': check_in/check_out
"""
res = {
"rfid_card_code": card_code,
"employee_name": "",
"employee_id": False,
"error_message": "",
"logged": False,
"action": "FALSE",
}
# We need to apply sudo() because a RFID basic user does not have access to
# hr.employee. Hr.employee.public model does not have the
# _attendance_action_change() method that will be used later.
employee = self.sudo().search([("rfid_card_code", "=", card_code)], limit=1)
if employee:
res["employee_name"] = employee.name
res["employee_id"] = employee.id
else:
msg = _("No employee found with card %s") % card_code
_logger.warning(msg)
res["error_message"] = msg
return res
try:
attendance = employee._attendance_action_change()
if attendance:
msg = _("Attendance recorded for employee %s") % employee.name
_logger.debug(msg)
res["logged"] = True
if attendance.check_out:
res["action"] = "check_out"
else:
res["action"] = "check_in"
return res
else:
msg = _("No attendance was recorded for employee %s") % employee.name
_logger.error(msg)
res["error_message"] = msg
return res
except Exception as e:
res["error_message"] = repr(e)
_logger.error(repr(e))
return res

View file

@ -0,0 +1,12 @@
To use this module, you need to use an external system that calls the method
'register_attendance' of the model 'hr.employee' passing as parameter the
code of the RFID card.
Developers of a compatible RFID based employee attendance system should
be familiar with the outputs of this method and implement proper calls and
management of responses.
It is advisory to create an exclusive user to perform this task. As
user doesn't need several access, it is just essential to perform the check
in/out, a group has been created. Add your attendance device user to
RFID Attendance group.

View file

@ -0,0 +1,8 @@
* Omar Catiñeira Saavedra <omar@comunitea.com>
* Héctor Villarreal Ortega <hector.villarreal@forgeflow.com>
* Jordi Ballester Alomar <jordi.ballester@forgeflow.com>
* Brian McMaster <brian@mcmpest.com>
* `Tecnativa <https://www.tecnativa.com>`_:
* Víctor Martínez
* Juany Davila <juany.davila@forgeflow.com>

View file

@ -0,0 +1,3 @@
This module extends the functionality of HR Attendance in order to allow
the logging of employee attendances using an RFID based employee
attendance system.

View file

@ -0,0 +1,7 @@
#. The HR employee responsible to set up new employees should go to
'Attendances -> Manage Attendances -> Employees' and register the
RFID card code of each of your employees. You can use an USB plugged
RFID reader connected to your computer for this purpose.
#. The employee should put his/her card to the RFID based employee
attendance system. It is expected that the system will provide some form
of output of the registration event.

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="group_hr_attendance_rfid" model="res.groups">
<field name="name">RFID Attendance</field>
<field name="category_id" ref="base.module_category_hidden" />
</record>
</odoo>

View file

@ -0,0 +1,5 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_hr_attendance_rfid,access.hr.attendance.rfid,hr_attendance.model_hr_attendance,hr_attendance_rfid.group_hr_attendance_rfid,1,1,1,0
access_hr_employee_rfid,access.hr.employee.rfid,hr.model_hr_employee,hr_attendance_rfid.group_hr_attendance_rfid,1,0,0,0
access_hr_employee_public_rfid,access.hr.employee.rfid,hr.model_hr_employee_public,hr_attendance_rfid.group_hr_attendance_rfid,1,0,0,0
access_resources_resource_rfid,access.resource.resource.rfid,resource.model_resource_resource,hr_attendance_rfid.group_hr_attendance_rfid,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_hr_attendance_rfid access.hr.attendance.rfid hr_attendance.model_hr_attendance hr_attendance_rfid.group_hr_attendance_rfid 1 1 1 0
3 access_hr_employee_rfid access.hr.employee.rfid hr.model_hr_employee hr_attendance_rfid.group_hr_attendance_rfid 1 0 0 0
4 access_hr_employee_public_rfid access.hr.employee.rfid hr.model_hr_employee_public hr_attendance_rfid.group_hr_attendance_rfid 1 0 0 0
5 access_resources_resource_rfid access.resource.resource.rfid resource.model_resource_resource hr_attendance_rfid.group_hr_attendance_rfid 1 0 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View file

@ -0,0 +1,466 @@
<!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 RFID</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-rfid">
<h1 class="title">HR Attendance RFID</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:ba61dae08726a27391dce81b89daadfbfa0e51538f59faf7820d0cd8016b981d
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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_rfid"><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_rfid"><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 extends the functionality of HR Attendance in order to allow
the logging of employee attendances using an RFID based employee
attendance system.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#configuration" id="toc-entry-1">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="toc-entry-2">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-3">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-4">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-5">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-6">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-7">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="configuration">
<h1><a class="toc-backref" href="#toc-entry-1">Configuration</a></h1>
<p>To use this module, you need to use an external system that calls the method
register_attendance of the model hr.employee passing as parameter the
code of the RFID card.</p>
<p>Developers of a compatible RFID based employee attendance system should
be familiar with the outputs of this method and implement proper calls and
management of responses.</p>
<p>It is advisory to create an exclusive user to perform this task. As
user doesnt need several access, it is just essential to perform the check
in/out, a group has been created. Add your attendance device user to
RFID Attendance group.</p>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#toc-entry-2">Usage</a></h1>
<ol class="arabic simple">
<li>The HR employee responsible to set up new employees should go to
Attendances -&gt; Manage Attendances -&gt; Employees and register the
RFID card code of each of your employees. You can use an USB plugged
RFID reader connected to your computer for this purpose.</li>
<li>The employee should put his/her card to the RFID based employee
attendance system. It is expected that the system will provide some form
of output of the registration event.</li>
</ol>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-3">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_rfid%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-4">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-5">Authors</a></h2>
<ul class="simple">
<li>Comunitea</li>
<li>ForgeFlow</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-6">Contributors</a></h2>
<ul>
<li><p class="first">Omar Catiñeira Saavedra &lt;<a class="reference external" href="mailto:omar&#64;comunitea.com">omar&#64;comunitea.com</a>&gt;</p>
</li>
<li><p class="first">Héctor Villarreal Ortega &lt;<a class="reference external" href="mailto:hector.villarreal&#64;forgeflow.com">hector.villarreal&#64;forgeflow.com</a>&gt;</p>
</li>
<li><p class="first">Jordi Ballester Alomar &lt;<a class="reference external" href="mailto:jordi.ballester&#64;forgeflow.com">jordi.ballester&#64;forgeflow.com</a>&gt;</p>
</li>
<li><p class="first">Brian McMaster &lt;<a class="reference external" href="mailto:brian&#64;mcmpest.com">brian&#64;mcmpest.com</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">Juany Davila &lt;<a class="reference external" href="mailto:juany.davila&#64;forgeflow.com">juany.davila&#64;forgeflow.com</a>&gt;</p>
</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-7">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_rfid">OCA/hr-attendance</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

View file

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

View file

@ -0,0 +1,86 @@
# Copyright 2018-19 ForgeFlow S.L. (https://www.forgeflow.com)
# Copyright 2023 Tecnativa - Víctor Martínez
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
from datetime import datetime, timedelta
from unittest.mock import patch
from odoo import fields
from odoo.tests import new_test_user
from odoo.tests.common import TransactionCase, users
from odoo.tools.misc import mute_logger
from odoo.addons.base.tests.common import DISABLED_MAIL_CONTEXT
class TestHrAttendance(TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.env = cls.env(context=dict(cls.env.context, **DISABLED_MAIL_CONTEXT))
user = new_test_user(
cls.env,
login="hr_attendance_rfid-user",
groups="hr_attendance_rfid.group_hr_attendance_rfid,base.group_user",
)
cls.rfid_card_code = "5b3f5"
cls.env["hr.employee"].create(
{"user_id": user.id, "rfid_card_code": cls.rfid_card_code}
)
cls.employee_model = cls.env["hr.employee"]
@users("hr_attendance_rfid-user")
def test_valid_employee(self):
"""Valid employee"""
self.employee_model = self.employee_model.with_user(self.env.user)
res = self.employee_model.register_attendance(self.rfid_card_code)
self.assertTrue("action" in res and res["action"] == "check_in")
self.assertTrue("logged" in res and res["logged"])
self.assertTrue(
"rfid_card_code" in res and res["rfid_card_code"] == self.rfid_card_code
)
res = self.employee_model.register_attendance(self.rfid_card_code)
self.assertTrue("action" in res and res["action"] == "check_out")
self.assertTrue("logged" in res and res["logged"])
@users("hr_attendance_rfid-user")
@mute_logger("odoo.addons.hr_attendance_rfid.models.hr_employee")
def test_exception_code(self):
"""Checkout is created for a future datetime"""
self.employee_model = self.employee_model.with_user(self.env.user)
employee = self.env.user.employee_id
self.env["hr.attendance"].create(
{
"employee_id": employee.id,
"check_in": fields.Date.today(),
"check_out": fields.Datetime.to_string(
datetime.today() + timedelta(hours=8)
),
}
)
employee.update({"attendance_state": "checked_in"})
res = self.employee_model.register_attendance(self.rfid_card_code)
self.assertNotEqual(res["error_message"], "")
@users("hr_attendance_rfid-user")
def test_invalid_code(self):
"""Invalid employee"""
self.employee_model = self.employee_model.with_user(self.env.user)
invalid_code = "029238d"
res = self.employee_model.register_attendance(invalid_code)
self.assertTrue("action" in res and res["action"] == "FALSE")
self.assertTrue("logged" in res and not res["logged"])
self.assertTrue(
"rfid_card_code" in res and res["rfid_card_code"] == invalid_code
)
@users("hr_attendance_rfid-user")
@mute_logger("odoo.addons.hr_attendance_rfid.models.hr_employee")
def test_no_attendance_recorded(self):
"""No record found to record the attendance"""
self.employee_model = self.employee_model.with_user(self.env.user)
with patch(
"odoo.addons.hr_attendance.models.hr_employee.HrEmployee._attendance_action_change"
) as attendance_action_change_returns_none:
attendance_action_change_returns_none.return_value = None
res = self.employee_model.register_attendance(self.rfid_card_code)
self.assertNotEqual(res["error_message"], "")

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="view_employee_form_add_rfid" model="ir.ui.view">
<field name="name">hr.employee.form.add_rfid</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">
<field name="pin" position="after">
<field
name="rfid_card_code"
groups="hr_attendance.group_hr_attendance_user"
/>
</field>
</field>
</record>
</odoo>

View file

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