Browse Source

Apr 04: [ADD] Initial Commit 'employee_late_check_in'

pull/278/merge
RisvanaCybro 1 year ago
parent
commit
eed250a14e
  1. 48
      employee_late_check_in/README.rst
  2. 22
      employee_late_check_in/__init__.py
  3. 56
      employee_late_check_in/__manifest__.py
  4. 15
      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. 120
      employee_late_check_in/models/hr_attendance.py
  9. 56
      employee_late_check_in/models/hr_employee.py
  10. 56
      employee_late_check_in/models/hr_employees_public.py
  11. 65
      employee_late_check_in/models/hr_payslip.py
  12. 87
      employee_late_check_in/models/late_check_in.py
  13. 52
      employee_late_check_in/models/res_company.py
  14. 56
      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/employee_late_check_in_1.png
  57. BIN
      employee_late_check_in/static/description/assets/screenshots/employee_late_check_in_10.png
  58. BIN
      employee_late_check_in/static/description/assets/screenshots/employee_late_check_in_2.png
  59. BIN
      employee_late_check_in/static/description/assets/screenshots/employee_late_check_in_3.png
  60. BIN
      employee_late_check_in/static/description/assets/screenshots/employee_late_check_in_4.png
  61. BIN
      employee_late_check_in/static/description/assets/screenshots/employee_late_check_in_5.png
  62. BIN
      employee_late_check_in/static/description/assets/screenshots/employee_late_check_in_6.png
  63. BIN
      employee_late_check_in/static/description/assets/screenshots/employee_late_check_in_7.png
  64. BIN
      employee_late_check_in/static/description/assets/screenshots/employee_late_check_in_8.png
  65. BIN
      employee_late_check_in/static/description/assets/screenshots/employee_late_check_in_9.png
  66. BIN
      employee_late_check_in/static/description/assets/screenshots/hero.gif
  67. BIN
      employee_late_check_in/static/description/banner.png
  68. BIN
      employee_late_check_in/static/description/icon.png
  69. 600
      employee_late_check_in/static/description/index.html
  70. 14
      employee_late_check_in/views/hr_attendance_views.xml
  71. 35
      employee_late_check_in/views/hr_employee_views.xml
  72. 15
      employee_late_check_in/views/hr_payslip_views.xml
  73. 93
      employee_late_check_in/views/late_check_in_views.xml
  74. 56
      employee_late_check_in/views/res_config_settings_views.xml

48
employee_late_check_in/README.rst

@ -0,0 +1,48 @@
.. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-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
-------
Affero General Public License, Version 3 (AGPL v3).
(https://www.gnu.org/licenses/agpl-3.0-standalone.html)
Credits
-------
Developer: (V17) Mohamed Muzammil VP,
(V16) Mufeeda Shirin,
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) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL 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) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
{
"name": "Employee Late Check-in",
"version": "16.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"],
"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.png"],
"license": "AGPL-3",
"installable": True,
"auto_install": False,
"application": False,
}

15
employee_late_check_in/data/ir_cron_data.xml

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!--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 name="doall" eval="False"/>
</record>
</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>
#### 03.04.2024
#### Version 16.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) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL 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

120
employee_late_check_in/models/hr_attendance.py

