diff --git a/oh_hr_zk_attendance/README.rst b/oh_hr_zk_attendance/README.rst new file mode 100644 index 000000000..b2c34c341 --- /dev/null +++ b/oh_hr_zk_attendance/README.rst @@ -0,0 +1,33 @@ +Biometric Device Integration v10 +================================ +This Cybrosys's module integrates Odoo attendance with biometric device attendance. + +Features +======== +* Ingrates biometric device(Face+Thumb) with HR attendance. +* Managing attendance automatically +* Keeps zk machine history in Odoo +* Option to configure multiple zk devices +* Option to clear all zk history from both device and Odoo + +Technical Notes +=============== +Used Libraries: + +*This integration is only applicable for the the device ZKteco model 'uFace 202' & 'iFace990' +* zklib +you can install zklib library using "sudo pip install zklib" + +Compatible Devices + +*ZKteco model 'uFace 202' +*ZKteco model 'iFace990' + +Author +======= +* Cybrosys Techno Solutions + +Credits +======= +Developer: Jesni Banu @ cybrosys, jesni@cybrosys.in + diff --git a/oh_hr_zk_attendance/__init__.py b/oh_hr_zk_attendance/__init__.py new file mode 100644 index 000000000..4bed5090d --- /dev/null +++ b/oh_hr_zk_attendance/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +################################################################################### +# A part of OpenHRMS Project +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2018-TODAY Cybrosys Technologies (). +# Author: Jesni Banu () +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### + +from . import models +from . import wizard diff --git a/oh_hr_zk_attendance/__manifest__.py b/oh_hr_zk_attendance/__manifest__.py new file mode 100644 index 000000000..58c5f610a --- /dev/null +++ b/oh_hr_zk_attendance/__manifest__.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +################################################################################### +# A part of OpenHRMS Project +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2018-TODAY Cybrosys Technologies (). +# Author: Jesni Banu () +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### +{ + 'name': 'Open HRMS Biometric Device Integration', + 'version': '11.0.1.0.0', + 'summary': """Integrating Biometric Device With HR Attendance (Face + Thumb)""", + 'description': 'This module integrates Odoo with the biometric device(Model: ZKteco uFace 202)', + 'category': 'Generic Modules/Human Resources', + 'author': 'Cybrosys Techno Solutions', + 'company': 'Cybrosys Techno Solutions', + 'website': "https://www.openhrms.com", + 'depends': ['base_setup', 'hr_attendance'], + 'data': [ + 'security/ir.model.access.csv', + 'wizard/generate_attendance.xml', + 'views/zk_machine_view.xml', + 'views/zk_machine_attendance_view.xml', + ], + 'images': ['static/description/banner.gif'], + 'license': 'AGPL-3', + 'external_dependencies': { + 'python': ['zklib'] + }, + 'demo': [], + 'images': ['static/description/banner.jpg'], + 'license': 'AGPL-3', + 'installable': True, + 'auto_install': False, + 'application': False, +} diff --git a/oh_hr_zk_attendance/doc/RELEASE_NOTES.md b/oh_hr_zk_attendance/doc/RELEASE_NOTES.md new file mode 100644 index 000000000..ef01e947d --- /dev/null +++ b/oh_hr_zk_attendance/doc/RELEASE_NOTES.md @@ -0,0 +1,6 @@ +## Module + +#### 24.04.2018 +#### Version 11.0.1.0.0 +##### ADD +- Initial commit for Open HRMS Project diff --git a/oh_hr_zk_attendance/models/__init__.py b/oh_hr_zk_attendance/models/__init__.py new file mode 100644 index 000000000..055de287c --- /dev/null +++ b/oh_hr_zk_attendance/models/__init__.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +################################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2017-TODAY Cybrosys Technologies(). +# Author: Jesni Banu() +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### +from . import zk_machine +from . import machine_analysis + + + diff --git a/oh_hr_zk_attendance/models/__pycache__/__init__.cpython-35.pyc b/oh_hr_zk_attendance/models/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 000000000..f229db2a6 Binary files /dev/null and b/oh_hr_zk_attendance/models/__pycache__/__init__.cpython-35.pyc differ diff --git a/oh_hr_zk_attendance/models/__pycache__/machine_analysis.cpython-35.pyc b/oh_hr_zk_attendance/models/__pycache__/machine_analysis.cpython-35.pyc new file mode 100644 index 000000000..a72f49b5d Binary files /dev/null and b/oh_hr_zk_attendance/models/__pycache__/machine_analysis.cpython-35.pyc differ diff --git a/oh_hr_zk_attendance/models/__pycache__/zk_machine.cpython-35.pyc b/oh_hr_zk_attendance/models/__pycache__/zk_machine.cpython-35.pyc new file mode 100644 index 000000000..6097d1bad Binary files /dev/null and b/oh_hr_zk_attendance/models/__pycache__/zk_machine.cpython-35.pyc differ diff --git a/oh_hr_zk_attendance/models/machine_analysis.py b/oh_hr_zk_attendance/models/machine_analysis.py new file mode 100644 index 000000000..c24395668 --- /dev/null +++ b/oh_hr_zk_attendance/models/machine_analysis.py @@ -0,0 +1,100 @@ +# -*- coding: utf-8 -*- +################################################################################### +# A part of OpenHRMS Project +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2018-TODAY Cybrosys Technologies (). +# Author: Jesni Banu () +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### +from odoo import tools +from odoo import models, fields, api, _ + + +class HrEmployee(models.Model): + _inherit = 'hr.employee' + + device_id = fields.Char(string='Biometric Device ID', help='ID created in Biometric Device') + + +class ZkMachine(models.Model): + _name = 'zk.machine.attendance' + _inherit = 'hr.attendance' + + @api.constrains('check_in', 'check_out', 'employee_id') + def _check_validity(self): + """overriding the __check_validity function for employee attendance.""" + pass + + device_id = fields.Char(string='Biometric Device ID') + punch_type = fields.Selection([('0', 'Check In'), + ('1', 'Check Out'), + ('2', 'Break Out'), + ('3', 'Break In'), + ('4', 'Overtime In'), + ('5', 'Overtime Out')], + string='Punching Type') + + attendance_type = fields.Selection([('1', 'Thump'), + ('15', 'Face')], string='Category') + punching_time = fields.Datetime(string='Punching Time') + address_id = fields.Many2one('res.partner', string='Working Address') + + +class ReportZkDevice(models.Model): + _name = 'zk.report.daily.attendance' + _auto = False + _order = 'punching_day desc' + + name = fields.Many2one('hr.employee', string='Employee') + punching_day = fields.Date(string='Date') + address_id = fields.Many2one('res.partner', string='Working Address') + attendance_type = fields.Selection([('1', 'Thump'), + ('15', 'Face')], + string='Category', help='Type of Detecting Attendance') + punch_type = fields.Selection([('0', 'Check In'), + ('1', 'Check Out'), + ('2', 'Break Out'), + ('3', 'Break In'), + ('4', 'Overtime In'), + ('5', 'Overtime Out')], string='Punching Type', help='Type of Punching') + punching_time = fields.Datetime(string='Punching Time') + + def init(self): + tools.drop_view_if_exists(self._cr, 'zk_report_daily_attendance') + self._cr.execute(""" + create or replace view zk_report_daily_attendance as ( + select + min(z.id) as id, + z.employee_id as name, + z.write_date as punching_day, + z.address_id as address_id, + z.attendance_type as attendance_type, + z.punching_time as punching_time, + z.punch_type as punch_type + from zk_machine_attendance z + 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 + ) + """) + + diff --git a/oh_hr_zk_attendance/models/zk_machine.py b/oh_hr_zk_attendance/models/zk_machine.py new file mode 100644 index 000000000..6ff031d3c --- /dev/null +++ b/oh_hr_zk_attendance/models/zk_machine.py @@ -0,0 +1,274 @@ +# -*- coding: utf-8 -*- +################################################################################### +# A part of OpenHRMS Project +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2018-TODAY Cybrosys Technologies (). +# Author: Jesni Banu () +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### +import pytz +import sys +import datetime +try: + from zklib import zklib + from zklib.zkconst import * + sys.path.append("zklib") +except ImportError: + pass +from struct import unpack +from odoo import api, fields, models +from odoo import _ +from odoo.exceptions import UserError, ValidationError + + +class HrAttendance(models.Model): + _inherit = 'hr.attendance' + + device_id = fields.Char(string='Biometric Device ID', help='Select the ZK device') + + +class ZkMachine(models.Model): + _name = 'zk.machine' + + name = fields.Char(string='Machine IP', required=True, help='IP address of ZK Machine') + port_no = fields.Integer(string='Port No', required=True, help='Port number of ZK Machine') + address_id = fields.Many2one('res.partner', string='Working Address') + company_id = fields.Many2one('res.company', string='Company', default=lambda self: self.env.user.company_id.id) + + @api.multi + def device_connect(self, zk): + try: + command = CMD_CONNECT + command_string = '' + chksum = 0 + session_id = 0 + reply_id = -1 + USHRT_MAX + buf = zk.createHeader(command, chksum, session_id, + reply_id, command_string) + zk.zkclient.sendto(buf, zk.address) + try: + zk.data_recv, addr = zk.zkclient.recvfrom(1024) + zk.session_id = unpack('HHHH', zk.data_recv[:8])[2] + command = unpack('HHHH', zk.data_recv[:8])[0] + if command == 2005: + conn = True + else: + conn = False + except: + conn = False + return conn + except: + pass + + @api.multi + def clear_attendance(self): + for info in self: + try: + machine_ip = info.name + port = info.port_no + zk = zklib.ZKLib(machine_ip, port) + conn = self.device_connect(zk) + if conn: + zk.enableDevice() + clear_data = zk.getAttendance() + if clear_data: + zk.clearAttendance() + self._cr.execute("""delete from zk_machine_attendance""") + else: + raise UserError(_('Unable to get the attendance log, please try again later.')) + else: + raise UserError(_('Unable to connect, please check the parameters and network connections.')) + except: + raise ValidationError('Warning !!! Machine is not connected') + + def getSizeUser(self, zk): + """Checks a returned packet to see if it returned CMD_PREPARE_DATA, + indicating that data packets are to be sent + + Returns the amount of bytes that are going to be sent""" + command = unpack('HHHH', zk.data_recv[:8])[0] + if command == CMD_PREPARE_DATA: + size = unpack('I', zk.data_recv[8:12])[0] + return size + else: + return False + + def zkgetuser(self, zk): + """Start a connection with the time clock""" + command = CMD_USERTEMP_RRQ + command_string = '\x05' + chksum = 0 + session_id = zk.session_id + reply_id = unpack('HHHH', zk.data_recv[:8])[3] + + buf = zk.createHeader(command, chksum, session_id, reply_id, command_string) + zk.zkclient.sendto(buf, zk.address) + try: + zk.data_recv, addr = zk.zkclient.recvfrom(1024) + + if self.getSizeUser(zk): + bytes = self.getSizeUser(zk) + + while bytes > 0: + data_recv, addr = zk.zkclient.recvfrom(1032) + zk.userdata.append(data_recv) + bytes -= 1024 + + zk.session_id = unpack('HHHH', zk.data_recv[:8])[2] + data_recv = zk.zkclient.recvfrom(8) + + users = {} + if len(zk.userdata) > 0: + userdata = ''.join(zk.userdata[0]) + userdata = userdata[11:] + while len(userdata) > 72: + uid, role, password, name, userid = unpack('2s2s8s28sx31s', userdata.ljust(72)[:72]) + uid = int(uid.encode("hex"), 16) + # Clean up some messy characters from the user name + password = password.split('\x00', 1)[0] + password = unicode(password.strip('\x00|\x01\x10x|\x000'), errors='ignore') + # uid = uid.split('\x00', 1)[0] + userid = unicode(userid.strip('\x00|\x01\x10x|\x000|\x9aC'), errors='ignore') + name = name.split('\x00', 1)[0] + if name.strip() == "": + name = uid + users[uid] = (userid, name, int(role.encode("hex"), 16), password) + userdata = userdata[72:] + return users + except: + return False + + @api.multi + def download_attendance(self): + zk_attendance = self.env['zk.machine.attendance'] + att_obj = self.env['hr.attendance'] + for info in self: + machine_ip = info.name + port = info.port_no + zk = zklib.ZKLib(machine_ip, port) + conn = self.device_connect(zk) + if conn: + zk.enableDevice() + user = self.zkgetuser(zk) + command = CMD_ATTLOG_RRQ + command_string = '' + chksum = 0 + session_id = zk.session_id + reply_id = unpack('HHHH', zk.data_recv[:8])[3] + buf = zk.createHeader(command, chksum, session_id, + reply_id, command_string) + zk.zkclient.sendto(buf, zk.address) + try: + zk.data_recv, addr = zk.zkclient.recvfrom(1024) + command = unpack('HHHH', zk.data_recv[:8])[0] + if command == CMD_PREPARE_DATA: + size = unpack('I', zk.data_recv[8:12])[0] + zk_size = size + else: + zk_size = False + if zk_size: + bytes = zk_size + while bytes > 0: + data_recv, addr = zk.zkclient.recvfrom(1032) + zk.attendancedata.append(data_recv) + bytes -= 1024 # 1024 + zk.session_id = unpack('HHHH', zk.data_recv[:8])[2] + data_recv = zk.zkclient.recvfrom(8) + attendance = [] + if len(zk.attendancedata) > 0: + # The first 4 bytes don't seem to be related to the user + for x in xrange(len(zk.attendancedata)): + if x > 0: + zk.attendancedata[x] = zk.attendancedata[x][8:] + attendancedata = ''.join(zk.attendancedata) + attendancedata = attendancedata[14:] + while len(attendancedata) > 0: + uid, state, timestamp, space = unpack('24s1s4s11s', attendancedata.ljust(40)[:40]) + pls = unpack('c', attendancedata[29:30]) + uid = uid.split('\x00', 1)[0] + tmp = '' + for i in reversed(xrange(len(timestamp.encode('hex')) / 2)): + tmp += timestamp.encode('hex')[i * 2:(i * 2) + 2] + attendance.append((uid, int(state.encode('hex'), 16), + decode_time(int(tmp, 16)), unpack('HHHH', space[:8])[0])) + attendancedata = attendancedata[40:] + except: + attendance = False + if attendance: + for each in attendance: + atten_time = each[2] + atten_time = datetime.strptime( + atten_time.strftime('%Y-%m-%d %H:%M:%S'), '%Y-%m-%d %H:%M:%S') + local_tz = pytz.timezone( + self.env.user.partner_id.tz or 'GMT') + local_dt = local_tz.localize(atten_time, is_dst=None) + utc_dt = local_dt.astimezone(pytz.utc) + utc_dt = utc_dt.strftime("%Y-%m-%d %H:%M:%S") + atten_time = datetime.strptime( + utc_dt, "%Y-%m-%d %H:%M:%S") + atten_time = fields.Datetime.to_string(atten_time) + if user: + for uid in user: + if user[uid][0] == str(each[0]): + get_user_id = self.env['hr.employee'].search( + [('device_id', '=', str(each[0]))]) + if get_user_id: + duplicate_atten_ids = zk_attendance.search( + [('device_id', '=', str(each[0])), ('punching_time', '=', atten_time)]) + if duplicate_atten_ids: + continue + else: + zk_attendance.create({'employee_id': get_user_id.id, + 'device_id': each[0], + 'attendance_type': str(each[1]), + 'punch_type': str(each[3]), + 'punching_time': atten_time, + 'address_id': info.address_id.id}) + att_var = att_obj.search([('employee_id', '=', get_user_id.id), + ('check_out', '=', False)]) + if each[3] == 0: + if not att_var: + att_obj.create({'employee_id': get_user_id.id, + 'check_in': atten_time}) + if each[3] == 1: + if len(att_var) == 1: + att_var.write({'check_out': atten_time}) + else: + att_var1 = att_obj.search([('employee_id', '=', get_user_id.id)]) + if att_var1: + att_var1[-1].write({'check_out': atten_time}) + + else: + employee = self.env['hr.employee'].create( + {'device_id': str(each[0]), 'name': user[uid][1]}) + zk_attendance.create({'employee_id': employee.id, + 'device_id': each[0], + 'attendance_type': str(each[1]), + 'punch_type': str(each[3]), + 'punching_time': atten_time, + 'address_id': info.address_id.id}) + att_obj.create({'employee_id': employee.id, + 'check_in': atten_time}) + else: + pass + zk.enableDevice() + zk.disconnect() + return True + else: + raise UserError(_('Unable to get the attendance log, please try again later.')) + else: + raise UserError(_('Unable to connect, please check the parameters and network connections.')) diff --git a/oh_hr_zk_attendance/security/ir.model.access.csv b/oh_hr_zk_attendance/security/ir.model.access.csv new file mode 100644 index 000000000..438279985 --- /dev/null +++ b/oh_hr_zk_attendance/security/ir.model.access.csv @@ -0,0 +1,4 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_hr_zk_machine_user,zk.machine.hr_biometric_machine,model_zk_machine,hr_attendance.group_hr_attendance_user,1,1,1,1 +access_hr_zk_machine_user1,zk.machine.hr_biometric_machine1,model_zk_machine_attendance,hr_attendance.group_hr_attendance_user,1,1,1,1 +access_hr_zk_machine_user2,zk.machine.hr_biometric_machine2,model_zk_report_daily_attendance,hr_attendance.group_hr_attendance_user,1,1,1,1 diff --git a/oh_hr_zk_attendance/static/description/HRMS-BUTTON.png b/oh_hr_zk_attendance/static/description/HRMS-BUTTON.png new file mode 100644 index 000000000..0f1b65bea Binary files /dev/null and b/oh_hr_zk_attendance/static/description/HRMS-BUTTON.png differ diff --git a/oh_hr_zk_attendance/static/description/attendance_log.png b/oh_hr_zk_attendance/static/description/attendance_log.png new file mode 100644 index 000000000..33f452bdc Binary files /dev/null and b/oh_hr_zk_attendance/static/description/attendance_log.png differ diff --git a/oh_hr_zk_attendance/static/description/banner.jpg b/oh_hr_zk_attendance/static/description/banner.jpg new file mode 100644 index 000000000..7564c45cb Binary files /dev/null and b/oh_hr_zk_attendance/static/description/banner.jpg differ diff --git a/oh_hr_zk_attendance/static/description/cybro-service.png b/oh_hr_zk_attendance/static/description/cybro-service.png new file mode 100644 index 000000000..252929a86 Binary files /dev/null and b/oh_hr_zk_attendance/static/description/cybro-service.png differ diff --git a/oh_hr_zk_attendance/static/description/cybro_logo.png b/oh_hr_zk_attendance/static/description/cybro_logo.png new file mode 100644 index 000000000..bb309114c Binary files /dev/null and b/oh_hr_zk_attendance/static/description/cybro_logo.png differ diff --git a/oh_hr_zk_attendance/static/description/devicelog.png b/oh_hr_zk_attendance/static/description/devicelog.png new file mode 100644 index 000000000..d38a4253a Binary files /dev/null and b/oh_hr_zk_attendance/static/description/devicelog.png differ diff --git a/oh_hr_zk_attendance/static/description/employee.png b/oh_hr_zk_attendance/static/description/employee.png new file mode 100644 index 000000000..960dafcdb Binary files /dev/null and b/oh_hr_zk_attendance/static/description/employee.png differ diff --git a/oh_hr_zk_attendance/static/description/icon.png b/oh_hr_zk_attendance/static/description/icon.png new file mode 100644 index 000000000..396f97c37 Binary files /dev/null and b/oh_hr_zk_attendance/static/description/icon.png differ diff --git a/oh_hr_zk_attendance/static/description/index.html b/oh_hr_zk_attendance/static/description/index.html new file mode 100644 index 000000000..336ed0457 --- /dev/null +++ b/oh_hr_zk_attendance/static/description/index.html @@ -0,0 +1,107 @@ +
+
+

