diff --git a/web_portal_attendance/README.rst b/web_portal_attendance/README.rst
new file mode 100644
index 000000000..4bdce2032
--- /dev/null
+++ b/web_portal_attendance/README.rst
@@ -0,0 +1,42 @@
+.. 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
+
+Portal Attendance
+==================
+This module allow to create attendance from portal without any user access
+
+Company
+-------
+* `Cybrosys Techno Solutions `__
+
+License
+-------
+General Public License, Version 3 (AGPL v3).
+(https://www.odoo.com/documentation/user/16.0/legal/licenses/licenses.html)
+
+Credits
+-------
+Developer: (V16) THASNI CP , 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 `__
+
+Further information
+===================
+HTML Description: ``__
diff --git a/web_portal_attendance/__init__.py b/web_portal_attendance/__init__.py
new file mode 100644
index 000000000..a96672476
--- /dev/null
+++ b/web_portal_attendance/__init__.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+################################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2023-TODAY Cybrosys Technologies().
+# Author: THASNI CP (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 .
+#
+################################################################################
+from . import controllers
+from. import models
diff --git a/web_portal_attendance/__manifest__.py b/web_portal_attendance/__manifest__.py
new file mode 100644
index 000000000..84a4d14ce
--- /dev/null
+++ b/web_portal_attendance/__manifest__.py
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+################################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2023-TODAY Cybrosys Technologies().
+# Author: THASNI CP (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 .
+#
+################################################################################
+{
+ 'name': 'Portal Attendance',
+ 'version': '16.0.1.0.0',
+ 'category': 'Website,Human Resources',
+ 'summary': """For creating attendance from portal.""",
+ 'description': 'Using Portal Attendance module user can see their '
+ 'attendance and also mark their '
+ 'attendance from portal as well',
+ 'author': 'Cybrosys Techno Solutions',
+ 'company': 'Cybrosys Techno Solutions',
+ 'maintainer': 'Cybrosys Techno Solutions',
+ 'website': 'https://www.cybrosys.com',
+ 'depends': ['website', 'hr_attendance', 'contacts'],
+ 'data': [
+ 'views/hr_attendance_templates.xml',
+ 'views/hr_attendance_views.xml',
+ 'views/portal.xml',
+ ],
+ 'assets': {'web.assets_frontend': [
+ 'web_portal_attendance/static/src/js/portal_message.js',
+ ], },
+ 'images': ['static/description/banner.png'],
+ 'license': 'AGPL-3',
+ 'installable': True,
+ 'auto_install': False,
+ 'application': False,
+}
diff --git a/web_portal_attendance/controllers/__init__.py b/web_portal_attendance/controllers/__init__.py
new file mode 100644
index 000000000..daa3e5329
--- /dev/null
+++ b/web_portal_attendance/controllers/__init__.py
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+################################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2023-TODAY Cybrosys Technologies().
+# Author: THASNI CP (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 .
+#
+################################################################################
+from . import portal
+
+
diff --git a/web_portal_attendance/controllers/portal.py b/web_portal_attendance/controllers/portal.py
new file mode 100644
index 000000000..3d4ba3ae6
--- /dev/null
+++ b/web_portal_attendance/controllers/portal.py
@@ -0,0 +1,233 @@
+# -*- coding: utf-8 -*-
+################################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2023-TODAY Cybrosys Technologies().
+# Author: THASNI CP (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 .
+#
+################################################################################
+import pytz
+from collections import OrderedDict
+from datetime import datetime
+from dateutil.relativedelta import relativedelta
+from odoo import fields
+from odoo import http
+from odoo.http import request
+from odoo.tools import date_utils
+from odoo.addons.portal.controllers import portal
+from odoo.addons.portal.controllers.portal import pager
+
+
+class PortalAttendance(portal.CustomerPortal):
+ """To get the values of portal attendance"""
+ def _prepare_home_portal_values(self, counters):
+ """To get the count of the attendance in portal"""
+ values = super(PortalAttendance, self)._prepare_home_portal_values(
+ counters)
+ uid = request.session.uid
+ user_id = request.env['res.users'].browse(uid)
+ employee_id = request.env['hr.employee'].search(
+ [('user_id', '=', user_id.id)])
+ attendance_count = request.env['hr.attendance'].search_count(
+ [('is_portal', '=', True), ('employee_id', '=', employee_id.id)])
+ values.update({
+ 'attendance_count': attendance_count
+ })
+ return values
+
+ @http.route('/attendance/checkin', type='http', auth='user', website=True)
+ def attendance_checkin(self):
+ """When clicking the checkin button it will redirect to the check in
+ template"""
+ uid = request.session.uid
+ user_id = request.env['res.users'].browse(uid)
+ employee_id = request.env['hr.employee'].search(
+ [('user_id', '=', user_id.id)])
+ values = {
+ 'name': employee_id.name,
+ 'image': employee_id.image_1920,
+ 'check_in': datetime.now()
+ }
+ return request.render("web_portal_attendance.check_in_template", values)
+
+ @http.route('/check/in', type='http', auth='user', website=True)
+ def attendance_creation(self):
+ """When clicking the checkin button it will create attendance to the
+ backend"""
+ uid = request.session.uid
+ user_id = request.env['res.users'].browse(uid)
+ employee_id = request.env['hr.employee'].search(
+ [('user_id', '=', user_id.id)])
+ attendance = request.env['hr.attendance'].sudo().create({
+ 'employee_id': employee_id.id,
+ 'check_in': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
+ 'is_portal': True
+ })
+ check_in = datetime.now()
+ user_tz = pytz.timezone(
+ request.env.context.get('tz') or request.env.user.tz)
+ date_today = pytz.utc.localize(check_in).astimezone(user_tz)
+ formatted_time = datetime.strftime(date_today, '%H:%M:%S')
+ values = {
+ 'attendance': attendance,
+ 'name': employee_id.name,
+ 'image': employee_id.image_1920,
+ 'check_out': False,
+ 'formatted_time': formatted_time,
+ }
+ return request.render(
+ "web_portal_attendance.check_in_welcome_note_template", values)
+
+ @http.route('/check/out', type='http', auth='user', website=True)
+ def attendance_checkout(self):
+ """When clicking the checkout button it will store the checkout time
+ and worked hours in the check in log """
+ uid = request.session.uid
+ user_id = request.env['res.users'].browse(uid)
+ employee_id = request.env['hr.employee'].search(
+ [('user_id', '=', user_id.id)])
+ values = {
+ 'name': employee_id.name,
+ 'image': employee_id.image_1920
+ }
+ return request.render("web_portal_attendance.check_out_template",
+ values)
+
+ @http.route('/check/out/last', type='http', auth='user', website=True)
+ def attendance_final_checkout(self):
+ """To display the final checkout template """
+ uid = request.session.uid
+ user_id = request.env['res.users'].browse(uid)
+ employee_id = request.env['hr.employee'].search(
+ [('user_id', '=', user_id.id)])
+ check_out = datetime.now()
+ user_tz = pytz.timezone(
+ request.env.context.get('tz') or request.env.user.tz)
+ date_today = pytz.utc.localize(check_out).astimezone(user_tz)
+ formatted_time = datetime.strftime(date_today, '%H:%M:%S')
+ attendance = request.env['hr.attendance'].search(
+ [('employee_id', '=', employee_id.id), ('check_out', '=', False),
+ ('is_portal', '=', True)],
+ order="check_in desc", limit=1)
+ # If there is an attendance record with no check-out time,
+ # update it with the current time
+ if attendance:
+ check_out = datetime.now()
+ check_in = attendance.check_in
+ worked_hours = check_out - check_in
+ total_seconds = worked_hours.total_seconds()
+ hours = int(total_seconds / 3600)
+ minutes = int((total_seconds % 3600) / 60)
+ worked_hours_str = "{:02d}:{:02d}".format(hours, minutes)
+ hours, minutes = map(int, worked_hours_str.split(':'))
+ worked_hours_float = hours + minutes / 60.0
+ attendance.write({
+ 'check_out': check_out.strftime('%Y-%m-%d %H:%M:%S'),
+ 'worked_hours': worked_hours_float
+ })
+ values = {
+ 'name': employee_id.name,
+ 'image': employee_id.image_1920,
+ 'formatted_time': formatted_time
+ }
+ return request.render("web_portal_attendance.portal_last_checkout",
+ values)
+
+ @http.route(['/attendance/list', '/attendance/list/page/'],
+ type='http', website=True)
+ def attendance_search_sort_view(self, page=1, search=None,
+ search_in="Check In",
+ filterby="all", **kwargs):
+ """To search and filter in the list view of attendance"""
+ uid = request.session.uid
+ user_id = request.env['res.users'].browse(uid)
+ employee_id = request.env['hr.employee'].search(
+ [('user_id', '=', user_id.id)])
+ search_list = {
+ 'Work Hour': {'label': 'Work Hour', 'input': 'Work Hour',
+ 'domain': [('worked_hours', 'ilike', search)]},
+ 'Check In': {'label': 'Check In', 'input': 'Check In',
+ 'domain': [('check_in', 'ilike', search)]},
+ 'Check Out': {'label': 'Check Out', 'input': 'Check Out',
+ 'domain': [('check_out', 'ilike', search)]}, }
+ today = fields.Date.today()
+ last_week = today + relativedelta(weeks=-1)
+ last_month = today + relativedelta(months=-1)
+ last_year = today + relativedelta(years=-1)
+ searchbar_filters = {
+ 'all': {'label': 'All', 'domain': []},
+ 'today': {
+ 'label': 'Today',
+ 'domain': [("check_in", ">=",
+ fields.Datetime.to_string(fields.Datetime.today())),
+ ("check_in", "<=", fields.Datetime.to_string(
+ fields.Datetime.today().replace(hour=23,
+ minute=59,
+ second=59)))]},
+ 'week': {
+ 'label': 'Last Week',
+ 'domain': [
+ ('check_in', '>=', date_utils.start_of(last_week, "week")),
+ ('check_in', '<=', date_utils.end_of(last_week, 'week'))]},
+ 'month': {
+ 'label': 'Last Month',
+ 'domain': [('check_in', '>=',
+ date_utils.start_of(last_month, 'month')),
+ ('check_in', '<=',
+ date_utils.end_of(last_month, 'month'))]},
+ 'year': {
+ 'label': 'Last Year',
+ 'domain': [
+ ('check_in', '>=', date_utils.start_of(last_year, 'year')),
+ ('check_in', '<=', date_utils.end_of(last_year, 'year'))]}}
+ search_domain = search_list[search_in]['domain']
+ filter_domain = searchbar_filters[filterby]['domain']
+ attendance_obj = request.env['hr.attendance'].search(
+ [('is_portal', '=', True), ('employee_id', '=', employee_id.id)])
+ total_attendance = attendance_obj.search_count(
+ [('is_portal', '=', True),
+ ('employee_id', '=',
+ employee_id.id)] + search_domain + filter_domain)
+ page_detail = pager(url='/attendance/list',
+ total=total_attendance,
+ page=page,
+ step=10,
+ url_args={'search': search,
+ 'search_in': search_in,
+ 'filterby': filterby})
+ attendance_domain = [('is_portal', '=', True),
+ ('employee_id', '=', employee_id.id)]
+ if search_domain:
+ attendance_domain += search_domain
+ if filter_domain:
+ attendance_domain += filter_domain
+ attendance = attendance_obj.search(
+ attendance_domain,
+ limit=10,
+ offset=page_detail['offset'])
+ vals = {
+ 'attendance': attendance,
+ 'page_name': 'attendance',
+ 'pager': page_detail,
+ 'search': search,
+ 'search_in': search_in,
+ 'searchbar_inputs': search_list,
+ 'default_url': '/attendance/list',
+ 'searchbar_filters': OrderedDict(sorted(searchbar_filters.items())),
+ 'filterby': filterby,
+ }
+ return request.render(
+ "web_portal_attendance.portal_list_attendance_order", vals)
diff --git a/web_portal_attendance/doc/RELEASE_NOTES.md b/web_portal_attendance/doc/RELEASE_NOTES.md
new file mode 100644
index 000000000..19c820d81
--- /dev/null
+++ b/web_portal_attendance/doc/RELEASE_NOTES.md
@@ -0,0 +1,7 @@
+## Module
+
+#### 19.10.2023
+#### Version 16.0.1.0.0
+#### ADD
+
+- Initial commit for Portal Attendance
diff --git a/web_portal_attendance/models/__init__.py b/web_portal_attendance/models/__init__.py
new file mode 100644
index 000000000..bed9565fd
--- /dev/null
+++ b/web_portal_attendance/models/__init__.py
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+################################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2023-TODAY Cybrosys Technologies().
+# Author: THASNI CP (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 .
+#
+################################################################################
+from . import hr_attendance
+
+
diff --git a/web_portal_attendance/models/hr_attendance.py b/web_portal_attendance/models/hr_attendance.py
new file mode 100644
index 000000000..dc5a3d977
--- /dev/null
+++ b/web_portal_attendance/models/hr_attendance.py
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*-
+################################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2023-TODAY Cybrosys Technologies().
+# Author: THASNI CP (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 .
+#
+################################################################################
+from odoo import fields, models
+
+
+class HrAttendance(models.Model):
+ """To add a boolean field to check the attendance from website"""
+ _inherit = 'hr.attendance'
+
+ is_portal = fields.Boolean(string="From Portal",
+ help="To check if the attendance from portal "
+ "or not", default=False)
diff --git a/web_portal_attendance/static/description/assets/icons/check.png b/web_portal_attendance/static/description/assets/icons/check.png
new file mode 100644
index 000000000..c8e85f51d
Binary files /dev/null and b/web_portal_attendance/static/description/assets/icons/check.png differ
diff --git a/web_portal_attendance/static/description/assets/icons/chevron.png b/web_portal_attendance/static/description/assets/icons/chevron.png
new file mode 100644
index 000000000..2089293d6
Binary files /dev/null and b/web_portal_attendance/static/description/assets/icons/chevron.png differ
diff --git a/web_portal_attendance/static/description/assets/icons/cogs.png b/web_portal_attendance/static/description/assets/icons/cogs.png
new file mode 100644
index 000000000..95d0bad62
Binary files /dev/null and b/web_portal_attendance/static/description/assets/icons/cogs.png differ
diff --git a/web_portal_attendance/static/description/assets/icons/consultation.png b/web_portal_attendance/static/description/assets/icons/consultation.png
new file mode 100644
index 000000000..8319d4baa
Binary files /dev/null and b/web_portal_attendance/static/description/assets/icons/consultation.png differ
diff --git a/web_portal_attendance/static/description/assets/icons/ecom-black.png b/web_portal_attendance/static/description/assets/icons/ecom-black.png
new file mode 100644
index 000000000..a9385ff13
Binary files /dev/null and b/web_portal_attendance/static/description/assets/icons/ecom-black.png differ
diff --git a/web_portal_attendance/static/description/assets/icons/education-black.png b/web_portal_attendance/static/description/assets/icons/education-black.png
new file mode 100644
index 000000000..3eb09b27b
Binary files /dev/null and b/web_portal_attendance/static/description/assets/icons/education-black.png differ
diff --git a/web_portal_attendance/static/description/assets/icons/hotel-black.png b/web_portal_attendance/static/description/assets/icons/hotel-black.png
new file mode 100644
index 000000000..130f613be
Binary files /dev/null and b/web_portal_attendance/static/description/assets/icons/hotel-black.png differ
diff --git a/web_portal_attendance/static/description/assets/icons/license.png b/web_portal_attendance/static/description/assets/icons/license.png
new file mode 100644
index 000000000..a5869797e
Binary files /dev/null and b/web_portal_attendance/static/description/assets/icons/license.png differ
diff --git a/web_portal_attendance/static/description/assets/icons/lifebuoy.png b/web_portal_attendance/static/description/assets/icons/lifebuoy.png
new file mode 100644
index 000000000..658d56ccc
Binary files /dev/null and b/web_portal_attendance/static/description/assets/icons/lifebuoy.png differ
diff --git a/web_portal_attendance/static/description/assets/icons/manufacturing-black.png b/web_portal_attendance/static/description/assets/icons/manufacturing-black.png
new file mode 100644
index 000000000..697eb0e9f
Binary files /dev/null and b/web_portal_attendance/static/description/assets/icons/manufacturing-black.png differ
diff --git a/web_portal_attendance/static/description/assets/icons/pos-black.png b/web_portal_attendance/static/description/assets/icons/pos-black.png
new file mode 100644
index 000000000..97c0f90c1
Binary files /dev/null and b/web_portal_attendance/static/description/assets/icons/pos-black.png differ
diff --git a/web_portal_attendance/static/description/assets/icons/puzzle.png b/web_portal_attendance/static/description/assets/icons/puzzle.png
new file mode 100644
index 000000000..65cf854e7
Binary files /dev/null and b/web_portal_attendance/static/description/assets/icons/puzzle.png differ
diff --git a/web_portal_attendance/static/description/assets/icons/restaurant-black.png b/web_portal_attendance/static/description/assets/icons/restaurant-black.png
new file mode 100644
index 000000000..4a35eb939
Binary files /dev/null and b/web_portal_attendance/static/description/assets/icons/restaurant-black.png differ
diff --git a/web_portal_attendance/static/description/assets/icons/service-black.png b/web_portal_attendance/static/description/assets/icons/service-black.png
new file mode 100644
index 000000000..301ab51cb
Binary files /dev/null and b/web_portal_attendance/static/description/assets/icons/service-black.png differ
diff --git a/web_portal_attendance/static/description/assets/icons/trading-black.png b/web_portal_attendance/static/description/assets/icons/trading-black.png
new file mode 100644
index 000000000..9398ba2f1
Binary files /dev/null and b/web_portal_attendance/static/description/assets/icons/trading-black.png differ
diff --git a/web_portal_attendance/static/description/assets/icons/training.png b/web_portal_attendance/static/description/assets/icons/training.png
new file mode 100644
index 000000000..884ca024d
Binary files /dev/null and b/web_portal_attendance/static/description/assets/icons/training.png differ
diff --git a/web_portal_attendance/static/description/assets/icons/update.png b/web_portal_attendance/static/description/assets/icons/update.png
new file mode 100644
index 000000000..ecbc5a01a
Binary files /dev/null and b/web_portal_attendance/static/description/assets/icons/update.png differ
diff --git a/web_portal_attendance/static/description/assets/icons/user.png b/web_portal_attendance/static/description/assets/icons/user.png
new file mode 100644
index 000000000..6ffb23d9f
Binary files /dev/null and b/web_portal_attendance/static/description/assets/icons/user.png differ
diff --git a/web_portal_attendance/static/description/assets/icons/wrench.png b/web_portal_attendance/static/description/assets/icons/wrench.png
new file mode 100644
index 000000000..6c04dea0f
Binary files /dev/null and b/web_portal_attendance/static/description/assets/icons/wrench.png differ
diff --git a/web_portal_attendance/static/description/assets/misc/categories.png b/web_portal_attendance/static/description/assets/misc/categories.png
new file mode 100644
index 000000000..bedf1e0b1
Binary files /dev/null and b/web_portal_attendance/static/description/assets/misc/categories.png differ
diff --git a/web_portal_attendance/static/description/assets/misc/check-box.png b/web_portal_attendance/static/description/assets/misc/check-box.png
new file mode 100644
index 000000000..42caf24b9
Binary files /dev/null and b/web_portal_attendance/static/description/assets/misc/check-box.png differ
diff --git a/web_portal_attendance/static/description/assets/misc/compass.png b/web_portal_attendance/static/description/assets/misc/compass.png
new file mode 100644
index 000000000..d5fed8faa
Binary files /dev/null and b/web_portal_attendance/static/description/assets/misc/compass.png differ
diff --git a/web_portal_attendance/static/description/assets/misc/corporate.png b/web_portal_attendance/static/description/assets/misc/corporate.png
new file mode 100644
index 000000000..2eb13edbf
Binary files /dev/null and b/web_portal_attendance/static/description/assets/misc/corporate.png differ
diff --git a/web_portal_attendance/static/description/assets/misc/customer-support.png b/web_portal_attendance/static/description/assets/misc/customer-support.png
new file mode 100644
index 000000000..79efc72ed
Binary files /dev/null and b/web_portal_attendance/static/description/assets/misc/customer-support.png differ
diff --git a/web_portal_attendance/static/description/assets/misc/cybrosys-logo.png b/web_portal_attendance/static/description/assets/misc/cybrosys-logo.png
new file mode 100644
index 000000000..cc3cc0ccf
Binary files /dev/null and b/web_portal_attendance/static/description/assets/misc/cybrosys-logo.png differ
diff --git a/web_portal_attendance/static/description/assets/misc/features.png b/web_portal_attendance/static/description/assets/misc/features.png
new file mode 100644
index 000000000..b41769f77
Binary files /dev/null and b/web_portal_attendance/static/description/assets/misc/features.png differ
diff --git a/web_portal_attendance/static/description/assets/misc/logo.png b/web_portal_attendance/static/description/assets/misc/logo.png
new file mode 100644
index 000000000..478462d3e
Binary files /dev/null and b/web_portal_attendance/static/description/assets/misc/logo.png differ
diff --git a/web_portal_attendance/static/description/assets/misc/pictures.png b/web_portal_attendance/static/description/assets/misc/pictures.png
new file mode 100644
index 000000000..56d255fe9
Binary files /dev/null and b/web_portal_attendance/static/description/assets/misc/pictures.png differ
diff --git a/web_portal_attendance/static/description/assets/misc/pie-chart.png b/web_portal_attendance/static/description/assets/misc/pie-chart.png
new file mode 100644
index 000000000..426e05244
Binary files /dev/null and b/web_portal_attendance/static/description/assets/misc/pie-chart.png differ
diff --git a/web_portal_attendance/static/description/assets/misc/right-arrow.png b/web_portal_attendance/static/description/assets/misc/right-arrow.png
new file mode 100644
index 000000000..730984a06
Binary files /dev/null and b/web_portal_attendance/static/description/assets/misc/right-arrow.png differ
diff --git a/web_portal_attendance/static/description/assets/misc/star.png b/web_portal_attendance/static/description/assets/misc/star.png
new file mode 100644
index 000000000..2eb9ab29f
Binary files /dev/null and b/web_portal_attendance/static/description/assets/misc/star.png differ
diff --git a/web_portal_attendance/static/description/assets/misc/support.png b/web_portal_attendance/static/description/assets/misc/support.png
new file mode 100644
index 000000000..4f18b8b82
Binary files /dev/null and b/web_portal_attendance/static/description/assets/misc/support.png differ
diff --git a/web_portal_attendance/static/description/assets/misc/whatsapp.png b/web_portal_attendance/static/description/assets/misc/whatsapp.png
new file mode 100644
index 000000000..d513a5356
Binary files /dev/null and b/web_portal_attendance/static/description/assets/misc/whatsapp.png differ
diff --git a/web_portal_attendance/static/description/assets/modules/11.png b/web_portal_attendance/static/description/assets/modules/11.png
new file mode 100644
index 000000000..df65629bf
Binary files /dev/null and b/web_portal_attendance/static/description/assets/modules/11.png differ
diff --git a/web_portal_attendance/static/description/assets/modules/22.png b/web_portal_attendance/static/description/assets/modules/22.png
new file mode 100644
index 000000000..6058f6c3b
Binary files /dev/null and b/web_portal_attendance/static/description/assets/modules/22.png differ
diff --git a/web_portal_attendance/static/description/assets/modules/33.png b/web_portal_attendance/static/description/assets/modules/33.png
new file mode 100644
index 000000000..163485cfd
Binary files /dev/null and b/web_portal_attendance/static/description/assets/modules/33.png differ
diff --git a/web_portal_attendance/static/description/assets/modules/44.png b/web_portal_attendance/static/description/assets/modules/44.png
new file mode 100644
index 000000000..618e3e6c4
Binary files /dev/null and b/web_portal_attendance/static/description/assets/modules/44.png differ
diff --git a/web_portal_attendance/static/description/assets/modules/55.png b/web_portal_attendance/static/description/assets/modules/55.png
new file mode 100644
index 000000000..2a722d66e
Binary files /dev/null and b/web_portal_attendance/static/description/assets/modules/55.png differ
diff --git a/web_portal_attendance/static/description/assets/modules/66.png b/web_portal_attendance/static/description/assets/modules/66.png
new file mode 100644
index 000000000..a44d454aa
Binary files /dev/null and b/web_portal_attendance/static/description/assets/modules/66.png differ
diff --git a/web_portal_attendance/static/description/assets/screenshots/hero.gif b/web_portal_attendance/static/description/assets/screenshots/hero.gif
new file mode 100644
index 000000000..02d1610bf
Binary files /dev/null and b/web_portal_attendance/static/description/assets/screenshots/hero.gif differ
diff --git a/web_portal_attendance/static/description/assets/screenshots/portal_01.png b/web_portal_attendance/static/description/assets/screenshots/portal_01.png
new file mode 100644
index 000000000..167923424
Binary files /dev/null and b/web_portal_attendance/static/description/assets/screenshots/portal_01.png differ
diff --git a/web_portal_attendance/static/description/assets/screenshots/portal_02.png b/web_portal_attendance/static/description/assets/screenshots/portal_02.png
new file mode 100644
index 000000000..beb3654ab
Binary files /dev/null and b/web_portal_attendance/static/description/assets/screenshots/portal_02.png differ
diff --git a/web_portal_attendance/static/description/assets/screenshots/portal_03.png b/web_portal_attendance/static/description/assets/screenshots/portal_03.png
new file mode 100644
index 000000000..d32f26274
Binary files /dev/null and b/web_portal_attendance/static/description/assets/screenshots/portal_03.png differ
diff --git a/web_portal_attendance/static/description/assets/screenshots/portal_04.png b/web_portal_attendance/static/description/assets/screenshots/portal_04.png
new file mode 100644
index 000000000..798ab093c
Binary files /dev/null and b/web_portal_attendance/static/description/assets/screenshots/portal_04.png differ
diff --git a/web_portal_attendance/static/description/assets/screenshots/portal_05.png b/web_portal_attendance/static/description/assets/screenshots/portal_05.png
new file mode 100644
index 000000000..72b939c0b
Binary files /dev/null and b/web_portal_attendance/static/description/assets/screenshots/portal_05.png differ
diff --git a/web_portal_attendance/static/description/assets/screenshots/portal_06.png b/web_portal_attendance/static/description/assets/screenshots/portal_06.png
new file mode 100644
index 000000000..e3c71c13a
Binary files /dev/null and b/web_portal_attendance/static/description/assets/screenshots/portal_06.png differ
diff --git a/web_portal_attendance/static/description/assets/screenshots/portal_07.png b/web_portal_attendance/static/description/assets/screenshots/portal_07.png
new file mode 100644
index 000000000..4e49dfe6b
Binary files /dev/null and b/web_portal_attendance/static/description/assets/screenshots/portal_07.png differ
diff --git a/web_portal_attendance/static/description/assets/screenshots/portal_08.png b/web_portal_attendance/static/description/assets/screenshots/portal_08.png
new file mode 100644
index 000000000..a27aaeb51
Binary files /dev/null and b/web_portal_attendance/static/description/assets/screenshots/portal_08.png differ
diff --git a/web_portal_attendance/static/description/assets/screenshots/portal_09.png b/web_portal_attendance/static/description/assets/screenshots/portal_09.png
new file mode 100644
index 000000000..24760fe5f
Binary files /dev/null and b/web_portal_attendance/static/description/assets/screenshots/portal_09.png differ
diff --git a/web_portal_attendance/static/description/assets/screenshots/portal_10.png b/web_portal_attendance/static/description/assets/screenshots/portal_10.png
new file mode 100644
index 000000000..1b4a36762
Binary files /dev/null and b/web_portal_attendance/static/description/assets/screenshots/portal_10.png differ
diff --git a/web_portal_attendance/static/description/assets/screenshots/portal_11.png b/web_portal_attendance/static/description/assets/screenshots/portal_11.png
new file mode 100644
index 000000000..478a77fba
Binary files /dev/null and b/web_portal_attendance/static/description/assets/screenshots/portal_11.png differ
diff --git a/web_portal_attendance/static/description/assets/screenshots/portal_12.png b/web_portal_attendance/static/description/assets/screenshots/portal_12.png
new file mode 100644
index 000000000..23cc767be
Binary files /dev/null and b/web_portal_attendance/static/description/assets/screenshots/portal_12.png differ
diff --git a/web_portal_attendance/static/description/assets/screenshots/portal_13.png b/web_portal_attendance/static/description/assets/screenshots/portal_13.png
new file mode 100644
index 000000000..b304077ed
Binary files /dev/null and b/web_portal_attendance/static/description/assets/screenshots/portal_13.png differ
diff --git a/web_portal_attendance/static/description/banner.png b/web_portal_attendance/static/description/banner.png
new file mode 100644
index 000000000..9b58fa3ec
Binary files /dev/null and b/web_portal_attendance/static/description/banner.png differ
diff --git a/web_portal_attendance/static/description/icon.png b/web_portal_attendance/static/description/icon.png
new file mode 100644
index 000000000..b6251c594
Binary files /dev/null and b/web_portal_attendance/static/description/icon.png differ
diff --git a/web_portal_attendance/static/description/index.html b/web_portal_attendance/static/description/index.html
new file mode 100644
index 000000000..99b75a6f6
--- /dev/null
+++ b/web_portal_attendance/static/description/index.html
@@ -0,0 +1,703 @@
+
+
+
+
+
+
+ Community
+
+
+
+
+
+
+
+
+
+ Portal Attendance
+
+ This Module Allows Users To View Their Attendance As
+ Well As Mark It From The Portal.
+ This allows to create attendance to the backend from the portal view, so the user
+ that don't have the access to the backend they can easily create attendance from
+ portal.
+
+
+
+
+
+
+
+
+
+
+ Features
+
+
+
+
+
+
+ Easy to see the attendance from portal.
+
+
+
+
+ Easy to filter the attendance from portal.
+
+
+
+
+ Apply filters on record to see the records according to filters all and day wise of attendance.
+
+
+
+
+ You can easily search the record from the list of records using searchbar.
+
+
+
+
+ You can easily search the record from the list of records using searchbar.
+
+
+
+
+
+
+
+
+
+
+
+ Screenshots
+
+
+
+
+
+
+ As seen in the image below,when the user enter to the portal the user
+ can see the check in button.
+
+
+
+
+
+
+ When we clicked the check in button it will redirect to the another
+ page to create the attendance.
+
+
+
+
+
+
+ When we click the check in button inside the template it will create
+ attendance to the backend , and we can see a welcome message and check
+ in time also the check in button turns to check out button.
+
+
+
+
+
+ Then the user can check the created attendance, from My Account ->
+ Attendance . Here we can see the created attendance and count of the
+ attendance.
+
+
+
+
+
+
+ When open the created attendance here we can see the employee name
+ ,check in time, check out time and worked hours.
+
+
+
+
+
+ Click the check out button to check out the attendance.
+
+
+
+
+
+
+ When clicking the check out button it will redirect to the check out
+ template, and they will ask to want to check out.
+
+
+
+
+
+
+ After checked out the user can see the leaving note and checked out
+ time,also the check out button changed in to check in button.
+
+
+
+
+
+
+ The check out time and the work hour updated to the created attendance.
+
+
+
+
+
+ In portal attendance we can filter out, and we can search for the
+ attendance.
+
+
+
+
+
+ We can filter by All,Today,Last Week,Last Month,Last Year.
+
+
+
+
+
+
+ We can search by Work Hour, Check In and Check Out by the day or the time.
+
+
+
+
+
+ The admin can view the created attendance in the backend in Attendance
+ module.
+
\ No newline at end of file
diff --git a/web_portal_attendance/static/src/js/portal_message.js b/web_portal_attendance/static/src/js/portal_message.js
new file mode 100644
index 000000000..9ba502214
--- /dev/null
+++ b/web_portal_attendance/static/src/js/portal_message.js
@@ -0,0 +1,46 @@
+odoo.define('web_portal_attendance.leaving_message', function (require) {
+ "use strict";
+ var PublicWidget = require('web.public.widget');
+ var currentTime = new Date().getHours();
+
+ var Slider = PublicWidget.Widget.extend({
+ selector: '.flex-grow-1',
+ start: function () {
+ var self = this;
+ self.leaving_message();
+ self.welcome_message();
+ },
+//Function for adding leaving message in the tag
+ leaving_message: function () {
+ var leavingNoteElement = this.$el.find("#leaving_message");
+ if (leavingNoteElement.length) { // Check if the element exists
+ if (currentTime < 12) {
+ leavingNoteElement.text("Have a good day!"); // Set the text
+ } else if (currentTime < 18) {
+ leavingNoteElement.text("Have a great lunch!"); // Set the text
+ } else if (currentTime < 24) {
+ leavingNoteElement.text("Have a good tea time!"); // Set the text
+ } else {
+ leavingNoteElement.text("Have a great sleep!"); // Set the text
+ }
+ }
+ },
+//Function for adding welcome message in the tag
+ welcome_message: function () {
+ var welcomeNoteElement = this.$el.find(".welcome_note");
+ if (welcomeNoteElement.length) { // Check if the element exists
+ if (currentTime < 12) {
+ welcomeNoteElement.text("Good Morning!"); // Set the text
+ } else if (currentTime < 18) {
+ welcomeNoteElement.text("Good Afternoon!"); // Set the text
+ } else if (currentTime < 24) {
+ welcomeNoteElement.text("Good Evening!"); // Set the text
+ } else {
+ welcomeNoteElement.text("Good Night!"); // Set the text
+ }
+ }
+ },
+ });
+ PublicWidget.registry.banner = Slider;
+ return Slider;
+});
diff --git a/web_portal_attendance/views/hr_attendance_templates.xml b/web_portal_attendance/views/hr_attendance_templates.xml
new file mode 100644
index 000000000..10fc9bc14
--- /dev/null
+++ b/web_portal_attendance/views/hr_attendance_templates.xml
@@ -0,0 +1,102 @@
+
+
+
+
+
+