diff --git a/hr_biometric_attendance/__manifest__.py b/hr_biometric_attendance/__manifest__.py
index ae5719073..32b12134a 100644
--- a/hr_biometric_attendance/__manifest__.py
+++ b/hr_biometric_attendance/__manifest__.py
@@ -33,6 +33,7 @@
'depends': ['base_setup', 'hr_attendance', 'web'],
'data': [
'security/ir.model.access.csv',
+ 'security/ir_rule.xml',
'data/ir_cron_data.xml',
'data/ir_action_data.xml',
'wizards/user_management_views.xml',
diff --git a/hr_biometric_attendance/doc/RELEASE_NOTES.md b/hr_biometric_attendance/doc/RELEASE_NOTES.md
index 93afda7af..841233502 100755
--- a/hr_biometric_attendance/doc/RELEASE_NOTES.md
+++ b/hr_biometric_attendance/doc/RELEASE_NOTES.md
@@ -5,3 +5,10 @@
##### ADD
- Initial commit for HR Biometric Device Integration
+
+#### 20.12.2024
+#### Version 17.0.1.1.1
+##### ADD
+
+- Verified Password before test connection, and set up multi company rules.
+
diff --git a/hr_biometric_attendance/models/biometric_device_details.py b/hr_biometric_attendance/models/biometric_device_details.py
index 25b976c18..c1eeabd5b 100644
--- a/hr_biometric_attendance/models/biometric_device_details.py
+++ b/hr_biometric_attendance/models/biometric_device_details.py
@@ -29,6 +29,7 @@ import time
import pytz
from odoo import api, fields, models, registry, _
from odoo.exceptions import UserError, ValidationError
+
live_capture_thread = None
_logger = logging.getLogger(__name__)
try:
@@ -56,9 +57,8 @@ class BiometricDeviceDetails(models.Model):
"from the device",
readonly=True)
company_id = fields.Many2one('res.company', string='Company',
- default=lambda
- self: self.env.user.company_id.id,
- help='Current Company')
+ help="Name of the Company",
+ default=lambda self: self.env.company)
stopwatch_time = fields.Float('Stopwatch timer',
help='Time from Live capture enabled')
device_name = fields.Char(String='Device Name', readonly=True,
@@ -74,6 +74,10 @@ class BiometricDeviceDetails(models.Model):
live_capture_start_time = fields.Datetime('Live Capture Time',
help='The Time When Live '
'Capture Enabled')
+ device_password = fields.Integer(string='Password',
+ help='Enter the device password')
+
+
def device_connect(self, zk):
"""Function for connecting the device with Odoo"""
@@ -86,7 +90,7 @@ class BiometricDeviceDetails(models.Model):
def action_test_connection(self):
"""Checking the connection status"""
zk = ZK(self.device_ip, port=self.port_number, timeout=30,
- password=False, ommit_ping=False)
+ password=self.device_password, ommit_ping=False)
try:
if zk.connect():
zk.test_voice(index=0)
@@ -113,7 +117,7 @@ class BiometricDeviceDetails(models.Model):
try:
# Connecting with the device
zk = ZK(machine_ip, port=zk_port, timeout=30,
- password=0, force_udp=False, ommit_ping=False)
+ password=self.device_password, force_udp=False, ommit_ping=False)
except NameError:
raise UserError(_(
"Please install it with 'pip3 install pyzk'."))
@@ -155,7 +159,7 @@ class BiometricDeviceDetails(models.Model):
try:
# Connecting with the device with the ip and port provided
zk = ZK(machine_ip, port=zk_port, timeout=15,
- password=0,
+ password=self.device_password,
force_udp=False, ommit_ping=False)
except NameError:
raise UserError(
@@ -182,7 +186,7 @@ class BiometricDeviceDetails(models.Model):
base64_data = base64.b64encode(binary_data).decode(
'utf-8')
employee = self.env['hr.employee'].search(
- [('device_id_num', '=', use.user_id)])
+ [('device_id_num', '=', use.user_id),('company_id', '=', self.env.company.id)])
employee.write({
'device_id': self.id,
})
@@ -215,11 +219,12 @@ class BiometricDeviceDetails(models.Model):
for uid in user:
if uid.user_id == each.user_id:
get_user_id = self.env['hr.employee'].search(
- [('device_id_num', '=', each.user_id)])
+ [('device_id_num', '=', each.user_id), ('company_id', '=', self.env.company.id)])
if get_user_id:
duplicate_atten_ids = zk_attendance.search(
[('device_id_num', '=', each.user_id),
- ('punching_time', '=', atten_time)])
+ ('punching_time', '=', atten_time),
+ ('company_id', '=', self.env.company.id)])
if not duplicate_atten_ids:
zk_attendance.create({
'employee_id': get_user_id.id,
@@ -227,7 +232,8 @@ class BiometricDeviceDetails(models.Model):
'attendance_type': str(each.status),
'punch_type': str(each.punch),
'punching_time': atten_time,
- 'address_id': info.address_id.id
+ 'address_id': info.address_id.id,
+ 'company_id': self.env.company.id
})
att_var = hr_attendance.search([(
'employee_id', '=', get_user_id.id),
@@ -256,7 +262,8 @@ class BiometricDeviceDetails(models.Model):
employee = self.env['hr.employee'].create({
'device_id_num': each.user_id,
'device_id': self.id,
- 'name': uid.name
+ 'name': uid.name,
+ 'company_id': self.company_id.id
})
zk_attendance.create({
'employee_id': employee.id,
@@ -264,7 +271,8 @@ class BiometricDeviceDetails(models.Model):
'attendance_type': str(each.status),
'punch_type': str(each.punch),
'punching_time': atten_time,
- 'address_id': info.address_id.id
+ 'address_id': info.address_id.id,
+ 'company_id': self.company_id.id
})
hr_attendance.create({
'employee_id': employee.id,
@@ -289,7 +297,7 @@ class BiometricDeviceDetails(models.Model):
def action_restart_device(self):
"""For restarting the device"""
zk = ZK(self.device_ip, port=self.port_number, timeout=15,
- password=0,
+ password=self.device_password,
force_udp=False, ommit_ping=False)
if self.device_connect(zk):
if self.is_live_capture:
@@ -323,10 +331,11 @@ class BiometricDeviceDetails(models.Model):
for info in self:
machine_ip = info.device_ip
zk_port = info.port_number
+ password = info.device_password
try:
self.is_live_capture = True
self.action_set_timezone()
- instance = ZKBioAttendance(machine_ip, zk_port, info)
+ instance = ZKBioAttendance(machine_ip, zk_port, password, info)
global live_capture_thread
live_capture_thread = instance
live_capture_thread.start()
@@ -361,7 +370,7 @@ class BiometricDeviceDetails(models.Model):
try:
# Connecting with the device with the ip and port provided
zk = ZK(machine_ip, port=zk_port, timeout=15,
- password=0,
+ password=self.device_password,
force_udp=False, ommit_ping=False)
except NameError:
raise UserError(
@@ -396,7 +405,7 @@ class BiometricDeviceDetails(models.Model):
try:
# Connecting with the device with the ip and port provided
zk = ZK(machine_ip, port=zk_port, timeout=15,
- password=0,
+ password=self.device_password,
force_udp=False, ommit_ping=False)
except NameError:
raise UserError(
@@ -432,7 +441,7 @@ class BiometricDeviceDetails(models.Model):
try:
# Connecting with the device with the ip and port provided
zk = ZK(machine_ip, port=zk_port, timeout=15,
- password=0,
+ password=self.device_password,
force_udp=False, ommit_ping=False)
except NameError:
raise UserError(
@@ -491,7 +500,7 @@ class BiometricDeviceDetails(models.Model):
try:
# Connecting with the device with the ip and port provided
zk = ZK(machine_ip, port=zk_port, timeout=15,
- password=0,
+ password=self.device_password,
force_udp=False, ommit_ping=False)
except NameError:
raise UserError(
@@ -526,7 +535,7 @@ class BiometricDeviceDetails(models.Model):
try:
# Connecting with the device with the ip and port provided
zk = ZK(machine_ip, port=zk_port, timeout=15,
- password=0,
+ password=self.device_password,
force_udp=False, ommit_ping=False)
except NameError:
raise UserError(
@@ -568,7 +577,7 @@ class BiometricDeviceDetails(models.Model):
try:
# Connecting with the device with the ip and port provided
zk = ZK(machine_ip, port=zk_port, timeout=15,
- password=0,
+ password=self.device_password,
force_udp=False, ommit_ping=False)
except NameError:
raise UserError(
@@ -599,7 +608,7 @@ class ZKBioAttendance(Thread):
live attendance data.
"""
- def __init__(self, machine_ip, port_no, record):
+ def __init__(self, machine_ip, port_no,password, record):
"""Function to Initialize the thread"""
Thread.__init__(self)
self.machine_ip = machine_ip
@@ -612,7 +621,7 @@ class ZKBioAttendance(Thread):
machine_ip,
port=port_no,
timeout=5,
- password=0,
+ password=password,
force_udp=False,
ommit_ping=False,
)
diff --git a/hr_biometric_attendance/models/daily_attendance.py b/hr_biometric_attendance/models/daily_attendance.py
index f0fc95aec..e633a06b1 100644
--- a/hr_biometric_attendance/models/daily_attendance.py
+++ b/hr_biometric_attendance/models/daily_attendance.py
@@ -45,6 +45,9 @@ class DailyAttendance(models.Model):
help='The Punching Type of attendance')
punching_time = fields.Datetime(string='Punching Time',
help='Punching time in the device')
+ company_id = fields.Many2one('res.company', string='Company',
+ help="Name of the Company",
+ default=lambda self: self.env.company)
def init(self):
"""Retrieve the data's for attendance report"""
@@ -58,16 +61,18 @@ class DailyAttendance(models.Model):
z.address_id as address_id,
z.attendance_type as attendance_type,
z.punching_time as punching_time,
- z.punch_type as punch_type
+ z.punch_type as punch_type,
+ e.company_id as company_id
from zk_machine_attendance z
- join hr_employee e on (z.employee_id=e.id)
+ join hr_employee e on (z.employee_id = e.id)
GROUP BY
z.employee_id,
z.write_date,
z.address_id,
z.attendance_type,
z.punch_type,
- z.punching_time
+ z.punching_time,
+ e.company_id
)
"""
self._cr.execute(query)
diff --git a/hr_biometric_attendance/models/zk_machine_attendance.py b/hr_biometric_attendance/models/zk_machine_attendance.py
index 8b427f6db..8cf47293e 100644
--- a/hr_biometric_attendance/models/zk_machine_attendance.py
+++ b/hr_biometric_attendance/models/zk_machine_attendance.py
@@ -50,3 +50,6 @@ class ZkMachineAttendance(models.Model):
help="Punching time in the device")
address_id = fields.Many2one('res.partner', string='Working Address',
help="Working address of the employee")
+ company_id = fields.Many2one('res.company', string='Company',
+ help="Name of the Company",
+ default=lambda self: self.env.company)
diff --git a/hr_biometric_attendance/security/ir_rule.xml b/hr_biometric_attendance/security/ir_rule.xml
new file mode 100644
index 000000000..ef4df5155
--- /dev/null
+++ b/hr_biometric_attendance/security/ir_rule.xml
@@ -0,0 +1,15 @@
+
+
Version 17.0.1.1.1 Released + on : 20th Dec 2024 +
+Verified Password before test connection, and set up multi company rules.
+