Open HRMS

+

Most advanced open source HR management software

+
+
+ +
+
+
+
+ + + + +
+
+
+
+ +
+
+

Open HRMS Biometric Device Integration

+

This Module Integrates Biometric Device With HR Attendance

+

Cybrosys Technologies

+
+
+
+ Ingrates biometric device(Face+Thumb) with HR attendance.
+ Option to keep the device attendance log in Odoo.
+ Option to clear the device attendance log from both device and Odoo.
+ Automating HR attendance.
+ Option to configure multiple devices.
+
+

+
+ + This module will support with
+
    +
  • ZKteco model 'uFace 202'
  • +
  • ZKteco model 'iFace990'
  • +
+
+
+
+
+ +
+
+
+

Overview

+

+ Automation is an implementation factor for a successful ERP. With this module, + HR attendance can automate by integrating Thumb / Face detection device with Odoo. + We can configure a user both from thumbing device or Odoo employee form. +

+
+
+
+ +
+
+ Note:- This integration is only applicable for the the device ZKteco model 'uFace 202'
+ Please install zklib library (sudo pip install zklib)
+
+
+ +
+
+

Our Odoo Services

+
+
+
+ + + +
+
+
+ +
+

Need Any Help?

+ +
+ diff --git a/oh_hr_zk_attendance/static/description/zk_config.png b/oh_hr_zk_attendance/static/description/zk_config.png new file mode 100644 index 000000000..a09abdcd5 Binary files /dev/null and b/oh_hr_zk_attendance/static/description/zk_config.png differ diff --git a/oh_hr_zk_attendance/static/description/zk_warn2.png b/oh_hr_zk_attendance/static/description/zk_warn2.png new file mode 100644 index 000000000..4b213123d Binary files /dev/null and b/oh_hr_zk_attendance/static/description/zk_warn2.png differ diff --git a/oh_hr_zk_attendance/static/description/zk_warning.png b/oh_hr_zk_attendance/static/description/zk_warning.png new file mode 100644 index 000000000..4b6670aa6 Binary files /dev/null and b/oh_hr_zk_attendance/static/description/zk_warning.png differ diff --git a/oh_hr_zk_attendance/views/zk_machine_attendance_view.xml b/oh_hr_zk_attendance/views/zk_machine_attendance_view.xml new file mode 100644 index 000000000..c88da6d33 --- /dev/null +++ b/oh_hr_zk_attendance/views/zk_machine_attendance_view.xml @@ -0,0 +1,41 @@ + + + + zk.report.daily.attendance.search + zk.report.daily.attendance + + + + + + + + + + zk.report.daily.attendance.tree + zk.report.daily.attendance + + + + + + + + + + + + + + Attendance Analysis + zk.report.daily.attendance + form + tree + {'search_default_my_attendance':1} + + + + + diff --git a/oh_hr_zk_attendance/views/zk_machine_view.xml b/oh_hr_zk_attendance/views/zk_machine_view.xml new file mode 100644 index 000000000..f987bbff5 --- /dev/null +++ b/oh_hr_zk_attendance/views/zk_machine_view.xml @@ -0,0 +1,75 @@ + + + + zk.machine.form + zk.machine + +
+ +
+
+ + + + + + + + + +
+
+
+
+ + + zk.machine.tree + zk.machine + + + + + + + + + + + + Attendances + zk.machine + form + tree,form + + + + Generate Attendances + zk.attendance + form + form + new + + + + hr.employee.form + hr.employee + + + + + + + + + + + + +
+ diff --git a/oh_hr_zk_attendance/wizard/__init__.py b/oh_hr_zk_attendance/wizard/__init__.py new file mode 100644 index 000000000..35ff76b13 --- /dev/null +++ b/oh_hr_zk_attendance/wizard/__init__.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +################################################################################### +# A part of OpenHRMS Project +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2018-TODAY Cybrosys Technologies (). +# Author: Jesni Banu () +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### + +from . import generate_attendance diff --git a/oh_hr_zk_attendance/wizard/__pycache__/__init__.cpython-35.pyc b/oh_hr_zk_attendance/wizard/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 000000000..32ee29a61 Binary files /dev/null and b/oh_hr_zk_attendance/wizard/__pycache__/__init__.cpython-35.pyc differ diff --git a/oh_hr_zk_attendance/wizard/__pycache__/generate_attendance.cpython-35.pyc b/oh_hr_zk_attendance/wizard/__pycache__/generate_attendance.cpython-35.pyc new file mode 100644 index 000000000..075e1b851 Binary files /dev/null and b/oh_hr_zk_attendance/wizard/__pycache__/generate_attendance.cpython-35.pyc differ diff --git a/oh_hr_zk_attendance/wizard/generate_attendance.py b/oh_hr_zk_attendance/wizard/generate_attendance.py new file mode 100644 index 000000000..2b7db6d54 --- /dev/null +++ b/oh_hr_zk_attendance/wizard/generate_attendance.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +################################################################################### +# A part of OpenHRMS Project +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2018-TODAY Cybrosys Technologies (). +# Author: Jesni Banu () +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### + +from odoo import models, fields + + +class ZkAttendanceConfig(models.TransientModel): + _name = 'zk.attendance' + + device_id = fields.Many2one('zk.machine', string='Device ID') + + def download_attendance(self): + self.device_id.download_attendance() + + def clear_attendance(self): + self.device_id.clear_attendance() diff --git a/oh_hr_zk_attendance/wizard/generate_attendance.xml b/oh_hr_zk_attendance/wizard/generate_attendance.xml new file mode 100644 index 000000000..6445e7f45 --- /dev/null +++ b/oh_hr_zk_attendance/wizard/generate_attendance.xml @@ -0,0 +1,20 @@ + + + + zk.attendance.form + zk.attendance + +
+ + + + +
+
+
+
\ No newline at end of file