@ -0,0 +1,120 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL 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 as a scheduled action"""
minutes_after = (
int(
self.env["ir.config_parameter"]
.sudo()
.get_param("employee_late_check_in.late_check_in_after")
)
or 0
)
max_limit = (
int(
self.env["ir.config_parameter"]
.sudo()
.get_param("employee_late_check_in.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,
}
)

56
employee_late_check_in/models/hr_employee.py

@ -0,0 +1,56 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL 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)]
)

56
employee_late_check_in/models/hr_employees_public.py

@ -0,0 +1,56 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL 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)]
)

65
employee_late_check_in/models/hr_payslip.py

@ -0,0 +1,65 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL 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("penalty_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()

87
employee_late_check_in/models/late_check_in.py

@ -0,0 +1,87 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL 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="Attendance 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"

52
employee_late_check_in/models/res_company.py

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

56
employee_late_check_in/models/res_config_settings.py

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

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: 84 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 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: 83 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 KiB

BIN
employee_late_check_in/static/description/banner.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

BIN
employee_late_check_in/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

600
employee_late_check_in/static/description/index.html

@ -0,0 +1,600 @@
<div style="background-color: #714B67; height: 810px; width: 100%; padding: 15px; position: relative;">
<!-- TITLE BAR -->
<div class="d-flex align-items-center justify-content-between"
style="border-bottom: 1px solid #875A7B; padding: 15px; display: flex; justify-content: space-between; align-items: center;">
<img src="assets/misc/cybrosys-logo.png" width="42" height="42" style="width: 42px; height: 42px;"/>
<div>
<div
style="color: #7C7BAD; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2">
<i class="fa fa-check mr-1"></i>Community
</div>
<div
style="color: #7C7BAD; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2">
<i class="fa fa-check mr-1"></i>Enterprise
</div>
</div>
</div>
<!-- END OF TITLE BAR -->
<div class="container">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-12">
<!-- APP HERO -->
<h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;">
Employee Late Check-In
</h1>
<p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;">Employee Late Check-in
Penalty deduction from payroll</p>
<!-- END OF APP HERO -->
<img src="assets/screenshots/hero.gif" class="img-responsive"
style="width: 100%; margin-left: auto; margin-right: auto;"/>
</div>
</div>
</div>
</div>
<!-- NAVIGATION SECTION -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px; margin-top: 300px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/compass.png"/>
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Explore This
Module</h2>
</div>
<div class="row my-4" style="font-family: 'Montserrat', sans-serif;">
<div class="col-sm-12 col-md-6 my-3">
<a href="#overview">
<div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Overview</span>
<span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">Learn
more about this
module</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36"/>
</div>
</a>
</div>
<div class="col-sm-12 col-md-6 my-3">
<a href="#features">
<div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Features</span>
<span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View
features of this
module</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36"/>
</div>
</a>
</div>
<div class="col-sm-12 col-md-6 my-3">
<a href="#screenshots">
<div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Screenshots</span>
<span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View
screenshots for this
module</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36"/>
</div>
</a>
</div>
</div>
<!-- END OF NAVIGATION SECTION -->
<!-- OVERVIEW SECTION -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="overview">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/pie-chart.png"/>
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Overview
</h2>
</div>
<div class="row" style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;">
<div class="col-sm-12 py-4">
This module Allows Employee Late check-in deduction/penalty from the Payroll .
</div>
</div>
<!-- END OF OVERVIEW SECTION -->
<!-- FEATURES SECTION -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="features">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/features.png"/>
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Features
</h2>
</div>
<div class="row" style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;">
<div class="col-sm-12 col-md-6">
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Available in Odoo 16.0
Community and Enterprise</span>
</div>
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Late Check-in minutes in Attendance log</span>
</div>
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Deduction based on configuration</span>
</div>
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Late check-in deduction from payslip</span>
</div>
</div>
</div>
<!-- END OF FEATURES SECTION -->
<!-- SCREENSHOTS SECTION -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="screenshots">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/pictures.png"/>
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Screenshots
</h2>
</div>
<div class="row">
<div class="col-sm-12">
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Configure the Late Check-in Settings
</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">After installation, open Attendance >> Configuration
</p>
<img src="assets/screenshots/employee_late_check_in_1.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Late Check-in Minutes in Attendance
</h3>
<img src="assets/screenshots/employee_late_check_in_2.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Scheduled Action for Late Check-in
</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">There is a Scheduled Action for the creation of Late Check-in records in Late Check-in Menu
</p>
<img src="assets/screenshots/employee_late_check_in_3.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Late Check-in List View as Group By
</h3>
<img src="assets/screenshots/employee_late_check_in_4.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Late Check-in List View
</h3>
<img src="assets/screenshots/employee_late_check_in_5.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Late Check-in Form View
</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Manager Can Approve or Refuse the Late check-in in the case of deduction
</p>
<img src="assets/screenshots/employee_late_check_in_6.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Late Check-in in Employee Form View
</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">In Employee Module, Late Check-in can be seen as Smart Button in Employee Form view
</p>
<img src="assets/screenshots/employee_late_check_in_7.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Add Salary Structure In contract
</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Create a new contract or edit the contract by adding the 'Base Salary Structure For Late Check-in' as the Salary Structure </p>
<img src="assets/screenshots/employee_late_check_in_8.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Late check-in details in Payroll
</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Create new Payroll for the Employee,Now we can see the Late check-in details in Other Inputs
</p>
<img src="assets/screenshots/employee_late_check_in_9.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Salary Deduction from Payroll
</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">When Computing the Salary Computation,We can see the deduction details for Late check-in
</p>
<img src="assets/screenshots/employee_late_check_in_10.png" class="img-thumbnail">
</div>
</div>
</div>
<!-- END OF SCREENSHOTS SECTION -->
<!-- RELATED PRODUCTS -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/categories.png"/>
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Related
Products
</h2>
</div>
<div class="row">
<div class="col-sm-12">
<div id="demo1" class="row carousel slide" data-ride="carousel">
<!-- The slideshow -->
<div class="carousel-inner" style="padding: 30px;">
<div class="carousel-item" style="min-height: 198.656px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/employee_check_list/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/1.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/oh_appraisal/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/2.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/hr_payroll_account_community/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/3.png">
</div>
</a>
</div>
</div>
<div class="carousel-item active" style="min-height: 198.656px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/employee_stages/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/4.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/hr_zk_attendance/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/5.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/employee_documents_expiry/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/6.png">
</div>
</a>
</div>
</div>
</div>
</div>
</div>
<!-- Left and right controls -->
<a class="carousel-control-prev" href="#demo1" 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="#demo1" 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>
</div>
<!-- END OF RELATED PRODUCTS -->
<!-- OUR SERVICES -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/star.png"/>
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Our Services
</h2>
</div>
<div class="container my-5">
<div class="row">
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #1dd1a1 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/cogs.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Customization</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #ff6b6b !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/wrench.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Implementation</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #6462CD !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/lifebuoy.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Support</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #ffa801 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/user.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Hire
Odoo
Developer</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #54a0ff !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/puzzle.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Integration</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #6d7680 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/update.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Migration</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #786fa6 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/consultation.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Consultancy</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #f8a5c2 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/training.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Implementation</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #e6be26 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/license.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Licensing Consultancy</h6>
</div>
</div>
</div>
<!-- END OF END OF OUR SERVICES -->
<!-- OUR INDUSTRIES -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/corporate.png"/>
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Our
Industries
</h2>
</div>
<div class="container my-5">
<div class="row">
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/trading-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Trading
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Easily procure
and
sell your products</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/pos-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
POS
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Easy
configuration
and convivial experience</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/education-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Education
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
A platform for
educational management</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/manufacturing-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Manufacturing
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Plan, track and
schedule your operations</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/ecom-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
E-commerce &amp; Website
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Mobile
friendly,
awe-inspiring product pages</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/service-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Service Management
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Keep track of
services and invoice</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/restaurant-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Restaurant
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Run your bar or
restaurant methodically</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/hotel-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Hotel Management
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
An
all-inclusive
hotel management application</p>
</div>
</div>
</div>
</div>
<!-- END OF END OF OUR INDUSTRIES -->
<!-- SUPPORT -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/customer-support.png"/>
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Support
</h2>
</div>
<div class="container mt-5">
<div class="row">
<div class="col-sm-12 col-md-6">
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;">
<div class="mr-4 d-flex justify-content-center align-items-center"
style="background-color: #714B67; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;">
<img src="assets/misc/support.png" height="48" width="48" style="width: 42px; height: 42px;"/>
</div>
<div>
<h4>Need Help?</h4>
<p style="line-height: 100%;">Got questions or need help? Get in touch.</p>
<a href="mailto:odoo@cybrosys.com">
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;">
odoo@cybrosys.com</p>
</a>
</div>
</div>
</div>
<div class="col-sm-12 col-md-6">
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;">
<div class="mr-4 d-flex justify-content-center align-items-center"
style="background-color: #2AC44D; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;">
<img src="assets/misc/whatsapp.png" height="52" width="52" style="width: 52px; height: 52px;"/>
</div>
<div>
<h4>WhatsApp</h4>
<p style="line-height: 100%;">Say hi to us on WhatsApp!</p>
<a href="https://api.whatsapp.com/send?phone=918606827707">
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;">+91 86068
27707</p>
</a>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12 my-5 d-flex justify-content-center align-items-center">
<img src="assets/misc/logo.png" width="144" height="31"
style="width:144px; height: 31px; margin-top: 40px;"/>
</div>
</div>
</div>
<!-- END OF SUPPORT -->

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="view_hr_payslip_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.view_hr_payslip_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" attrs="{'invisible':[('state','!=','draft')]}"/>
<button name="reject" string="Refuse" type="object"
class="btn-primary"
groups="hr.group_hr_manager" attrs="{'invisible':[('state','!=','draft')]}"/>
</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}"
attrs="{'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>

56
employee_late_check_in/views/res_config_settings_views.xml

@ -0,0 +1,56 @@
<?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="//div[hasclass('app_settings_block')][@data-key='hr_attendance']" position="inside">
<h2>Late Check-in</h2>
<div class="row mt16 o_settings_container" name="late_check_in">
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_right_pane">
<label for="deduction_amount" class="o_form_label">Deduction Amount</label>
<span class="fa fa-lg fa-building-o" title="Values set here are company-specific."
role="img" aria-label="Values set here are company-specific."
groups="base.group_multi_company"/>
<div class="text-muted">
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.)
</div>
<div class="mt16">
<div class="mt16 row">
<field name="deduction_amount" widget="monetary"/>
<field name="deduction_type"/>
</div>
<br/>
<label for="late_check_in_after" class="o_form_label">
Late Check In Starts After
</label>
<div class="text-muted">
When should the late check-in count down starts.
</div>
<field name="late_check_in_after"/>
<span>Minutes</span>
<br/>
<br/>
<label for="maximum_minutes" class="o_form_label">
Maximum Late Minutes
</label>
<div class="text-muted">
Maximum time limit a employee was considered as late.
</div>
<field name="maximum_minutes"/><span>Minutes</span>
</div>
</div>
</div>
</div>
</xpath>
</field>
</record>
</odoo>
Loading…
Cancel
Save