Browse Source

Jan 02 : [ADD] Initial Commit 'employee_late_check_in'

pull/313/head
RisvanaCybro 1 year ago
parent
commit
2456335d23
  1. 46
      employee_late_check_in/README.rst
  2. 22
      employee_late_check_in/__init__.py
  3. 56
      employee_late_check_in/__manifest__.py
  4. 17
      employee_late_check_in/data/ir_cron_data.xml
  5. 28
      employee_late_check_in/data/salary_rule.xml
  6. 7
      employee_late_check_in/doc/RELEASE_NOTES.md
  7. 28
      employee_late_check_in/models/__init__.py
  8. 84
      employee_late_check_in/models/hr_attendance.py
  9. 51
      employee_late_check_in/models/hr_employee.py
  10. 52
      employee_late_check_in/models/hr_employees_public.py
  11. 60
      employee_late_check_in/models/hr_payslip.py
  12. 73
      employee_late_check_in/models/late_check_in.py
  13. 45
      employee_late_check_in/models/res_company.py
  14. 65
      employee_late_check_in/models/res_config_settings.py
  15. 4
      employee_late_check_in/security/ir.model.access.csv
  16. BIN
      employee_late_check_in/static/description/assets/icons/check.png
  17. BIN
      employee_late_check_in/static/description/assets/icons/chevron.png
  18. BIN
      employee_late_check_in/static/description/assets/icons/cogs.png
  19. BIN
      employee_late_check_in/static/description/assets/icons/consultation.png
  20. BIN
      employee_late_check_in/static/description/assets/icons/ecom-black.png
  21. BIN
      employee_late_check_in/static/description/assets/icons/education-black.png
  22. BIN
      employee_late_check_in/static/description/assets/icons/hotel-black.png
  23. BIN
      employee_late_check_in/static/description/assets/icons/license.png
  24. BIN
      employee_late_check_in/static/description/assets/icons/lifebuoy.png
  25. BIN
      employee_late_check_in/static/description/assets/icons/manufacturing-black.png
  26. BIN
      employee_late_check_in/static/description/assets/icons/pos-black.png
  27. BIN
      employee_late_check_in/static/description/assets/icons/puzzle.png
  28. BIN
      employee_late_check_in/static/description/assets/icons/restaurant-black.png
  29. BIN
      employee_late_check_in/static/description/assets/icons/service-black.png
  30. BIN
      employee_late_check_in/static/description/assets/icons/trading-black.png
  31. BIN
      employee_late_check_in/static/description/assets/icons/training.png
  32. BIN
      employee_late_check_in/static/description/assets/icons/update.png
  33. BIN
      employee_late_check_in/static/description/assets/icons/user.png
  34. BIN
      employee_late_check_in/static/description/assets/icons/wrench.png
  35. BIN
      employee_late_check_in/static/description/assets/misc/Cybrosys R.png
  36. BIN
      employee_late_check_in/static/description/assets/misc/categories.png
  37. BIN
      employee_late_check_in/static/description/assets/misc/check-box.png
  38. BIN
      employee_late_check_in/static/description/assets/misc/compass.png
  39. BIN
      employee_late_check_in/static/description/assets/misc/corporate.png
  40. BIN
      employee_late_check_in/static/description/assets/misc/customer-support.png
  41. BIN
      employee_late_check_in/static/description/assets/misc/cybrosys-logo.png
  42. BIN
      employee_late_check_in/static/description/assets/misc/features.png
  43. BIN
      employee_late_check_in/static/description/assets/misc/logo.png
  44. BIN
      employee_late_check_in/static/description/assets/misc/pictures.png
  45. BIN
      employee_late_check_in/static/description/assets/misc/pie-chart.png
  46. BIN
      employee_late_check_in/static/description/assets/misc/right-arrow.png
  47. BIN
      employee_late_check_in/static/description/assets/misc/star.png
  48. BIN
      employee_late_check_in/static/description/assets/misc/support.png
  49. BIN
      employee_late_check_in/static/description/assets/misc/whatsapp.png
  50. BIN
      employee_late_check_in/static/description/assets/modules/1.png
  51. BIN
      employee_late_check_in/static/description/assets/modules/2.png
  52. BIN
      employee_late_check_in/static/description/assets/modules/3.png
  53. BIN
      employee_late_check_in/static/description/assets/modules/4.png
  54. BIN
      employee_late_check_in/static/description/assets/modules/5.png
  55. BIN
      employee_late_check_in/static/description/assets/modules/6.png
  56. BIN
      employee_late_check_in/static/description/assets/screenshots/1.png
  57. BIN
      employee_late_check_in/static/description/assets/screenshots/2.png
  58. BIN
      employee_late_check_in/static/description/assets/screenshots/3.png
  59. BIN
      employee_late_check_in/static/description/assets/screenshots/4.png
  60. BIN
      employee_late_check_in/static/description/assets/screenshots/5.png
  61. BIN
      employee_late_check_in/static/description/assets/screenshots/hero.gif
  62. BIN
      employee_late_check_in/static/description/banner.jpg
  63. BIN
      employee_late_check_in/static/description/icon.png
  64. 718
      employee_late_check_in/static/description/index.html
  65. 14
      employee_late_check_in/views/hr_attendance_views.xml
  66. 35
      employee_late_check_in/views/hr_employee_views.xml
  67. 15
      employee_late_check_in/views/hr_payslip_views.xml
  68. 93
      employee_late_check_in/views/late_check_in_views.xml
  69. 33
      employee_late_check_in/views/res_config_settings_views.xml

46
employee_late_check_in/README.rst

