oca-hr/odoo-bringout-oca-hr-attendance-hr_attendance_rfid/hr_attendance_rfid/models/hr_employee.py
Ernad Husremovic dfcda4100c 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>
2025-08-30 17:11:28 +02:00

77 lines
2.5 KiB
Python

# 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