17 changed files with 1227 additions and 0 deletions
@ -0,0 +1,41 @@ |
|||
Open HRMS Dashboard v10 |
|||
======================= |
|||
|
|||
Keep your eyes on your whole Human resource analysis. |
|||
|
|||
Depends |
|||
======= |
|||
[hr] addon Odoo |
|||
|
|||
Tech |
|||
==== |
|||
* [Python] - Models |
|||
* [XML] - Odoo views |
|||
|
|||
Installation |
|||
============ |
|||
- www.odoo.com/documentation/10.0/setup/install.html |
|||
- Install our custom addon |
|||
|
|||
|
|||
|
|||
Bug Tracker |
|||
=========== |
|||
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. |
|||
|
|||
Credits |
|||
======= |
|||
* Cybrosys Techno Solutions <https://www.cybrosys.com> |
|||
|
|||
Author |
|||
------ |
|||
|
|||
Developer: Saritha Sahadevan, saritha@cybrosys.in |
|||
|
|||
Maintainer |
|||
---------- |
|||
|
|||
This module is maintained by Cybrosys Technologies. |
|||
|
|||
For support and more information, please visit https://www.openhrms.com |
|||
|
@ -0,0 +1,6 @@ |
|||
## Module hrms_dashboard |
|||
|
|||
#### 30.03.2018 |
|||
#### Version 10.0.1.0.0 |
|||
##### ADD |
|||
- Initial commit for Open HRMS Project |
@ -0,0 +1,23 @@ |
|||
# -*- coding: utf-8 -*- |
|||
################################################################################### |
|||
# A part of Open HRMS Project <https://www.openhrms.com> |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2018-TODAY Cybrosys Technologies (<https://www.cybrosys.com>). |
|||
# Author: Aswani PC , Saritha Sahadevan (<https://www.cybrosys.com>) |
|||
# |
|||
# This program is free software: you can modify |
|||
# it under the terms of the GNU Affero General Public License (AGPL) as |
|||
# published by the Free Software Foundation, either version 3 of the |
|||
# License, or (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU Affero General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU Affero General Public License |
|||
# along with this program. If not, see <https://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################### |
|||
from . import models |
@ -0,0 +1,40 @@ |
|||
# -*- coding: utf-8 -*- |
|||
################################################################################### |
|||
# A part of Open HRMS Project <https://www.openhrms.com> |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2018-TODAY Cybrosys Technologies (<https://www.cybrosys.com>). |
|||
# Author: Aswani PC , Saritha Sahadevan (<https://www.cybrosys.com>) |
|||
# |
|||
# This program is free software: you can modify |
|||
# it under the terms of the GNU Affero General Public License (AGPL) as |
|||
# published by the Free Software Foundation, either version 3 of the |
|||
# License, or (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU Affero General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU Affero General Public License |
|||
# along with this program. If not, see <https://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################### |
|||
{ |
|||
'name': "Open HRMS Dashboard", |
|||
'version': '10.0.1.0.0', |
|||
'summary': """Open HRMS Dashboard""", |
|||
'description': """Open HRMS Dashboard""", |
|||
'category': 'Human Resource', |
|||
'author': 'Cybrosys Techno Solutions', |
|||
'company': 'Cybrosys Techno Solutions', |
|||
'maintainer': 'Cybrosys Techno Solutions', |
|||
'website': "https://www.openhrms.com", |
|||
'depends': ['hr', 'hr_holidays', 'hr_timesheet_sheet', 'hr_recruitment'], |
|||
'data': ['views/dashboard_views.xml'], |
|||
'qweb': ["static/src/xml/hrms_dashboard.xml"], |
|||
'images': ["static/description/banner.gif"], |
|||
'license': "AGPL-3", |
|||
'installable': True, |
|||
'application': True, |
|||
} |
@ -0,0 +1,23 @@ |
|||
# -*- coding: utf-8 -*- |
|||
################################################################################### |
|||
# A part of Open HRMS Project <https://www.openhrms.com> |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2018-TODAY Cybrosys Technologies (<https://www.cybrosys.com>). |
|||
# Author: Aswani PC , Saritha Sahadevan (<https://www.cybrosys.com>) |
|||
# |
|||
# This program is free software: you can modify |
|||
# it under the terms of the GNU Affero General Public License (AGPL) as |
|||
# published by the Free Software Foundation, either version 3 of the |
|||
# License, or (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU Affero General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU Affero General Public License |
|||
# along with this program. If not, see <https://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################### |
|||
from . import hrms_dashboard |
@ -0,0 +1,49 @@ |
|||
# -*- coding: utf-8 -*- |
|||
################################################################################### |
|||
# A part of Open HRMS Project <https://www.openhrms.com> |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2018-TODAY Cybrosys Technologies (<https://www.cybrosys.com>). |
|||
# Author: Aswani PC, Saritha Sahadevan (<https://www.cybrosys.com>) |
|||
# |
|||
# This program is free software: you can modify |
|||
# it under the terms of the GNU Affero General Public License (AGPL) as |
|||
# published by the Free Software Foundation, either version 3 of the |
|||
# License, or (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU Affero General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU Affero General Public License |
|||
# along with this program. If not, see <https://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################### |
|||
from odoo import models, api, _ |
|||
from odoo.http import request |
|||
|
|||
|
|||
class Employee(models.Model): |
|||
_inherit = 'hr.employee' |
|||
|
|||
@api.model |
|||
def get_user_employee_details(self): |
|||
uid = request.session.uid |
|||
employee = self.env['hr.employee'].sudo().search_read([('user_id', '=', uid)], limit=1) |
|||
leaves_to_approve = self.env['hr.holidays'].sudo().search_count([('state', 'in', ['confirm', 'validate1']), |
|||
('type', '=', 'remove')]) |
|||
leaves_alloc_req = self.env['hr.holidays'].sudo().search_count([('state', 'in', ['confirm', 'validate1']) |
|||
, ('type', '=', 'add')]) |
|||
timesheets_to_approve = self.env['hr_timesheet_sheet.sheet'].sudo().search_count( |
|||
[('state', 'in', ['confirm'])]) |
|||
job_applications = self.env['hr.applicant'].sudo().search_count([]) |
|||
if employee: |
|||
data = { |
|||
'leaves_to_approve': leaves_to_approve, |
|||
'leaves_alloc_req': leaves_alloc_req, |
|||
'timesheets_to_approve': timesheets_to_approve, |
|||
'job_applications': job_applications, |
|||
} |
|||
employee[0].update(data) |
|||
return employee |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 118 KiB |
After Width: | Height: | Size: 221 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 162 KiB |
After Width: | Height: | Size: 33 KiB |
@ -0,0 +1,68 @@ |
|||
<section class="oe_container bg-gray-lighter" xmlns="http://www.w3.org/1999/html"> |
|||
<div class="oe_row"> |
|||
<div class="oe_span"> |
|||
<h2 class="oe_slogan">Open HRMS</h2> |
|||
<h3 class="oe_slogan">Most advanced open source HR management software</h3> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container"> |
|||
<div class="oe_row oe_spaced oe_mt32"> |
|||
<div class="oe_span"> |
|||
<div class="oe_demo oe_picture oe_screenshot"> |
|||
<a href="https://www.openhrms.com/#request-demo"> |
|||
<img src="HRMS-BUTTON.png"> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container oe_dark"> |
|||
<div class="oe_row oe_spaced"> |
|||
<div class="oe_span12"> |
|||
<h2 class="oe_slogan">Open HRMS Dashboard</h2> |
|||
<h3 class="oe_slogan">Keep your eyes on your whole Human resource analysis</h3> |
|||
<h3 class="oe_slogan"><a href="https://www.cybrosys.com">Cybrosys Technologies</a> </h3> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container"> |
|||
<div class="oe_row oe_spaced"> |
|||
<div class="oe_span12"> |
|||
<div class="oe_demo oe_picture oe_screenshot"> |
|||
<img src="dashboard.png"> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<div class="row section-content"> |
|||
<div class="col-md-6 img-content"> |
|||
<h3>Our Odoo Services</h3> |
|||
</div> |
|||
<div class="bc-span col-md-12"><div class="inner-span"><a target="_blank" href="https://www.openhrms.com"><img class="img-border img-responsive thumbnail" src="cybro-service.png"></a></div></div> |
|||
|
|||
</div> |
|||
</div> |
|||
|
|||
<section class="oe_container oe_dark"> |
|||
<h2 class="oe_slogan" style="margin-top:20px;" >Need Any Help?</h2> |
|||
<div class="oe_slogan" style="margin-top:10px !important;"> |
|||
<div> |
|||
<a class="btn btn-primary btn-lg mt8" |
|||
style="color: #FFFFFF !important;border-radius: 0;" href="https://www.cybrosys.com"><i |
|||
class="fa fa-envelope"></i> Email </a> <a |
|||
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" |
|||
href="https://www.cybrosys.com/contact/"><i |
|||
class="fa fa-phone"></i> Contact Us </a> <a |
|||
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" |
|||
href="https://www.cybrosys.com/odoo-customization-and-installation/"><i |
|||
class="fa fa-check-square"></i> Request Customization </a> |
|||
</div> |
|||
<br> |
|||
<img src="cybro_logo.png" style="width: 190px; margin-bottom: 20px;" class="center-block"> |
|||
</div> |
|||
</section> |
@ -0,0 +1,575 @@ |
|||
.o_dashboards{ |
|||
padding-top :15px; |
|||
background-color: #f8faff !important; |
|||
} |
|||
.social-box { |
|||
min-height: 160px; |
|||
margin-bottom: 1.5rem; |
|||
text-align: center; |
|||
background: #fff; } |
|||
.social-box i { |
|||
display: block; |
|||
margin: -1px -1px 0; |
|||
font-size: 40px; |
|||
line-height: 90px; |
|||
background: #e9ecef; } |
|||
.social-box .chart-wrapper { |
|||
height: 90px; |
|||
margin: -90px 0 0; } |
|||
.social-box .chart-wrapper canvas { |
|||
width: 100% !important; |
|||
height: 90px !important; } |
|||
.social-box ul { |
|||
padding: 10px 0; |
|||
list-style: none; } |
|||
.social-box ul li { |
|||
display: block; |
|||
float: left; |
|||
width: 50%; |
|||
padding-top: 10px; |
|||
font-size: 18px; } |
|||
.social-box ul li:first-child { |
|||
border-right: 1px solid #c2cfd6; } |
|||
.social-box ul li strong { |
|||
display: block; |
|||
font-size: 20px; } |
|||
.social-box ul li span { |
|||
font-size: 18px; |
|||
font-weight: 500; |
|||
color: #949CA0; |
|||
text-transform: uppercase; } |
|||
.social-box.facebook i { |
|||
color: #fff; |
|||
background: #3b5998; } |
|||
.social-box.twitter i { |
|||
color: #fff; |
|||
background: #00aced; } |
|||
.social-box.linkedin i { |
|||
color: #fff; |
|||
background: #4875b4; } |
|||
.social-box.google-plus i { |
|||
color: #fff; |
|||
background: #d34836; } |
|||
|
|||
|
|||
.content { |
|||
float: left; |
|||
padding: 0 20px; |
|||
width: 100%; } |
|||
|
|||
.card { |
|||
padding-top: 0px; |
|||
padding: 14px; |
|||
margin-bottom: 1.5rem; |
|||
border-radius: 10px; |
|||
box-shadow: 2px 14px 32px 5px rgba(0, 0, 0, 0.02), 0 3px 13px 0px rgba(0, 0, 0, 0.16); |
|||
background-color: #fff; |
|||
transition: transform 0.2s ease, box-shadow 0.2s ease; |
|||
will-change: transform, box-shadow; |
|||
} |
|||
.card:hover{ |
|||
transform: translateY(-5px) translateZ(0); |
|||
box-shadow: 0 16px 32px 0 rgba(62,57,107,0.28), 0 0 0 transparent; |
|||
} |
|||
.card h4 { |
|||
font-size: 1.1rem; } |
|||
.card .user-header .media img { |
|||
border: 5px solid rgba(255, 255, 255, 0.3); |
|||
border-radius: 50%; |
|||
-webkit-border-radius: 50%; } |
|||
.card .card-header .card-actions button { |
|||
display: block; |
|||
float: left; |
|||
width: 50px; |
|||
padding: .75rem 0; |
|||
margin: 0 !important; |
|||
color: #fff; |
|||
outline: 0; |
|||
text-align: center; |
|||
background: transparent; |
|||
border: 0; |
|||
border-left: 1px solid rgba(120, 130, 140, 0.4); } |
|||
.card .card-footer { |
|||
padding: 0.65rem 1.25rem; |
|||
background-color: #f0f3f5; |
|||
border-top: 1px solid #c2cfd6; } |
|||
.card .card-footer ul li { |
|||
display: table-cell; |
|||
padding: 0 1rem; |
|||
text-align: center; } |
|||
|
|||
.breadcrumbs { |
|||
margin-top: 0; } |
|||
|
|||
/* Tabs */ |
|||
.nav-tabs a.active { |
|||
color: #555; |
|||
cursor: default; |
|||
background-color: #fff; |
|||
border: 1px solid #ddd; |
|||
border-bottom-color: transparent; } |
|||
.nav-tabs .dropdown .dropdown-menu { |
|||
top: 100% !important; } |
|||
|
|||
.custom-tab .nav-tabs > a.active, .custom-tab .nav-tabs > .active > a:focus, .custom-tab .nav-tabs > li.active > a:hover { |
|||
border-color: transparent transparent; |
|||
color: #ff2e44; |
|||
position: relative; } |
|||
|
|||
.custom-tab .nav-tabs > a.active > a:after, .custom-tab .nav-tabs > li.active > a:focus:after, .custom-tab .nav-tabs > li.active > a:hover:after { |
|||
background: #ff2e44; |
|||
bottom: -1px; |
|||
content: ""; |
|||
height: 2px; |
|||
left: 0; |
|||
position: absolute; |
|||
right: 0; |
|||
width: 100%; |
|||
z-index: 999; } |
|||
|
|||
.card .card-header .card-actions { |
|||
float: right; } |
|||
.card .card-header .card-actions [class*="btn"] { |
|||
border-left: 1px solid rgba(120, 130, 140, 0.4); |
|||
color: #878787; |
|||
display: inline-block; |
|||
font-size: 16px; |
|||
float: left; |
|||
padding: 0 7px; |
|||
width: inherit; |
|||
text-align: center; } |
|||
.left-top-card-body { |
|||
display: block; |
|||
float: left; |
|||
position: relative; |
|||
} |
|||
.left-bottom-card-body{ |
|||
display: block; |
|||
float: left; |
|||
position: relative; |
|||
} |
|||
.social-buttons .card-body p button { |
|||
padding-top: 0; |
|||
padding-left: 0; |
|||
padding-bottom: 0; } |
|||
.social-buttons .only-icon .card-body p button { |
|||
padding: 0; } |
|||
.social-buttons .social i { |
|||
padding: 0 10px; |
|||
width: inherit !important; } |
|||
.social-buttons .only-text p button { |
|||
padding: 0 .5rem; } |
|||
|
|||
.buttons button { |
|||
margin: 2px 0; } |
|||
|
|||
/* Ribons */ |
|||
.corner-ribon { |
|||
text-align: center; |
|||
width: 71px; |
|||
height: 71px; |
|||
position: absolute; |
|||
right: 0; |
|||
top: 0; |
|||
font-size: 20px; } |
|||
|
|||
.corner-ribon i { |
|||
padding: 10px 0 0 35px; |
|||
color: #fff; } |
|||
|
|||
/*.black-ribon {*/ |
|||
/*background: url("../../images/twitter_corner_black.png") no-repeat; }*/ |
|||
|
|||
/*.blue-ribon {*/ |
|||
/*background: url("../../images/twitter_corner_blue.png") no-repeat; }*/ |
|||
|
|||
.twt-feed .wtt-mark { |
|||
color: rgba(255, 255, 255, 0.15); |
|||
font-size: 160px; |
|||
position: absolute; |
|||
top: 10px; |
|||
left: 40%; } |
|||
|
|||
.twt-feed { |
|||
-webkit-border-radius: 4px 4px 0 0; |
|||
color: #FFFFFF; |
|||
padding: 40px 10px 10px; |
|||
position: relative; |
|||
min-height: 170px; } |
|||
|
|||
.weather-category { |
|||
padding: 15px 0; |
|||
color: #74829C; } |
|||
.weather-category ul li { |
|||
width: 32%; |
|||
text-align: center; |
|||
border-right: 1px solid #e6e6e6; |
|||
display: inline-block; } |
|||
|
|||
.twt-feed.blue-bg { |
|||
background: #58C9F3; } |
|||
|
|||
.twt-category { |
|||
display: inline-block; |
|||
margin-bottom: 11px; |
|||
margin-top: 10px; |
|||
width: 100%; } |
|||
.twt-category ul li { |
|||
color: #bdbdbd; |
|||
font-size: 13px; } |
|||
|
|||
.twt-footer { |
|||
padding: 12px 15px; } |
|||
|
|||
.twt-footer, .twt-footer a { |
|||
color: #d2d2d2; } |
|||
|
|||
/* Button Reset */ |
|||
.btn, .button { |
|||
display: inline-block; |
|||
font-weight: 400; |
|||
text-align: center; |
|||
white-space: nowrap; |
|||
vertical-align: middle; |
|||
transition: all .15s ease-in-out; |
|||
border-radius: 0; |
|||
cursor: pointer; } |
|||
|
|||
/* Icons */ |
|||
.icon-section { |
|||
margin: 0 0 3em; |
|||
clear: both; |
|||
overflow: hidden; } |
|||
|
|||
.icon-container { |
|||
width: 240px; |
|||
padding: .7em 0; |
|||
float: left; |
|||
position: relative; |
|||
text-align: left; } |
|||
|
|||
.icon-container [class^="ti-"], |
|||
.icon-container [class*=" ti-"] { |
|||
color: #000; |
|||
position: absolute; |
|||
margin-top: 3px; |
|||
transition: .3s; } |
|||
|
|||
.icon-container:hover [class^="ti-"], |
|||
.icon-container:hover [class*=" ti-"] { |
|||
font-size: 2.2em; |
|||
margin-top: -5px; } |
|||
|
|||
.icon-container:hover .icon-name { |
|||
color: #000; } |
|||
|
|||
.icon-name { |
|||
color: #aaa; |
|||
margin-left: 35px; |
|||
font-size: 14px; |
|||
transition: .3s; } |
|||
|
|||
.icon-container:hover .icon-name { |
|||
margin-left: 45px; } |
|||
|
|||
.fontawesome-icon-list .page-header { |
|||
border-bottom: 1px solid #C9CDD7; |
|||
padding-bottom: 9px; |
|||
margin: 30px 0px 27px 0px; } |
|||
.fontawesome-icon-list h2 { |
|||
margin-top: 0; |
|||
font-size: 20px; |
|||
font-weight: 300; } |
|||
.fontawesome-icon-list i { |
|||
font-style: italic; |
|||
padding-right: 10px; } |
|||
|
|||
.social-box i { |
|||
line-height: 110px; } |
|||
.social-box ul { |
|||
display: inline-block; |
|||
margin: 7px 0 0; |
|||
padding: 10px; |
|||
width: 100%; } |
|||
.social-box ul li { |
|||
color: #949CA0; |
|||
font-size: 14px; |
|||
font-weight: 700; |
|||
padding: 0 10px 0 0; |
|||
text-align: right; } |
|||
.social-box ul li:last-child { |
|||
padding-left: 10px; |
|||
padding-right: 0; |
|||
text-align: left; } |
|||
.social-box ul li span { |
|||
font-size: 14px; } |
|||
|
|||
.login-logo { |
|||
text-align: center; |
|||
margin-bottom: 15px; } |
|||
.login-logo span { |
|||
color: #ffffff; |
|||
font-size: 24px; } |
|||
|
|||
.login-content { |
|||
max-width: 540px; |
|||
margin: 8vh auto; } |
|||
|
|||
.login-form { |
|||
background: #ffffff; |
|||
padding: 30px 30px 20px; |
|||
border-radius: 2px; } |
|||
|
|||
.login-form h4 { |
|||
color: #878787; |
|||
text-align: center; |
|||
margin-bottom: 50px; } |
|||
|
|||
.login-form .checkbox { |
|||
color: #878787; } |
|||
|
|||
.login-form .checkbox label { |
|||
text-transform: none; } |
|||
|
|||
.login-form .btn { |
|||
width: 100%; |
|||
text-transform: uppercase; |
|||
font-size: 14px; |
|||
padding: 15px; |
|||
border: 0px; } |
|||
|
|||
.login-form label { |
|||
color: #878787; |
|||
text-transform: uppercase; } |
|||
|
|||
.login-form label a { |
|||
color: #ff2e44; } |
|||
|
|||
.social-login-content { |
|||
margin: 0px -30px; |
|||
border-top: 1px solid #e7e7e7; |
|||
border-bottom: 1px solid #e7e7e7; |
|||
padding: 30px 0px; |
|||
background: #fcfcfc; } |
|||
|
|||
.social-button { |
|||
padding: 0 30px; } |
|||
.social-button .facebook { |
|||
background: #3b5998; |
|||
color: #fff; } |
|||
.social-button .facebook:hover { |
|||
background: #344e86; } |
|||
.social-button .twitter { |
|||
background: #00aced; |
|||
color: #fff; } |
|||
.social-button .twitter:hover { |
|||
background: #0099d4; } |
|||
|
|||
.social-button i { |
|||
padding: 19px; } |
|||
|
|||
.register-link a { |
|||
color: #ff2e44; } |
|||
|
|||
.cpu-load { |
|||
width: 100%; |
|||
height: 272px; |
|||
font-size: 14px; |
|||
line-height: 1.2em; } |
|||
|
|||
.cpu-load-data-content { |
|||
font-size: 18px; |
|||
font-weight: 400; |
|||
line-height: 40px; } |
|||
|
|||
.cpu-load-data { |
|||
margin-bottom: 30px; } |
|||
|
|||
.cpu-load-data li { |
|||
display: inline-block; |
|||
width: 32.5%; |
|||
text-align: center; |
|||
border-right: 1px solid #e7e7e7; } |
|||
|
|||
.cpu-load-data li:last-child { |
|||
border-right: 0px; } |
|||
|
|||
.nestable-cart { |
|||
overflow: hidden; } |
|||
|
|||
/* Forms */ |
|||
.input-group-addon { |
|||
background-color: transparent; |
|||
border-left: 0; } |
|||
|
|||
.input-group-addon, .input-group-btn { |
|||
white-space: nowrap; |
|||
vertical-align: middle; } |
|||
|
|||
.input-group-addon { |
|||
padding: .5rem .75rem; |
|||
margin-bottom: 0; |
|||
font-size: 1rem; |
|||
font-weight: 400; |
|||
line-height: 1.25; |
|||
color: #495057; |
|||
text-align: center; |
|||
background-color: #e9ecef; |
|||
border: 1px solid rgba(0, 0, 0, 0.15); |
|||
border-radius: .25rem; } |
|||
|
|||
.flotTip { |
|||
background: #252525; |
|||
border: 1px solid #252525; |
|||
padding: 5px 15px; |
|||
color: #ffffff; } |
|||
|
|||
.flot-container { |
|||
box-sizing: border-box; |
|||
width: 100%; |
|||
height: 275px; |
|||
padding: 20px 15px 15px; |
|||
margin: 15px auto 30px; |
|||
background: transparent; } |
|||
|
|||
.flot-pie-container { |
|||
height: 275px; } |
|||
|
|||
.flotBar-container { |
|||
height: 275px; } |
|||
|
|||
.flot-line { |
|||
width: 100%; |
|||
height: 100%; |
|||
font-size: 14px; |
|||
line-height: 1.2em; } |
|||
|
|||
.legend table { |
|||
border-spacing: 5px; } |
|||
|
|||
#chart1, |
|||
#flotBar, |
|||
#flotCurve { |
|||
width: 100%; |
|||
height: 275px; } |
|||
|
|||
.morris-hover { |
|||
position: absolute; |
|||
z-index: 1; } |
|||
|
|||
.morris-hover.morris-default-style .morris-hover-row-label { |
|||
font-weight: bold; |
|||
margin: 0.25em 0; } |
|||
|
|||
.morris-hover.morris-default-style .morris-hover-point { |
|||
white-space: nowrap; |
|||
margin: 0.1em 0; } |
|||
|
|||
.morris-hover.morris-default-style { |
|||
border-radius: 2px; |
|||
padding: 10px 12px; |
|||
color: #666; |
|||
background: rgba(0, 0, 0, 0.7); |
|||
border: none; |
|||
color: #fff !important; } |
|||
|
|||
.morris-hover-point { |
|||
color: rgba(255, 255, 255, 0.8) !important; } |
|||
|
|||
#morris-bar-chart { |
|||
height: 285px; } |
|||
|
|||
.map, .vmap { |
|||
width: 100%; |
|||
height: 400px; } |
|||
|
|||
.btn-toolbar { |
|||
float: left !important; } |
|||
.btn-toolbar .btn-outline-secondary:not([disabled]):not(.disabled):active, |
|||
.btn-toolbar .btn-outline-secondary:not([disabled]):not(.disabled).active, |
|||
.btn-toolbar .show > .btn-outline-secondary.dropdown-toggle { |
|||
background-color: #212529; |
|||
border-color: #212529; |
|||
-webkit-box-shadow: none; |
|||
box-shadow: none; |
|||
color: #fff; } |
|||
.btn-toolbar .btn-outline-secondary:hover { |
|||
background-color: #212529; |
|||
border-color: #212529; |
|||
color: #fff; } |
|||
|
|||
/* Widget One |
|||
---------------------------*/ |
|||
.dib { |
|||
display: inline-block; } |
|||
|
|||
.stat-widget-one .stat-icon { |
|||
vertical-align: top; |
|||
margin: auto; |
|||
width: 100%; |
|||
color: #01c490; |
|||
} |
|||
.stat-widget-one { |
|||
background-color: white; |
|||
text-align: center; |
|||
} |
|||
|
|||
.stat-widget-one .stat-icon i { |
|||
font-size: 30px; |
|||
font-weight: 900; |
|||
display: inline-block; |
|||
color: #01c490;} |
|||
|
|||
.stat-widget-one .stat-text { |
|||
font-size: 14px; |
|||
color: #868e96; } |
|||
|
|||
.stat-widget-one .stat-digit { |
|||
font-size: 24px; |
|||
color: #02448b; } |
|||
|
|||
.stat-count { |
|||
font-size: 20px; |
|||
text-align: center; |
|||
color: #00438b;} |
|||
|
|||
.stat-title { |
|||
font-size: 17px; |
|||
text-align: center; |
|||
color: #00438b; } |
|||
|
|||
.bg-flat-color-1 { |
|||
background: #20a8d8; } |
|||
|
|||
.bg-flat-color-2 { |
|||
background: #63c2de; } |
|||
|
|||
.bg-flat-color-3 { |
|||
background: #ffc107; } |
|||
|
|||
.bg-flat-color-4 { |
|||
background: #f86c6b; } |
|||
|
|||
.bg-flat-color-5 { |
|||
background: #4dbd74; } |
|||
|
|||
.mb-0{ |
|||
font-size: 20px; |
|||
position: relative; |
|||
text-align: center; |
|||
} |
|||
.mb-0 .dash-title { |
|||
font-size: 20px; |
|||
text-align: center; |
|||
color: rgba(255, 255, 255, 0.81); |
|||
} |
|||
.hr_birthday { |
|||
font-size: 28px; |
|||
text-align: center; |
|||
padding: 20px 0; |
|||
color: #00438b; |
|||
font-weight: 600; |
|||
} |
|||
body .text-color { |
|||
color: #00438b; |
|||
} |
@ -0,0 +1,223 @@ |
|||
odoo.define('hrms_dashboard.Dashboard', function (require) { |
|||
"use strict"; |
|||
|
|||
var ajax = require('web.ajax'); |
|||
var ControlPanelMixin = require('web.ControlPanelMixin'); |
|||
var core = require('web.core'); |
|||
var Dialog = require('web.Dialog'); |
|||
var Model = require('web.Model'); |
|||
var session = require('web.session'); |
|||
var utils = require('web.utils'); |
|||
var web_client = require('web.web_client'); |
|||
var Widget = require('web.Widget'); |
|||
var session = require('web.session'); |
|||
var _t = core._t; |
|||
var QWeb = core.qweb; |
|||
|
|||
var HrDashboard = Widget.extend(ControlPanelMixin, { |
|||
template: "hrms_dashboard.HrDashboardMain", |
|||
events: { |
|||
'click .hr_leave_request_approve': 'leaves_to_approve', |
|||
'click .hr_leave_allocations_approve': 'leave_allocations_to_approve', |
|||
'click .hr_timesheet_approve': 'timesheets_to_approve', |
|||
'click .hr_job_application_approve': 'job_applications_to_approve', |
|||
'click .hr_payslip':'hr_payslip', |
|||
'click .hr_contract':'hr_contract', |
|||
'click .hr_employee':'hr_employee', |
|||
'click .leaves_request_month':'leaves_request_month', |
|||
'click .leaves_request':'leaves_request' |
|||
}, |
|||
|
|||
init: function(parent, context) { |
|||
this._super(parent, context); |
|||
this.login_employee = true; |
|||
this.employee_birthday = []; |
|||
this._super(parent,context); |
|||
|
|||
}, |
|||
|
|||
start: function() { |
|||
var self = this; |
|||
for(var i in self.breadcrumbs){ |
|||
self.breadcrumbs[i].title = "Dashboard"; |
|||
} |
|||
self.update_control_panel({breadcrumbs: self.breadcrumbs}, {clear: true}); |
|||
var hr_emp = new Model('hr.employee'); |
|||
var model = new Model('hr.employee').call('get_user_employee_details').then(function(result){ |
|||
|
|||
this.login_employee = result[0]; |
|||
$('.o_hr_dashboard').html(QWeb.render('ManagerDashboard', {widget: this})); |
|||
$('.o_hr_dashboard').prepend(QWeb.render('LoginEmployeeDetails', {widget: this})); |
|||
/*need to check user access levels*/ |
|||
session.user_has_group('hr.group_hr_manager').then(function(has_group){ |
|||
if(has_group == false){ |
|||
$('.employee_dashboard_main').css("display", "none"); |
|||
} |
|||
}); |
|||
}); |
|||
var today = new Date().toJSON().slice(0,10).replace(/-/g,'/'); |
|||
var employee = new Model('hr.employee').query(['name', 'birthday','image']).filter([['birthday', '!=', false]]) |
|||
.order_by('birthday').all().then(function(res){ |
|||
for (var i = 0; i < res.length; i++) { |
|||
var bday_dt = new Date(res[i]['birthday']); |
|||
var bday_month = bday_dt.getMonth(); |
|||
var bday_day = bday_dt.getDate(); |
|||
var today_dt = new Date( today); |
|||
var today_month = today_dt.getMonth(); |
|||
var today_day = today_dt.getDate(); |
|||
var day = new Date(); |
|||
var next_day = new Date(day.setDate(day.getDate() + 7)); |
|||
var next_week = next_day.toJSON().slice(0,10).replace(/-/g,'/'); |
|||
var bday_date = bday_dt.toJSON().slice(0,10).replace(/-/g,'/');; |
|||
if (bday_month == today_month && bday_day >= today_day && next_week >= bday_date){ |
|||
self.employee_birthday.push(res[i]); |
|||
var flag = 1; |
|||
} |
|||
} |
|||
if (flag !=1){ |
|||
self.employee_birthday = false; |
|||
} |
|||
$('.o_hr_birthday_reminder').html(QWeb.render('BirthdayEventDashboard', {widget: self})); |
|||
}); |
|||
return this._super().then(function() { |
|||
self.$el.parent().addClass('oe_background_grey'); |
|||
}); |
|||
}, |
|||
|
|||
hr_payslip: function(e){ |
|||
var self = this; |
|||
e.stopPropagation(); |
|||
e.preventDefault(); |
|||
this.do_action({ |
|||
name: _t("Employee Payslips"), |
|||
type: 'ir.actions.act_window', |
|||
res_model: 'hr.payslip', |
|||
view_mode: 'tree,form,calendar', |
|||
view_type: 'form', |
|||
views: [[false, 'list'],[false, 'form']], |
|||
target: 'current' |
|||
}) |
|||
}, |
|||
|
|||
hr_contract: function(e){ |
|||
var self = this; |
|||
e.stopPropagation(); |
|||
e.preventDefault(); |
|||
this.do_action({ |
|||
name: _t("Contracts"), |
|||
type: 'ir.actions.act_window', |
|||
res_model: 'hr.contract', |
|||
view_mode: 'tree,form,calendar', |
|||
view_type: 'form', |
|||
views: [[false, 'list'],[false, 'form']], |
|||
target: 'current' |
|||
}) |
|||
}, |
|||
|
|||
leaves_request_month: function(e) { |
|||
var self = this; |
|||
e.stopPropagation(); |
|||
e.preventDefault(); |
|||
var date = new Date(); |
|||
var firstDay = new Date(date.getFullYear(), date.getMonth(), 1); |
|||
var lastDay = new Date(date.getFullYear(), date.getMonth() + 1, 0); |
|||
var fday = firstDay.toJSON().slice(0,10).replace(/-/g,'-'); |
|||
var lday = lastDay.toJSON().slice(0,10).replace(/-/g,'-'); |
|||
this.do_action({ |
|||
name: _t("Leave Request"), |
|||
type: 'ir.actions.act_window', |
|||
res_model: 'hr.holidays', |
|||
view_mode: 'tree,form,calendar', |
|||
view_type: 'form', |
|||
views: [[false, 'list'],[false, 'form']], |
|||
domain: [['date_from','>', fday],['state','=','confirm'],['date_from','<', lday]], |
|||
target: 'current' |
|||
}) |
|||
}, |
|||
|
|||
leaves_request: function(e) { |
|||
var self = this; |
|||
e.stopPropagation(); |
|||
e.preventDefault(); |
|||
this.do_action({ |
|||
name: _t("Leave Request"), |
|||
type: 'ir.actions.act_window', |
|||
res_model: 'hr.holidays', |
|||
view_mode: 'tree,form,calendar', |
|||
view_type: 'form', |
|||
views: [[false, 'list'],[false, 'form']], |
|||
domain: [['type','=','add']], |
|||
target: 'current' |
|||
}) |
|||
}, |
|||
leaves_to_approve: function(e) { |
|||
var self = this; |
|||
e.stopPropagation(); |
|||
e.preventDefault(); |
|||
this.do_action({ |
|||
name: _t("Leave Request"), |
|||
type: 'ir.actions.act_window', |
|||
res_model: 'hr.holidays', |
|||
view_mode: 'tree,form,calendar', |
|||
view_type: 'form', |
|||
views: [[false, 'list'],[false, 'form']], |
|||
context: {'search_default_approve': true}, |
|||
domain: [['type','=','remove'],], |
|||
target: 'current' |
|||
}) |
|||
}, |
|||
leave_allocations_to_approve: function(e) { |
|||
var self = this; |
|||
e.stopPropagation(); |
|||
e.preventDefault(); |
|||
this.do_action({ |
|||
name: _t("Leave Allocation Request"), |
|||
type: 'ir.actions.act_window', |
|||
res_model: 'hr.holidays', |
|||
view_mode: 'tree,form,calendar', |
|||
view_type: 'form', |
|||
views: [[false, 'list'],[false, 'form']], |
|||
context: {'search_default_approve': true}, |
|||
domain: [['type','=','add'],], |
|||
target: 'current' |
|||
}) |
|||
}, |
|||
|
|||
timesheets_to_approve: function(e) { |
|||
var self = this; |
|||
e.stopPropagation(); |
|||
e.preventDefault(); |
|||
this.do_action({ |
|||
name: _t("Timesheets"), |
|||
type: 'ir.actions.act_window', |
|||
res_model: 'hr_timesheet_sheet.sheet', |
|||
view_mode: 'tree,form', |
|||
view_type: 'form', |
|||
views: [[false, 'list'],[false, 'form']], |
|||
context: {'search_default_to_approve': true}, |
|||
target: 'current' |
|||
}) |
|||
}, |
|||
job_applications_to_approve: function(event){ |
|||
var self = this; |
|||
event.stopPropagation(); |
|||
event.preventDefault(); |
|||
this.do_action({ |
|||
name: _t("Applications"), |
|||
type: 'ir.actions.act_window', |
|||
res_model: 'hr.applicant', |
|||
view_mode: 'tree,kanban,form,pivot,graph,calendar', |
|||
view_type: 'form', |
|||
views: [[false, 'list'],[false, 'kanban'],[false, 'form'], |
|||
[false, 'pivot'],[false, 'graph'],[false, 'calendar']], |
|||
context: {}, |
|||
target: 'current' |
|||
}) |
|||
}, |
|||
}); |
|||
|
|||
core.action_registry.add('hr_dashboard', HrDashboard); |
|||
|
|||
return HrDashboard; |
|||
|
|||
}); |
@ -0,0 +1,155 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<templates id="template" xml:space="preserve"> |
|||
<t t-name="hrms_dashboard.HrDashboardMain"> |
|||
<div class="o_dashboards"> |
|||
<div class="container-fluid o_hr_dashboard"> |
|||
</div> |
|||
<div class="o_hr_birthday_reminder"></div> |
|||
</div> |
|||
</t> |
|||
|
|||
<t t-name="ManagerDashboard"> |
|||
<div class="col-xs-12 employee_dashboard_main"> |
|||
<div class="col-sm-6 col-lg-6 "> |
|||
<div class="col-sm-8 col-lg-8 leaves_request" style="padding:0 !important;"> |
|||
<div class="card text-color" style="height: 219px;padding-top: 21%;"> |
|||
<div class="card-body pb-0"> |
|||
<h4 class="mb-0"> |
|||
<p class="stat-count"><t t-esc="widget.login_employee.leaves_to_approve"/></p> |
|||
|
|||
</h4> |
|||
<p class="stat-title">Leave Request</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-sm-4 col-lg-4 leaves_request_month" style="padding-right:0px !important" > |
|||
<div class="card text-color" style="height: 102px;"> |
|||
<div class="card-body"> |
|||
<h4 class="mb-0"> |
|||
<p class="stat-count"><t t-esc="widget.login_employee.leaves_to_approve"/></p> |
|||
</h4> |
|||
<p class="stat-title">This Month</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-sm-4 col-lg-4 hr_leave_request_approve" style="padding-right:0px !important"> |
|||
<div class="card text-color" style="height: 102px;"> |
|||
<div class="card-body"> |
|||
<h4 class="mb-0"> |
|||
<p class="stat-count"><t t-esc="widget.login_employee.leaves_to_approve"/></p> |
|||
</h4> |
|||
<p class="stat-title">To Approve</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-sm-6 col-lg-6 hr_leave_allocations_approve"> |
|||
<div class="card text-color"> |
|||
<div class="card-body pb-0"> |
|||
<h4 class="mb-0"> |
|||
<p class="stat-count"><t t-esc="widget.login_employee.leaves_alloc_req"/></p> |
|||
</h4> |
|||
<p class="stat-title">Leave Allocations</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-sm-6 col-lg-6 hr_job_application_approve"> |
|||
<div class="card text-color"> |
|||
<div class="card-body pb-0"> |
|||
<h4 class="mb-0"> |
|||
<p class="stat-count"><t t-esc="widget.login_employee.job_applications"/></p> |
|||
</h4> |
|||
<p class="stat-title">Job Applications</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</t> |
|||
|
|||
<t t-name="BirthdayEventDashboard"> |
|||
<t t-if="widget.employee_birthday"> |
|||
<div class="col-xs-12"> |
|||
<div class="hr_birthday"> |
|||
Upcoming Birthdays |
|||
</div> |
|||
</div> |
|||
<div class="col-xs-12"> |
|||
<t t-foreach="widget.employee_birthday" t-as="employee"> |
|||
<div class="col-sm-6 col-lg-3 hr_leave_request_approve"> |
|||
<div class="card text-color"> |
|||
<div class=""> |
|||
<div class="media"> |
|||
<a href="#" style="float: left;padding-right: 6%;"> |
|||
<img class="align-self-center rounded-circle mr-3" style="width:85px; height:85px;" alt="" |
|||
t-att-src="'data:image/png;base64,'+employee['image']"/> |
|||
</a> |
|||
<div class="media-body"> |
|||
<h2 class="text-color display-6" style="font-size: 15px;"><t t-esc="employee['name']"/> </h2> |
|||
<p class="text-light"><t t-esc="employee['birthday']"/></p> |
|||
</div></div></div></div> |
|||
</div> |
|||
</t> |
|||
</div> |
|||
</t> |
|||
</t> |
|||
|
|||
<t t-name="LoginEmployeeDetails"> |
|||
<div class="col-xs-12 o_box" style="padding-top: 25px;"> |
|||
<div class="col-md-6 col-sm-6"> |
|||
<div class="card"> |
|||
<div> |
|||
<div class="media"> |
|||
<a href="#" style="float: left;padding-right: 7%;"> |
|||
<img class="align-self-center rounded-circle mr-3" style="width:85px; height:85px;" alt="" |
|||
t-att-src="'data:image/png;base64,'+widget.login_employee['image']"/> |
|||
</a> |
|||
<div class="media-body"> |
|||
<h2 class="text-color display-6"><t t-esc="widget.login_employee['name']"/> </h2> |
|||
<p class="text-light"><t t-esc="widget.login_employee['job_id'][1]"/></p> |
|||
</div></div></div></div> |
|||
</div> |
|||
|
|||
<div class="col-md-2 col-sm-6 hr_payslip"> |
|||
<div class="card"> |
|||
<div class="card-body"> |
|||
<div class="stat-widget-one"> |
|||
<div class="stat-icon dib"><i class="fa fa-money"/></div> |
|||
<div class="stat-content dib"> |
|||
<div class="stat-text">Payslips</div> |
|||
<div class="stat-digit"><t t-esc="widget.login_employee['payslip_count']"/></div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-md-2 col-sm-6"> |
|||
<div class="card"> |
|||
<div class="card-body"> |
|||
<div class="stat-widget-one"> |
|||
<div class="stat-icon dib"><i class="fa fa-clock-o"/></div> |
|||
<div class="stat-content dib"> |
|||
<div class="stat-text">Timesheets</div> |
|||
<div class="stat-digit"><t t-esc="widget.login_employee['timesheet_count']"/></div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-md-2 col-sm-6 hr_contract"> |
|||
<div class="card"> |
|||
<div class="card-body"> |
|||
<div class="stat-widget-one"> |
|||
<div class="stat-icon dib"><i class="fa fa-fw fa-book"/></div> |
|||
<div class="stat-content dib"> |
|||
<div class="stat-text">Contracts</div> |
|||
<div class="stat-digit"><t t-esc="widget.login_employee['contracts_count']"/></div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</t> |
|||
</templates> |
@ -0,0 +1,24 @@ |
|||
<odoo> |
|||
<data> |
|||
<record id="hr_action_dashboard" model="ir.actions.client"> |
|||
<field name="name">Dashboard</field> |
|||
<field name="tag">hr_dashboard</field> |
|||
<!--<field name="target">main</field>--> |
|||
</record> |
|||
|
|||
<menuitem id="menu_hrms_dashboard" |
|||
name="Dashboard" |
|||
action="hr_action_dashboard" |
|||
parent="hr.menu_hr_root" |
|||
sequence="-1"/> |
|||
</data> |
|||
<template id="assets_backend" name="Hr Dashboard assets" inherit_id="web.assets_backend"> |
|||
<xpath expr="." position="inside"> |
|||
<script type="text/javascript" src="/hrms_dashboard/static/src/js/hrms_dashboard.js"/> |
|||
|
|||
<script type="text/javascript" src="/hrms_dashboard/static/lib/chart/Chart.min.js"/> |
|||
<script type="text/javascript" src="/hrms_dashboard/static/lib/chart/Chart.bundle.min.js"/> |
|||
<link rel="stylesheet" href="/hrms_dashboard/static/src/css/hrms_dashboard.css"/> |
|||
</xpath> |
|||
</template> |
|||
</odoo> |
Loading…
Reference in new issue