@ -0,0 +1,46 @@
.. image:: https://img.shields.io/badge/licence-LGPL--3-blue.svg
:target: https://www.gnu.org/licenses/lgpl-3.0-standalone.html
:alt: License: LGPL-3
Employee Late Check-in
======================
Employee Late Check-in module for tracking and managing late check-ins of employees and may deduct salary from payslip
Configuration
=============
- No additional configuration required.
Company
-------
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__
License
-------
* Lesser General Public License, Version 3 (LGPL v3).
(https://www.gnu.org/licenses/lgpl-3.0-standalone.html)
Credits
-------
Developer: (V17) Mohamed Muzammil VP, Contact : odoo@cybrosys.com
Contacts
--------
* Mail Contact : odoo@cybrosys.com
* Website : https://cybrosys.com
Bug Tracker
-----------
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported.
Maintainer
==========
.. image:: https://cybrosys.com/images/logo.png
:target: https://cybrosys.com
This module is maintained by Cybrosys Technologies.
For support and more information, please visit `Our Website <https://cybrosys.com/>`__
Further information
===================
HTML Description: `<static/description/index.html>`__

22
employee_late_check_in/__init__.py

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Mohamed Muzammil VP (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
############################################################################.
from . import models

56
employee_late_check_in/__manifest__.py

@ -0,0 +1,56 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Mohamed Muzammil VP (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
############################################################################.
{
'name': 'Employee Late Check-in',
'version': '17.0.1.0.0',
'category': 'Human Resources',
'summary': 'Employee Late Check-in module for tracking and managing late '
'check-ins of employees and may deduct salary from payslip',
'description': 'The module is designed for meticulous tracking and '
'management of employee punctuality. It enables '
'organizations to monitor late check-ins efficiently, '
'offering insights into tardiness patterns. With a '
'user-friendly interface, it provides a comprehensive '
'overview of individual employee records, facilitating '
'timely interventions. This module contributes to fostering'
' a punctual and efficient work environment.',
'author': "Cybrosys Techno Solutions",
'company': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions',
'website': 'https://www.cybrosys.com',
'depends': ['hr_attendance', 'hr_payroll_community', 'hr_contract'],
'data': [
'security/ir.model.access.csv',
'data/ir_cron_data.xml',
'data/salary_rule.xml',
'views/res_config_settings_views.xml',
'views/hr_attendance_views.xml',
'views/late_check_in_views.xml',
'views/hr_employee_views.xml',
'views/hr_payslip_views.xml',
],
'images': ['static/description/banner.jpg'],
'license': 'LGPL-3',
'installable': True,
'auto_install': False,
'application': False,
}

17
employee_late_check_in/data/ir_cron_data.xml

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!--The daily function late_check_in_records verifies whether employees are tardy.-->
<record forcecreate="True" id="ir_cron_late_check_in" model="ir.cron">
<field name="name">Attendance: Late Check-in</field>
<field name="model_id" ref="model_hr_attendance"/>
<field name="state">code</field>
<field name="code">model.late_check_in_records()</field>
<field name="user_id" ref="base.user_root" />
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="numbercall">-1</field>
<field eval="False" name="doall" />
</record>
</data>
</odoo>

28
employee_late_check_in/data/salary_rule.xml

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!--Calculate the amount for the 'Late Check-in' rule.-->
<record id="late_check_in" model="hr.salary.rule">
<field name="name">Late Check-in</field>
<field name="sequence" eval="6"/>
<field name="code">LC</field>
<field name="category_id" ref="hr_payroll_community.DED"/>
<field name="amount_select">code</field>
<field name="amount_python_compute">
amount = 0
try:
if inputs.LC:
amount = inputs.LC.amount
except:
amount = 0
result = -amount</field>
</record>
<!--Salary structure for late check-in-->
<record id="late_check_in_salary_structure" model="hr.payroll.structure">
<field name="code">LCS</field>
<field name="name">Base Salary Structure For Late Check-in</field>
<field name="rule_ids" eval="[(6, 0, [ref('hr_payroll_community.hr_rule_basic'),
ref('hr_payroll_community.hr_rule_net'),ref('hr_payroll_community.hr_rule_taxable'),
ref('late_check_in')])]"/>
<field name="company_id" ref="base.main_company"/>
</record>
</odoo>

7
employee_late_check_in/doc/RELEASE_NOTES.md

@ -0,0 +1,7 @@
## Module <employee_late_check_in>
#### 04.12.2023
#### Version 17.0.1.0.0
#### ADD
- Initial Commit for Employee Late Check-in

28
employee_late_check_in/models/__init__.py

@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Mohamed Muzammil VP (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
############################################################################.
from . import hr_attendance
from . import hr_employee
from . import hr_employees_public
from . import hr_payslip
from . import late_check_in
from . import res_company
from . import res_config_settings

84
employee_late_check_in/models/hr_attendance.py

@ -0,0 +1,84 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Mohamed Muzammil VP (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
############################################################################.
import pytz
from datetime import datetime, timedelta
from odoo import fields, models
class HrAttendance(models.Model):
"""Inherit the module to add fields and methods"""
_inherit = 'hr.attendance'
late_check_in = fields.Integer(
string="Late Check-in(Minutes)", compute="_compute_late_check_in",
help="This indicates the duration of the employee's tardiness.")
def _compute_late_check_in(self):
"""Calculate late check-in minutes for each record in the current Odoo
model.This method iterates through the records and calculates late
check-in minutes based on the employee's contract schedule.The
calculation takes into account the employee's time zone, scheduled
check-in time, and the actual check-in time."""
for rec in self:
rec.late_check_in = 0.0
if rec.employee_id.contract_id:
for schedule in rec.sudo().employee_id.contract_id.resource_calendar_id.sudo().attendance_ids:
if (schedule.dayofweek == str(
rec.sudo().check_in.weekday()) and
schedule.day_period == 'morning'):
dt = rec.check_in
if self.env.user.tz in pytz.all_timezones:
old_tz = pytz.timezone('UTC')
new_tz = pytz.timezone(self.env.user.tz)
dt = old_tz.localize(dt).astimezone(new_tz)
str_time = dt.strftime("%H:%M")
check_in_date = datetime.strptime(
str_time, "%H:%M").time()
start_date = datetime.strptime(
'{0:02.0f}:{1:02.0f}'.format(*divmod(
schedule.hour_from * 60, 60)), "%H:%M").time()
check_in = timedelta(hours=check_in_date.hour,
minutes=check_in_date.minute)
start_date = timedelta(hours=start_date.hour,
minutes=start_date.minute)
if check_in > start_date:
final = check_in - start_date
rec.sudo().late_check_in = final.total_seconds() / 60
def late_check_in_records(self):
"""Function creates records in late.check.in model for the employees
who were late"""
minutes_after = int(self.env['ir.config_parameter'].sudo().get_param(
'late_check_in_after')) or 0
max_limit = int(self.env['ir.config_parameter'].sudo().get_param(
'maximum_minutes')) or 0
for rec in self.sudo().search(
[('id', 'not in', self.env['late.check.in'].sudo().search(
[]).attendance_id.ids)]):
late_check_in = rec.sudo().late_check_in + 210
if rec.late_check_in > minutes_after and late_check_in > minutes_after and late_check_in < max_limit:
self.env['late.check.in'].sudo().create({
'employee_id': rec.employee_id.id,
'late_minutes': late_check_in,
'date': rec.check_in.date(),
'attendance_id': rec.id,
})

51
employee_late_check_in/models/hr_employee.py

@ -0,0 +1,51 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Mohamed Muzammil VP (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
############################################################################.
from odoo import fields, models, _
class HrEmployee(models.Model):
"""Inherit the model to add fields and methods"""
_inherit = 'hr.employee'
late_check_in_count = fields.Integer(
string="Late Check-In", compute="_compute_late_check_in_count",
help="Count of employee's late checkin")
def action_to_open_late_check_in_records(self):
"""
:return: dictionary defining the action to open the late check-in
records window.
:rtype: dict
"""
return {
'name': _('Employee Late Check-in'),
'domain': [('employee_id', '=', self.id)],
'res_model': 'late.check.in',
'type': 'ir.actions.act_window',
'view_mode': 'tree,form',
'limit': 80}
def _compute_late_check_in_count(self):
"""Compute the late check-in count"""
for rec in self:
rec.late_check_in_count = self.env['late.check.in'].search_count(
[('employee_id', '=', rec.id)])

52
employee_late_check_in/models/hr_employees_public.py

@ -0,0 +1,52 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Mohamed Muzammil VP (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
############################################################################.
from odoo import fields, models, _
class HrEmployees(models.Model):
"""Inherit the model to add fields and functions"""
_inherit = 'hr.employee.public'
late_check_in_count = fields.Integer(
string="Late Check-In", compute="_compute_late_check_in_count",
help="Count of employee's late checkin")
def action_to_open_late_check_in_records(self):
"""
:return: dictionary defining the action to open the late check-in
records window.
:rtype: dict
"""
return {
'name': _('Employee Late Check-in'),
'domain': [('employee_id', '=', self.id)],
'res_model': 'late.check.in',
'type': 'ir.actions.act_window',
'view_mode': 'tree,form',
'limit': 80,
}
def _compute_late_check_in_count(self):
"""Compute the late check-in count"""
for rec in self:
rec.late_check_in_count = self.env['late.check.in'].search_count(
[('employee_id', '=', rec.id)])

60
employee_late_check_in/models/hr_payslip.py

@ -0,0 +1,60 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Mohamed Muzammil VP (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
############################################################################.
from odoo import api, fields, models
class PayslipLateCheckIn(models.Model):
"""Inherit the model to add fields and functions"""
_inherit = 'hr.payslip'
late_check_in_ids = fields.Many2many(
'late.check.in', string='Late Check-in',
help='Late check-in records of the employee')
@api.model
def get_inputs(self, contracts, date_from, date_to):
"""Function used for writing late check-in record in the payslip input
tree."""
res = super(PayslipLateCheckIn, self).get_inputs(contracts, date_to,
date_from)
late_check_in_type = self.env.ref(
'employee_late_check_in.late_check_in')
late_check_in_id = self.env['late.check.in'].search(
[('employee_id', '=', self.employee_id.id),
('date', '<=', self.date_to), ('date', '>=', self.date_from),
('state', '=', 'approved')])
if late_check_in_id:
self.late_check_in_ids = late_check_in_id
input_data = {
'name': late_check_in_type.name,
'code': late_check_in_type.code,
'amount': sum(late_check_in_id.mapped('amount')),
'contract_id': self.contract_id.id,
}
res.append(input_data)
return res
def action_payslip_done(self):
"""Function used for marking deducted Late check-in request."""
for rec in self.late_check_in_ids:
rec.state = 'deducted'
return super(PayslipLateCheckIn, self).action_payslip_done()

73
employee_late_check_in/models/late_check_in.py

@ -0,0 +1,73 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Mohamed Muzammil VP (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
############################################################################.
from odoo import api, fields, models
class LateCheckIn(models.Model):
"""Model to store late check-in records"""
_name = 'late.check.in'
_description = 'Late Check In'
name = fields.Char(
readonly=True, string='Name', help="Reference number of the record")
employee_id = fields.Many2one('hr.employee', string="Employee",
help='Late employee')
late_minutes = fields.Integer(string="Late Minutes",
help='The field indicates the number of '
'minutes the worker is late.')
date = fields.Date(string="Date", help='Current date')
penalty_amount = fields.Float(compute="_compute_penalty_amount",
help='Amount needs to be deducted',
string="Amount",)
state = fields.Selection(selection=[('draft', 'Draft'),
('approved', 'Approved'),
('refused', 'Refused'),
('deducted', 'Deducted')],
string="State", default="draft",
help='State of the record')
attendance_id = fields.Many2one('hr.attendance', string='Attendance',
help='Attendence of the employee')
@api.model
def create(self, vals_list):
"""Create a sequence for the model"""
vals_list['name'] = self.env['ir.sequence'].next_by_code(
'late.check.in') or '/'
return super(LateCheckIn, self.sudo()).create(vals_list)
def _compute_penalty_amount(self):
"""Compute the penalty amount if the employee was late"""
for rec in self:
amount = float(self.env['ir.config_parameter'].sudo().get_param(
'deduction_amount'))
rec.penalty_amount = amount
if self.env['ir.config_parameter'].sudo().get_param(
'deduction_type') == 'minutes':
rec.penalty_amount = amount * rec.late_minutes
def approve(self):
"""Change state to approved when approve button clicks"""
self.state = 'approved'
def reject(self):
"""Change state refused when refuse button clicks"""
self.state = 'refused'

45
employee_late_check_in/models/res_company.py

@ -0,0 +1,45 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Mohamed Muzammil VP (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
############################################################################.
from odoo import models, fields
class ResCompany(models.Model):
"""Inherit the model to add fields"""
_inherit = 'res.company'
deduction_amount = fields.Float(
help='How much amount need to be deducted if a employee was late',
string="Deduction Amount",)
currency_id = fields.Many2one(
'res.currency', default=lambda self: self.env.company.currency_id.id)
maximum_minutes = fields.Char(
help="Maximum time limit a employee was considered as late",
string="Maximum Late Minute")
late_check_in_after = fields.Char(
help='When should the late check-in count down starts.',
string="Late Check-in Starts After",)
deduction_type = fields.Selection(
selection=[('minutes', 'Per Minutes'), ('total', 'Per Total')],
default="minutes", string='Deduction Type',
help='Type of deduction, (If Per Minutes is chosen then for each '
'minutes given amount is deducted, if Per Total is chosen then '
'given amount is deducted from the total salary)')

65
employee_late_check_in/models/res_config_settings.py

@ -0,0 +1,65 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Mohamed Muzammil VP (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
############################################################################.
from odoo import models, fields
class LateCheckinSettings(models.TransientModel):
"""Inherit the model to add fields"""
_inherit = 'res.config.settings'
deduction_amount = fields.Float(
config_parameter='employee_late_check_in.deduction_amount',
help='How much amount need to be deducted if a employee was late',
string="Deduction Amount",)
maximum_minutes = fields.Char(
config_parameter='employee_late_check_in.maximum_minutes',
help="Maximum time limit a employee was considered as late",
string="Maximum Late Minute")
late_check_in_after = fields.Char(
config_parameter='employee_late_check_in.late_check_in_after',
help='When should the late check-in count down starts.',
string="Late Check-in Starts After",)
deduction_type = fields.Selection(
selection=[('minutes', 'Per Minutes'), ('total', 'Per Total')],
config_parameter='employee_late_check_in.deduction_type',
default="minutes", string='Deduction Type',
help='Type of deduction, (If Per Minutes is chosen then for each '
'minutes given amount is deducted, if Per Total is chosen then '
'given amount is deducted from the total salary)')
currency_id = fields.Many2one(
'res.currency', default=lambda self: self.env.company.currency_id.id)
def set_values(self):
"""Set values,
Returns:
:return: The result of the superclasses' set_values method.
"""
res = super(LateCheckinSettings, self).set_values()
self.env['ir.config_parameter'].sudo().set_param(
'deduction_amount', self.deduction_amount)
self.env['ir.config_parameter'].sudo().set_param(
'maximum_minutes', self.maximum_minutes)
self.env['ir.config_parameter'].sudo().set_param(
'late_check_in_after', self.late_check_in_after)
self.env['ir.config_parameter'].sudo().set_param(
'deduction_type', self.deduction_type)
return res

4
employee_late_check_in/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_late_check_in_manager,access.late.check.in.manager,model_late_check_in,hr.group_hr_manager,1,1,0,1
access_late_check_in_officer,access.late.check.in.officer,model_late_check_in,hr.group_hr_user,1,1,0,0
access_late_check_in_user,access.late.check.in.user,model_late_check_in,base.group_user,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_late_check_in_manager access.late.check.in.manager model_late_check_in hr.group_hr_manager 1 1 0 1
3 access_late_check_in_officer access.late.check.in.officer model_late_check_in hr.group_hr_user 1 1 0 0
4 access_late_check_in_user access.late.check.in.user model_late_check_in base.group_user 1 0 0 0

BIN
employee_late_check_in/static/description/assets/icons/check.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
employee_late_check_in/static/description/assets/icons/chevron.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

BIN
employee_late_check_in/static/description/assets/icons/cogs.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
employee_late_check_in/static/description/assets/icons/consultation.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
employee_late_check_in/static/description/assets/icons/ecom-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

BIN
employee_late_check_in/static/description/assets/icons/education-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

BIN
employee_late_check_in/static/description/assets/icons/hotel-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

BIN
employee_late_check_in/static/description/assets/icons/license.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
employee_late_check_in/static/description/assets/icons/lifebuoy.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
employee_late_check_in/static/description/assets/icons/manufacturing-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

BIN
employee_late_check_in/static/description/assets/icons/pos-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

BIN
employee_late_check_in/static/description/assets/icons/puzzle.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

BIN
employee_late_check_in/static/description/assets/icons/restaurant-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 B

BIN
employee_late_check_in/static/description/assets/icons/service-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

BIN
employee_late_check_in/static/description/assets/icons/trading-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

BIN
employee_late_check_in/static/description/assets/icons/training.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

BIN
employee_late_check_in/static/description/assets/icons/update.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
employee_late_check_in/static/description/assets/icons/user.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

BIN
employee_late_check_in/static/description/assets/icons/wrench.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
employee_late_check_in/static/description/assets/misc/Cybrosys R.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
employee_late_check_in/static/description/assets/misc/categories.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
employee_late_check_in/static/description/assets/misc/check-box.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
employee_late_check_in/static/description/assets/misc/compass.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
employee_late_check_in/static/description/assets/misc/corporate.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
employee_late_check_in/static/description/assets/misc/customer-support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
employee_late_check_in/static/description/assets/misc/cybrosys-logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
employee_late_check_in/static/description/assets/misc/features.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

BIN
employee_late_check_in/static/description/assets/misc/logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
employee_late_check_in/static/description/assets/misc/pictures.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
employee_late_check_in/static/description/assets/misc/pie-chart.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
employee_late_check_in/static/description/assets/misc/right-arrow.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 967 B

BIN
employee_late_check_in/static/description/assets/misc/star.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
employee_late_check_in/static/description/assets/misc/support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
employee_late_check_in/static/description/assets/misc/whatsapp.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
employee_late_check_in/static/description/assets/modules/1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

BIN
employee_late_check_in/static/description/assets/modules/2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

BIN
employee_late_check_in/static/description/assets/modules/3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

BIN
employee_late_check_in/static/description/assets/modules/4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

BIN
employee_late_check_in/static/description/assets/modules/5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

BIN
employee_late_check_in/static/description/assets/modules/6.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

BIN
employee_late_check_in/static/description/assets/screenshots/1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

BIN
employee_late_check_in/static/description/assets/screenshots/2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

BIN
employee_late_check_in/static/description/assets/screenshots/3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
employee_late_check_in/static/description/assets/screenshots/4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

BIN
employee_late_check_in/static/description/assets/screenshots/5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

BIN
employee_late_check_in/static/description/assets/screenshots/hero.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

BIN
employee_late_check_in/static/description/banner.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

BIN
employee_late_check_in/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

718
employee_late_check_in/static/description/index.html

@ -0,0 +1,718 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Employee Late Check-in</title>
<!-- Bootstrap CSS -->
<link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/css/bootstrap.min.css"
integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm"
crossorigin="anonymous">
<link rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap"
rel="stylesheet">
</head>
<body>
<section>
<div class="container"
style="font-family: 'Inter', sans-serif !important;background-color: #fff !important;">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-12 d-flex justify-content-between flex-wrap align-items-sm-center"
style="border-bottom:1px solid rgba(0, 0, 0, 0.22)">
<div class="my-3">
<img src="assets/misc/Cybrosys R.png"
style="width:auto !important; height:40px !important">
</div>
<div class="my-3 d-flex align-items-center">
<div class="text-center"
style="background-color:#017E84 !important;font-size: 0.8rem !important; color:#fff !important; font-weight:500 !important; padding:4px !important; margin:0 3px !important; border-radius:50px !important; min-width: 120px !important;">
Community
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-12 text-center d-flex align-items-center flex-column"
style="margin: 80px 0px !important;">
<h1 style="font-size: 2.8rem;font-weight: 700; color:
#1A202C;">Employee Late Check-in</h1>
<p class="my-3 mb-4"
style="max-width: 80%; font-weight: 400 !important; line-height: 32px; color: #718096;">
Module for Tracking and Managing Late Check-ins of
Employees.</p>
<!-- END OF APP HERO -->
<div style="width: 80%; margin-top: 3rem;">
<img src="assets/screenshots/hero.gif"
class="img-responsive" width="100%" height="auto">
</div>
</div>
</div>
<div class="container mt-5 mb-5">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-4">
<p class="m-0"
style="font-weight: 600; font-size: 24px; color:#714b67 !important">
Key Highlights
</p>
</div>
<div class="row py-4">
<div class="col-md-6 col-sm-12 p-3">
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px;
background: #FFF;
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); ">
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67;
display: flex; justify-content: center; align-items: center;
margin-right: 10px; flex-shrink: 0;">
<i class="fa-solid fa-star "
style="color: #fff;font-size:14px;"></i>
</div>
<div>
<p style="color: #1A202C;font-weight: 600;
font-size: 1.2rem; margin-bottom: 2px;">
Easy to track employee check-ins.</p>
<p class="m-0" style="color:#718096">The module is designed for meticulous tracking and management of
employee punctuality.
It enables organizations to monitor late check-ins efficiently,
offering insights into tardiness patterns.This module contributes to fostering
a punctual and efficient work environment.
</p>
</div>
</div>
</div>
<div class="col-md-6 col-sm-12 p-3">
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px;
background: #FFF;
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); ">
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67;
display: flex; justify-content: center; align-items: center;
margin-right: 10px; flex-shrink: 0;">
<i class="fa-solid fa-star "
style="color: #fff;font-size:14px;"></i>
</div>
<div>
<p style="color: #1A202C;font-weight: 600;
font-size: 1.2rem; margin-bottom: 2px;">
Deduct from salary.</p>
<p class="m-0" style="color:#718096">Employer can deduct salary from payslip of the employees</p>
</div>
</div>
</div>
</div>
</div>
<div class="container rounded">
<ul class="nav nav-tabs d-flex"
style="width: fit-content;margin: 0 auto;gap: 1rem;">
<li class="col text-center py-2 text-nowrap "
style="color: #fff; background-color: #714B67;border-radius: 6px 6px 0px 0px;">
<a
class="active show" data-toggle="tab" href="#tab1"
style="color: #fff;font-weight: 500; background-color: #714B67; text-decoration: none;">
<i class="fa-regular fa-image pr-2"
style="color: #fff;"></i>
Screenshots</a></li>
<li class="col text-center py-2 text-nowrap "
style="color: #fff; background-color: #714B67;border-radius: 6px 6px 0px 0px;">
<a
data-toggle="tab" href="#tab2"
style="color: #fff;font-weight: 500; text-decoration: none;"><i
class="fa-solid fa-star pr-2"
style="color: #fff;"></i>Features</a></li>
<li class="col text-center py-2 text-nowrap "
style="color: #fff; background-color: #714B67;border-radius: 6px 6px 0px 0px;">
<a
data-toggle="tab" href="#tab3"
style="color: #fff;font-weight: 500; text-decoration: none; background-color: #714B67;"><i
class="fa-solid fa-book-open pr-2"
style="color: #fff;"></i>Released Notes</a></li>
</ul>
<div class="tab-content"
style="background-color: rgba(121, 113, 119, 0.04);">
<div id="tab1" class="tab-pane fade in active show">
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/1.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
Attendances --> Settings
</h4>
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
In Late Check-in block fill the field for Deduction amount
(Choose Per Minutes or Per Total) for how much amount to be
deducted from payslip.
</h4>
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
Field Late Check-in Starts After was for when the employee is considered as late.
</h4>
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
FField Maximum Late Minute was for maximum time limit an
employee is considered as late.
</h4>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/2.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
Attendances --> Late Check-in Menu
</h4>
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
Here you can see the employee's tardiness records together with
the duration of his tardiness (Default group by Employees).
</h4>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/3.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
Individual record when group by is removed.</h4>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/4.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
Manager Can Approve or refuse the Late Check-in.</h4>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/5.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
Create payroll for the employee.</h4>
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
Choose Base Salary Structure for Late Check-in, and the amount is deducted from the payslip.</h4>
</div>
</div>
</div>
</div>
<div id="tab2" class="tab-pane fade">
<div class="col-mg-12" style="padding: 1rem 4rem;">
<ul style="list-style: none; padding: 1rem 0;font-weight: 500;">
<li class="py-3"
style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; margin-bottom: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<span style="margin-right: 12px;"><img
src="assets/misc/star (1) 2.svg"
alt=""
width="16px"></span>Options to add Deduction amount, Late check-in starts, Maximum late minute.
</li>
<li class="py-3"
style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; margin-bottom: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<span style="margin-right: 12px;"><img
src="assets/misc/star (1) 2.svg"
alt=""
width="16px"></span>Can deduct penalty amount from payslip.
</li>
</ul>
</div>
</div>
<div id="tab3" class="tab-pane fade">
<div class="col-mg-12 active" style="padding: 1rem 4rem;">
<div class="py-3"
style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="d-flex mb-3"
style="font-size: 0.8rem; font-weight: 500;"><span>Version
17.0.1.0.0</span><span
class="px-2">|</span><span
style="color: #714B67;font-weight: 600;">Released on:4th Dec 2023</span>
</div>
<p class="m-0"
style=" color:#718096!important; font-size:1rem !important;line-height: 28px;">
Initial Commit for Employee Late Check-in.</p>
</div>
</div>
</div>
</div>
</div>
<div class="container mt-5">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-5">
<p class="m-0"
style="font-weight: 600; font-size: 24px; color:#000 !important">
Related Products</p>
</div>
</div>
<div id="myCarousel" class="carousel slide py-3" data-ride="carousel">
<div class="carousel-inner">
<div class="carousel-item active">
<div class="row p-4">
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/16.0/hr_payroll_community/"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px; ">
<img src="assets/modules/1.png"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
Manufacturing Reports</p>
</div>
</a>
</div>
</div>
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/16.0/hr_zk_attendance/"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px; ">
<img src="assets/modules/2.png"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
Print Work Order Details</p>
</div>
</a>
</div>
</div>
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/16.0/hr_payroll_account_community/"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px; ">
<img src="assets/modules/3.png"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
Show Total Cost On BOM</p>
</div>
</a>
</div>
</div>
</div>
</div>
<div class="carousel-item">
<div class="row p-4">
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/16.0/oh_appraisal/"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px; ">
<img src="assets/modules/4.png"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
Simple Manufacturing Orders</p>
</div>
</a>
</div>
</div>
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/16.0/hr_contract_types/"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px;">
<img src="assets/modules/5.png"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
BOM Multiple Product Selection</p>
</div>
</a>
</div>
</div>
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/16.0/ohrms_overtime/"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px;">
<img src="assets/modules/6.png"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
Catch Weight Management:
Manufacturing</p>
</div>
</a>
</div>
</div>
</div>
</div>
</div>
<a class="carousel-control-prev" href="#myCarousel"
data-slide="prev" style="width: 35px; color: #000;">
<span class="carousel-control-prev-icon">
<i class="fa fa-chevron-left"
style="font-size: 24px;"></i>
</span>
</a>
<a class="carousel-control-next" href="#myCarousel"
data-slide="next" style="width: 35px; color: #000;">
<span class="carousel-control-next-icon">
<i class="fa fa-chevron-right"
style="font-size: 24px;"></i>
</span>
</a>
</div>
<div class="container mt-5">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-4">
<p class="m-0"
style="font-weight: 600; font-size: 24px; color:#000 !important">
Our Services</p>
</div>
</div>
<div class="container my-5">
<div class="row py-3">
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#13EA36 ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/cogs.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Customization</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#DBC711; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/wrench.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Implementation</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative; border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#FF6B6B ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/lifebuoy.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Support</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative; border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#FFA801 ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/user.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Hire
Odoo Developer</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative; border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#54A0FF; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/puzzle.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Integration</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#6D7680 ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/update.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Migration</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#786FA6 ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/consultation.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Consultancy</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px;position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#F8A5C2 ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/training.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Implementation</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#E6BE26; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/license.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Licensing Consultancy</p>
</div>
</div>
</div>
</div>
<div class="container mt-5">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-4">
<p class="m-0"
style="font-weight: 600; font-size: 24px; color:#000 !important">
Our Industries</p>
</div>
</div>
<div class="container">
<div class="row my-5 py-4">
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100 "
style="border-right: 1px solid rgb(209, 209, 209); border-bottom: 1px solid rgb(209, 209, 209); padding: 30px; box-shadow: 6px 0 10px rgba(228, 227, 227, 0.373);">
<img src="assets/icons/trading-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">Trading</p>
<p>Easily procure and sell your products</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-right: 1px solid rgb(209, 209, 209);border-bottom: 1px solid rgb(209, 209, 209); padding: 30px;">
<img src="assets/icons/pos-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">POS</p>
<p>Easy configuration and convivial experience</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-right: 1px solid rgb(209, 209, 209);border-bottom: 1px solid rgba(0, 0, 0, 0.2); padding: 30px; box-shadow: 0 5px 10px rgba(228, 227, 227, 0.373)">
<img src="assets/icons/education-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">
Education</p>
<p>A platform for educational management</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-bottom: 1px solid rgb(209, 209, 209); padding: 30px; ">
<img src="assets/icons/manufacturing-black.png"
width="42px" height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">
Manufacturing</p>
<p>Plan, track and schedule your operations</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-right: 1px solid rgb(209, 209, 209); padding: 30px;">
<img src="assets/icons/ecom-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">E-commerce &
Website</p>
<p>Mobile friendly, awe-inspiring product pages</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-right: 1px solid rgb(209, 209, 209); padding: 30px;box-shadow: 0 -5px 10px rgba(228, 227, 227, 0.373);">
<img src="assets/icons/service-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">Service
Management</p>
<p>Keep track of services and invoice</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-right: 1px solid rgb(209, 209, 209); padding: 30px; ">
<img src="assets/icons/restaurant-black.png"
width="42px" height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">
Restaurant</p>
<p>Run your bar or restaurant methodically</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style=" padding: 30px;box-shadow: -5px 0 10px rgba(228, 227, 227, 0.373);">
<img src="assets/icons/hotel-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">Hotel
Management</p>
<p>An all-inclusive hotel management application</p>
</div>
</div>
</div>
</div>
<div class="container mt-5">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-5">
<p class="m-0"
style="font-weight: 600; font-size: 24px; color:#000 !important">
Support</p>
</div>
</div>
<div class="container my-5">
<div class="row" style="background-color: #FFFAFE;">
<div class="col-md-6 pb-4 d-flex align-items-center justify-content-center"
style="border-right: 1px solid #D9D9D9;">
<div style="padding: 30px;">
<div class="d-flex align-items-center">
<img src="assets/misc/support (1) 1.svg" alt=""
width="60px" style="margin-right: 12px;">
<div style="padding: 0px 8px;">
<span
style="color: #714B67;font-size: 24px;font-weight: 600;padding-bottom: 1rem;">Need
Help?</span>
<p class="m-0" style="color:#718096;">Got
questions or need help? Get in touch.</p>
<div style="font-weight: 400;"><span><img
src="assets/misc/support-email.svg"
alt=""
width="18px"
style="filter: invert(1);margin-right: 0.8rem;"></span>odoo@cybrosys.com
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6 pb-4 d-flex align-items-center justify-content-center">
<div style="padding: 30px;">
<div class="d-flex align-items-center">
<img src="assets/misc/whatsapp 1.svg" alt=""
width="60px" style="margin-right: 12px;">
<div>
<span style="color: #714B67;font-size: 24px;font-weight: 600;">WhatsApp</span>
<p class="m-0" style="color:#718096;">Say hi to
us on WhatsApp!</p>
<div style="font-weight: 400; font-size: 16px;"><span><img
src="assets/misc/phone.svg"
alt="" width="14px"
style="filter: invert(1); margin-right: 0.8rem;"></span>+91
99456767686
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
</body>
</html>

14
employee_late_check_in/views/hr_attendance_views.xml

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!--Add field in hr.employee tree view-->
<record id="view_attendance_tree" model="ir.ui.view">
<field name="name">hr.attendance.view.tree.inherit.employee.late.check.in</field>
<field name="model">hr.attendance</field>
<field name="inherit_id" ref="hr_attendance.view_attendance_tree"/>
<field name="arch" type="xml">
<field name="check_out" position="after">
<field name="late_check_in"/>
</field>
</field>
</record>
</odoo>

35
employee_late_check_in/views/hr_employee_views.xml

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!--Smart button in hr.employee.public to show the late check in records-->
<record id="hr_employee_public_view_form" model="ir.ui.view">
<field name="name">hr.employee.public.view.form.inherit.employee.late.check.in</field>
<field name="model">hr.employee.public</field>
<field name="inherit_id" ref="hr.hr_employee_public_view_form"/>
<field name="arch" type="xml">
<div name="button_box" position="inside">
<button name="action_to_open_late_check_in_records"
type="object"
class="oe_stat_button"
icon="fa-clock-o">
<field name="late_check_in_count" widget="statinfo" string="Late Check-In"/>
</button>
</div>
</field>
</record>
<!--Smart button in hr.employee to show the late check in records-->
<record id="view_employee_form" model="ir.ui.view">
<field name="name">hr.employee.view.form.inherit.employee.late.check.in</field>
<field name="model">hr.employee</field>
<field name="inherit_id" ref="hr.view_employee_form"/>
<field name="arch" type="xml">
<div name="button_box" position="inside">
<button name="action_to_open_late_check_in_records"
type="object"
class="oe_stat_button"
icon="fa-clock-o">
<field name="late_check_in_count" widget="statinfo" string="Late Check-In"/>
</button>
</div>
</field>
</record>
</odoo>

15
employee_late_check_in/views/hr_payslip_views.xml

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!--Add field in hr_payroll_community model-->
<record id="hr_payslip_view_form" model="ir.ui.view">
<field name="name">hr.payslip.view.form.inherit.employee.late.check.in</field>
<field name="model">hr.payslip</field>
<field name="inherit_id"
ref="hr_payroll_community.hr_payslip_view_form"/>
<field name="arch" type="xml">
<field name="name" position="after">
<field name="late_check_in_ids" invisible="1"/>
</field>
</field>
</record>
</odoo>

93
employee_late_check_in/views/late_check_in_views.xml

@ -0,0 +1,93 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!--Sequence for late.check.in model-->
<record id="late_check_in_sequence" model="ir.sequence">
<field name="name">late.check.in.sequence</field>
<field name="code">late.check.in</field>
<field name="prefix">LC</field>
<field eval="1" name="number_next"/>
<field eval="1" name="number_increment"/>
<field name="padding">5</field>
</record>
<!-- Views -->
<!-- Form View -->
<record id="late_check_in_view_form" model="ir.ui.view">
<field name="name">late.check.in.view.form</field>
<field name="model">late.check.in</field>
<field name="arch" type="xml">
<form string="Late Check-in" create="false">
<header>
<field name="state" widget="statusbar"
statusbar_visible="draft,approved"/>
<button name="approve" string="Approve"
type="object" class="btn-primary"
groups="hr.group_hr_manager"/>
<button name="reject" string="Refuse" type="object"
class="btn-primary"
groups="hr.group_hr_manager"/>
</header>
<sheet>
<div class="oe_title">
<h1>
<field name="name" required="0"
placeholder="Reference ...."/>
</h1>
</div>
<group>
<group>
<field name='employee_id'
options="{'no_quick_create': True, 'no_create_edit' : True}"
invisible="state != 'draft'"/>
<field name='late_minutes'/>
</group>
<group>
<field name='date'/>
<field name="penalty_amount"/>
<field name="attendance_id"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<!--Search View-->
<record id="late_check_in_view_search" model="ir.ui.view">
<field name="name">late.check.in.view.search</field>
<field name="model">late.check.in</field>
<field name="arch" type="xml">
<search string="Search Late check-in records">
<group expand="0" string="Group By">
<filter string="Employee" name="group_employee" domain="[]"
context="{'group_by':'employee_id'}"/>
</group>
</search>
</field>
</record>
<!-- Tree View -->
<record id="late_check_in_view_tree" model="ir.ui.view">
<field name="name">late.check.in.view.tree</field>
<field name="model">late.check.in</field>
<field name="arch" type="xml">
<tree string="Late Check-in">
<field name="name"/>
<field name="employee_id"/>
<field name="late_minutes"/>
<field name="date"/>
<field name="penalty_amount"/>
</tree>
</field>
</record>
<!-- Actions -->
<record id="late_check_in_action" model="ir.actions.act_window">
<field name="name">Late Check-in</field>
<field name="res_model">late.check.in</field>
<field name="view_mode">tree,form</field>
<field name="context">{'search_default_group_employee': 1}</field>
</record>
<!-- MenuItems -->
<menuitem id="menu_late_check_in" name="Late Check-in"
parent="hr_attendance.menu_hr_attendance_root"
action="late_check_in_action"
sequence="21"
groups="hr.group_hr_user"/>
</odoo>

33
employee_late_check_in/views/res_config_settings_views.xml

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
Adding fields in res.config.settings
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="name">res.config.settings.view.form.inherit.employee.late.check.in</field>
<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="//app[@name='hr_attendance']" position="inside">
<block title="Late Check-in">
<setting id="deduction_amount" company_dependent="1"
help="Amount to be deducted from payslip.
(If Per Minutes is chosen then for each
minute given amount is deducted,
if Per Total is chosen then given amount is
deducted from the payslip.)">
<field name="deduction_amount" widget="monetary"/>
<field name="deduction_type"/>
</setting>
<setting id="late_check_in_after" company_dependent="1"
help="When should the late check-in count down starts.">
<field name="late_check_in_after"/><span>Minutes</span>
</setting>
<setting id="maximum_minutes" company_dependent="1"
help="Maximum time limit a employee was considered as late.">
<field name="maximum_minutes"/><span>Minutes</span>
</setting>
</block>
</xpath>
</field>
</record>
</odoo>
Loading…
Cancel
Save