Browse Source

[ADD] Initial Commit

pull/200/head
Ajmal Cybro 3 years ago
parent
commit
1c20a8d605
  1. 48
      project_dashboard_odoo/README.rst
  2. 23
      project_dashboard_odoo/__init__.py
  3. 52
      project_dashboard_odoo/__manifest__.py
  4. 8
      project_dashboard_odoo/doc/RELEASE_NOTES.md
  5. 23
      project_dashboard_odoo/models/__init__.py
  6. 382
      project_dashboard_odoo/models/pj_dashboard.py
  7. BIN
      project_dashboard_odoo/static/description/assets/icons/chevron.png
  8. BIN
      project_dashboard_odoo/static/description/assets/icons/cogs.png
  9. BIN
      project_dashboard_odoo/static/description/assets/icons/consultation.png
  10. BIN
      project_dashboard_odoo/static/description/assets/icons/ecom-black.png
  11. BIN
      project_dashboard_odoo/static/description/assets/icons/education-black.png
  12. BIN
      project_dashboard_odoo/static/description/assets/icons/hotel-black.png
  13. BIN
      project_dashboard_odoo/static/description/assets/icons/license.png
  14. BIN
      project_dashboard_odoo/static/description/assets/icons/lifebuoy.png
  15. BIN
      project_dashboard_odoo/static/description/assets/icons/manufacturing-black.png
  16. BIN
      project_dashboard_odoo/static/description/assets/icons/pos-black.png
  17. BIN
      project_dashboard_odoo/static/description/assets/icons/puzzle.png
  18. BIN
      project_dashboard_odoo/static/description/assets/icons/restaurant-black.png
  19. BIN
      project_dashboard_odoo/static/description/assets/icons/service-black.png
  20. BIN
      project_dashboard_odoo/static/description/assets/icons/trading-black.png
  21. BIN
      project_dashboard_odoo/static/description/assets/icons/training.png
  22. BIN
      project_dashboard_odoo/static/description/assets/icons/update.png
  23. BIN
      project_dashboard_odoo/static/description/assets/icons/user.png
  24. BIN
      project_dashboard_odoo/static/description/assets/icons/wrench.png
  25. BIN
      project_dashboard_odoo/static/description/banner.png
  26. BIN
      project_dashboard_odoo/static/description/icon.png
  27. BIN
      project_dashboard_odoo/static/description/images/checked.png
  28. BIN
      project_dashboard_odoo/static/description/images/hero.gif
  29. BIN
      project_dashboard_odoo/static/description/images/hero.png
  30. BIN
      project_dashboard_odoo/static/description/images/logo.png
  31. BIN
      project_dashboard_odoo/static/description/images/modules/approval_image.png
  32. BIN
      project_dashboard_odoo/static/description/images/modules/follow_image.png
  33. BIN
      project_dashboard_odoo/static/description/images/modules/mulitple-ref_image.png
  34. BIN
      project_dashboard_odoo/static/description/images/modules/pos_image.png
  35. BIN
      project_dashboard_odoo/static/description/images/modules/pos_order_image.png
  36. BIN
      project_dashboard_odoo/static/description/images/modules/shopify_image.png
  37. BIN
      project_dashboard_odoo/static/description/images/pd1.png
  38. BIN
      project_dashboard_odoo/static/description/images/pd2.png
  39. BIN
      project_dashboard_odoo/static/description/images/pd3.png
  40. BIN
      project_dashboard_odoo/static/description/images/pd4.png
  41. BIN
      project_dashboard_odoo/static/description/images/pd5.png
  42. BIN
      project_dashboard_odoo/static/description/images/prg_db.png
  43. BIN
      project_dashboard_odoo/static/description/images/prg_db2.png
  44. BIN
      project_dashboard_odoo/static/description/images/prg_db3.png
  45. BIN
      project_dashboard_odoo/static/description/images/prg_db4.png
  46. 573
      project_dashboard_odoo/static/description/index.html
  47. 1013
      project_dashboard_odoo/static/src/css/dashboard.css
  48. 427
      project_dashboard_odoo/static/src/css/lib/nv.d3.css
  49. 568
      project_dashboard_odoo/static/src/js/dashboard.js
  50. 7828
      project_dashboard_odoo/static/src/js/lib/d3.min.js
  51. 446
      project_dashboard_odoo/static/src/xml/dashboard.xml
  52. 28
      project_dashboard_odoo/views/dashboard_views.xml

48
project_dashboard_odoo/README.rst

@ -0,0 +1,48 @@
Project Dashboard
==================
Module for Project Dashboard
Installation
============
- www.odoo.com/documentation/14.0/setup/install.html
- Install our custom addon
Configuration
=============
* No additional configurations needed
License
-------
General Public License, Version 3 (LGPL v3).
(https://www.odoo.com/documentation/user/14.0/legal/licenses/licenses.html)
Company
-------
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__
Credits
-------
* Developers: odoo@cybrosys.com
Contacts
--------
* Mail Contact : odoo@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>`__

23
project_dashboard_odoo/__init__.py

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from .import models

52
project_dashboard_odoo/__manifest__.py

@ -0,0 +1,52 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
{
'name': 'Project Dashboard',
'category': 'Productivity',
'summary': 'Detailed Dashboard View for Project',
'description': 'Detailed Dashboard View for Project',
'version': '14.0.1.0.0',
'author': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions',
'website': 'https://www.cybrosys.com',
'license': 'LGPL-3',
'depends': [
'base',
'product',
'sale_management',
'project',
'sale_timesheet',
],
'data': [
'views/dashboard_views.xml',
],
'images': [
'static/description/banner.png',
],
'qweb': ['static/src/xml/dashboard.xml'],
'installable': True,
'application': True,
'auto_install': False,
}

8
project_dashboard_odoo/doc/RELEASE_NOTES.md

@ -0,0 +1,8 @@
## Module <project_dashboard_odoo>
#### 17.08.2021
#### Version 14.0.1.0.0
## Module <project_dashboard_odoo>
##### Initial Commit for project_dashboard_odoo

23
project_dashboard_odoo/models/__init__.py

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from . import pj_dashboard

382
project_dashboard_odoo/models/pj_dashboard.py

@ -0,0 +1,382 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import models, api
from datetime import datetime
from dateutil.relativedelta import relativedelta
import pandas as pd
import calendar
class PosDashboard(models.Model):
_inherit = 'project.project'
@api.model
def get_tiles_data(self):
all_project = self.env['project.project'].search([])
all_task = self.env['project.task'].search([])
analytic_project = self.env['account.analytic.line'].search([])
report_project = self.env['project.profitability.report'].search([])
to_invoice = sum(report_project.mapped('amount_untaxed_to_invoice'))
invoice = sum(report_project.mapped('amount_untaxed_invoiced'))
timesheet_cost = sum(report_project.mapped('timesheet_cost'))
other_cost = sum(report_project.mapped('expense_cost'))
profitability = to_invoice + invoice + timesheet_cost + other_cost
total_time = sum(analytic_project.mapped('unit_amount'))
employees = self.env['hr.employee'].search([])
task = self.env['project.task'].search_read([
('sale_order_id', '!=', False)
], ['sale_order_id'])
task_so_ids = [o['sale_order_id'][0] for o in task]
sale_orders = self.mapped('sale_line_id.order_id') | self.env['sale.order'].browse(task_so_ids)
return {
'total_projects': len(all_project),
'total_tasks': len(all_task),
'total_hours': total_time,
'total_profitability': profitability,
'total_employees': len(employees),
'total_sale_orders': len(sale_orders)
}
@api.model
def get_top_timesheet_employees(self):
query = '''select hr_employee.name as employee,sum(unit_amount) as unit
from account_analytic_line
inner join hr_employee on hr_employee.id =account_analytic_line.employee_id
group by hr_employee.id ORDER
BY unit DESC Limit 10 '''
self._cr.execute(query)
top_product = self._cr.dictfetchall()
unit = []
for record in top_product:
unit.append(record.get('unit'))
employee = []
for record in top_product:
employee.append(record.get('employee'))
final = [unit, employee]
return final
@api.model
def get_project_task(self):
cr = self._cr
cr.execute("""select project_id, project_project.name,count(*)
from project_task join project_project on project_project.id=project_task.project_id
group by project_task.project_id,project_project.name""")
dat = cr.fetchall()
data = []
for i in range(0, len(dat)):
data.append({'label': dat[i][1], 'value': dat[i][2]})
return data
@api.model
def project_profitability_trend(self):
leave_lines = []
month_list = []
graph_result = []
for i in range(6, -2, -1):
last_month = datetime.now() - relativedelta(months=i)
text = format(last_month, '%B %Y')
month_list.append(text)
for month in month_list:
vals = {
'l_month': month,
'leave': 0
}
graph_result.append(vals)
sql = """SELECT h.id,h.margin,
to_char(y, 'YYYY') as month_year
FROM (select * from project_profitability_report) h
,date_trunc('year', line_date)y"""
self.env.cr.execute(sql)
results = self.env.cr.dictfetchall()
for line in results:
days = line['margin']
vals = {
'l_month': line['month_year'],
'days': days
}
leave_lines.append(vals)
if leave_lines:
df = pd.DataFrame(leave_lines)
rf = df.groupby(['l_month']).sum()
result_lines = rf.to_dict('index')
for line in result_lines:
match = list(graph_result)
if match:
match[0]['leave'] = result_lines[line]['days']
for result in graph_result:
result['l_month'] = result['l_month'].split(' ')[:1][0].strip()[:3] + " " + \
result['l_month'].split(' ')[1:2][0]
return graph_result
@api.model
def get_profitability_details(self):
query = '''select sum(margin) as payment_details from project_profitability_report'''
self._cr.execute(query)
data = self._cr.dictfetchall()
payment_details = []
for record in data:
payment_details.append(record.get('payment_details'))
return {
'payment_details': payment_details,
}
@api.model
def get_details(self):
query = '''select sum(amount_untaxed_invoiced) as invoiced,
sum(amount_untaxed_to_invoice) as to_invoice,sum(timesheet_cost) as time_cost,
sum(expense_cost) as expen_cost,
sum(margin) as payment_details from project_profitability_report'''
self._cr.execute(query)
data = self._cr.dictfetchall()
invoiced = []
for record in data:
invoiced.append(record.get('invoiced'))
to_invoice = []
for record in data:
to_invoice.append(record.get('to_invoice'))
time_cost = []
for record in data:
time_cost.append(record.get('time_cost'))
expen_cost = []
for record in data:
expen_cost.append(record.get('expen_cost'))
payment_details = []
for record in data:
payment_details.append(record.get('payment_details'))
return {
'invoiced': invoiced,
'to_invoice': to_invoice,
'time_cost': time_cost,
'expen_cost': expen_cost,
'payment_details': payment_details,
}
@api.model
def get_hours_data(self):
query = '''SELECT sum(unit_amount) as hour_recorded FROM account_analytic_line
WHERE timesheet_invoice_type='non_billable_project' '''
self._cr.execute(query)
data = self._cr.dictfetchall()
hour_recorded = []
for record in data:
hour_recorded.append(record.get('hour_recorded'))
query = '''SELECT sum(unit_amount) as hour_recorde FROM account_analytic_line
WHERE timesheet_invoice_type='billable_time' '''
self._cr.execute(query)
data = self._cr.dictfetchall()
hour_recorde = []
for record in data:
hour_recorde.append(record.get('hour_recorde'))
query = '''SELECT sum(unit_amount) as billable_fix FROM account_analytic_line
WHERE timesheet_invoice_type='billable_fixed' '''
self._cr.execute(query)
data = self._cr.dictfetchall()
billable_fix = []
for record in data:
billable_fix.append(record.get('billable_fix'))
query = '''SELECT sum(unit_amount) as non_billable FROM account_analytic_line
WHERE timesheet_invoice_type='non_billable' '''
self._cr.execute(query)
data = self._cr.dictfetchall()
non_billable = []
for record in data:
non_billable.append(record.get('non_billable'))
query = '''SELECT sum(unit_amount) as total_hr FROM account_analytic_line
WHERE timesheet_invoice_type='non_billable_project' or timesheet_invoice_type='billable_time'
or timesheet_invoice_type='billable_fixed' or timesheet_invoice_type='non_billable' '''
self._cr.execute(query)
data = self._cr.dictfetchall()
total_hr = []
for record in data:
total_hr.append(record.get('total_hr'))
return {
'hour_recorded': hour_recorded,
'hour_recorde': hour_recorde,
'billable_fix': billable_fix,
'non_billable': non_billable,
'total_hr': total_hr,
}
@api.model
def get_income_this_year(self):
month_list = []
for i in range(11, -1, -1):
l_month = datetime.now() - relativedelta(months=i)
text = format(l_month, '%B')
month_list.append(text)
states_arg = ""
self._cr.execute(('''select sum(margin) as income ,to_char(project_profitability_report.line_date, 'Month')
as month from project_profitability_report where
to_char(DATE(NOW()), 'YY') = to_char(project_profitability_report.line_date, 'YY')
%s group by month ''') % (states_arg))
record = self._cr.dictfetchall()
records = []
for month in month_list:
last_month_inc = list(filter(lambda m: m['month'].strip() == month, record))
if not last_month_inc:
records.append({
'month': month,
'profit': 0.0,
})
else:
last_month_inc[0].update({
'profit': last_month_inc[0]['income']
})
records.append(last_month_inc[0])
month = []
profit = []
for rec in records:
month.append(rec['month'])
profit.append(rec['profit'])
return {
'profit': profit,
'month': month,
}
@api.model
def get_income_last_year(self):
month_list = []
for i in range(11, -1, -1):
l_month = datetime.now() - relativedelta(months=i)
text = format(l_month, '%B')
month_list.append(text)
states_arg = ""
self._cr.execute(('''select sum(margin) as income ,to_char(project_profitability_report.line_date, 'Month')
as month from project_profitability_report where
Extract(year FROM project_profitability_report.line_date) = Extract(year FROM DATE(NOW())) -1
%s group by month ''') % (states_arg))
record = self._cr.dictfetchall()
records = []
for month in month_list:
last_month_inc = list(filter(lambda m: m['month'].strip() == month, record))
if not last_month_inc:
records.append({
'month': month,
'profit': 0.0,
})
else:
last_month_inc[0].update({
'profit': last_month_inc[0]['income']
})
records.append(last_month_inc[0])
month = []
profit = []
for rec in records:
month.append(rec['month'])
profit.append(rec['profit'])
return {
'month': month,
'profit': profit,
}
@api.model
def get_income_this_month(self):
states_arg = ""
day_list = []
now = datetime.now()
day = calendar.monthrange(now.year, now.month)[1]
for x in range(1, day + 1):
day_list.append(x)
self._cr.execute(('''select sum(margin) as income ,cast(to_char(project_profitability_report.line_date, 'DD')
as int) as date from project_profitability_report where
Extract(month FROM project_profitability_report.line_date) = Extract(month FROM DATE(NOW()))
AND Extract(YEAR FROM project_profitability_report.line_date) = Extract(YEAR FROM DATE(NOW()))
%s group by date ''') % (states_arg))
record = self._cr.dictfetchall()
records = []
for date in day_list:
last_month_inc = list(filter(lambda m: m['date'] == date, record))
if not last_month_inc:
records.append({
'date': date,
'income': 0.0,
'profit': 0.0
})
else:
last_month_inc[0].update({
'profit': last_month_inc[0]['income']
})
records.append(last_month_inc[0])
date = []
profit = []
for rec in records:
date.append(rec['date'])
profit.append(rec['profit'])
return {
'date': date,
'profit': profit
}
@api.model
def get_task_data(self):
self._cr.execute('''select project_task.name as task_name,pro.name as project_name from project_task
Inner join project_project as pro on project_task.project_id = pro.id ORDER BY project_name ASC''')
data = self._cr.fetchall()
project_name = []
for rec in data:
b = list(rec)
project_name.append(b)
return {
'project': project_name
}

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
project_dashboard_odoo/static/description/banner.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

BIN
project_dashboard_odoo/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
project_dashboard_odoo/static/description/images/checked.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
project_dashboard_odoo/static/description/images/hero.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

BIN
project_dashboard_odoo/static/description/images/hero.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 KiB

BIN
project_dashboard_odoo/static/description/images/logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
project_dashboard_odoo/static/description/images/modules/approval_image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

BIN
project_dashboard_odoo/static/description/images/modules/follow_image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

BIN
project_dashboard_odoo/static/description/images/modules/mulitple-ref_image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

BIN
project_dashboard_odoo/static/description/images/modules/pos_image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

BIN
project_dashboard_odoo/static/description/images/modules/pos_order_image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

BIN
project_dashboard_odoo/static/description/images/modules/shopify_image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

BIN
project_dashboard_odoo/static/description/images/pd1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
project_dashboard_odoo/static/description/images/pd2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
project_dashboard_odoo/static/description/images/pd3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
project_dashboard_odoo/static/description/images/pd4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
project_dashboard_odoo/static/description/images/pd5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

BIN
project_dashboard_odoo/static/description/images/prg_db.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

BIN
project_dashboard_odoo/static/description/images/prg_db2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

BIN
project_dashboard_odoo/static/description/images/prg_db3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

BIN
project_dashboard_odoo/static/description/images/prg_db4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

573
project_dashboard_odoo/static/description/index.html

@ -0,0 +1,573 @@
<div class="container" style="padding: 1rem !important; margin-bottom: 1.5rem !important;">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-12 d-flex justify-content-between"
style="border-bottom: 1px solid #d5d5d5;">
<div class="my-3">
<img src="./images/logo.png" style="width: auto !important; height: 40px !important;">
</div>
<div class="my-3 d-flex align-items-center">
<div
style="background-color: #7C7BAD !important; color: #fff !important; font-weight: 600 !important; padding: 5px 15px 8px !important; margin: 0 5px !important;">
<i class="fa fa-check mr-1"></i>Community
</div>
</div>
</div>
</div>
</div>
<div style="padding: 3.5rem 1.5rem !important; background-color: #ffffff !important;">
<div class="container">
<!-- HERO -->
<div class="row">
<div class="col-lg-12 d-flex flex-column justify-content-center"
style="text-align: center; padding: 1rem !important;">
<h1 class="text-center" style="color: #212121 !important; font-size: 3.5rem !important;"><span
style="font-weight: 700 !important;">Project Dashboard</span></h1>
<p class="text-center"
style="color: #212529 !important; font-size: 1.5rem !important; letter-spacing: 1px !important;">
Detailed Dashboard View for Project
</p>
<img src="./images/hero.gif" class="img-responsive">
</div>
</div>
<!-- END OF HERO -->
<!-- OVERVIEW -->
<div class="row">
<div class="col-lg-12 d-flex flex-column justify-content-center"
style="text-align: center; padding: 2.5rem 1rem !important;">
<h2 style="color: #212529 !important;">Overview</h2>
<hr
style="border: 3px solid #AC1015 !important; background-color: #AC1015 !important; width: 80px !important; margin-bottom: 2rem !important;"/>
<p class="text-center" style="color: #212529 !important; font-size: 1.5rem !important;">
This module helps you to see the Overview of Project, here You can see the task, Employees,
Timesheet, etc.
</p>
</div>
</div>
<!-- END OF OVERVIEW -->
<!-- KEY FEATURES -->
<div class="row">
<div class="col-lg-12 d-flex flex-column justify-content-center" style="padding: 2.5rem 1rem !important;">
<h2 class="text-center" style="color: #212529 !important;">Key Features</h2>
<hr
style="border: 3px solid #AC1015 !important; background-color: #AC1015 !important; width: 80px !important; margin-bottom: 2rem !important;"/>
<div class="row">
<div class="col-lg-12">
<div class="d-flex deep-2"
style="height: 60px !important; padding: 1rem 1.5rem !important; border-radius: 0 !important; margin: 1.5rem 0">
<img src="./images/checked.png" style="height: 24px !important; width: 24px !important;"
class="mt-1 mr-2" height="24px" width="24px">
<p style="color: #212529 !important; font-size: 1.3rem !important;">
Project & Task Details
</p>
</div>
<div class="d-flex deep-2"
style="height: 60px !important; padding: 1rem 1.5rem !important; border-radius: 0 !important; margin: 1.5rem 0">
<img src="./images/checked.png" style="height: 24px !important; width: 24px !important;"
class="mt-1 mr-2" height="24px" width="24px">
<p style="color: #212529 !important; font-size: 1.3rem !important;">
Profitability & Timesheet Analysis
</p>
</div>
</div>
</div>
</div>
</div>
<!-- END OF KEY FEATURES -->
<!-- SCREENSHOTS -->
<div class="row">
<div class="col-lg-12 d-flex flex-column justify-content-center" style="padding: 2.5rem 1rem !important;">
<h2 style="text-align: center; color: #212529 !important;">Screenshots</h2>
<hr
style="border: 3px solid #AC1015 !important; background-color: #AC1015 !important; width: 80px !important; margin-bottom: 2rem !important;"/>
<!-- img -->
<div style="text-align: center" ;class="d-flex m-0"
style="border-bottom: 1px solid #e5e5e5 !important;">
<div class="mr-3">
<h3
style="font-size: 2rem !important; font-weight: 800 !important; color: #ffffff !important; background-color: #58a360 !important; padding: 1rem !important; width: 60px !important; height: 60px !important;">
01</h3>
</div>
<div>
<h3 class="text-center" style=" font-size: 1.7rem !important; font-weight: 600 !important;">
Project Details
</h3>
<p class="text-center"
style="color: #212529 !important; font-size: 1.3rem !important; font-weight: 300 !important;">
Display the Project related information likes Total Project, Total Employees, Total Tasks,
Hours Recorded, Total Profitability, Total Sale Orders.
</p>
</div>
</div>
<img src="./images/prg_db4.png" class="img-responsive border"
style="margin-top: -15px !important; margin-top: 1rem !important; margin-bottom: 4rem !important;">
<!-- endo of img -->
<!-- img -->
<div style="text-align: center" ;class="d-flex m-0"
style="border-bottom: 1px solid #e5e5e5 !important;">
<div class="mr-3">
<h3
style="font-size: 2rem !important; font-weight: 800 !important; color: #ffffff !important; background-color: #58a360 !important; padding: 1rem !important; width: 60px !important; height: 60px !important;">
02</h3>
</div>
<div>
<h3 class="text-center" style=" font-size: 1.7rem !important; font-weight: 600 !important;">
Task Analysis
</h3>
<p class="text-center"
style="color: #212529 !important; font-size: 1.3rem !important; font-weight: 300 !important;">
Task analysis from various projects.
</p>
</div>
</div>
<img src="./images/prg_db.png" class="img-responsive border"
style="margin-top: -15px !important; margin-top: 1rem !important; margin-bottom: 4rem !important;">
<div style="text-align: center" ;class="d-flex m-0"
style="border-bottom: 1px solid #e5e5e5 !important;">
<div class="mr-3">
<h3
style="font-size: 2rem !important; font-weight: 800 !important; color: #ffffff !important; background-color: #58a360 !important; padding: 1rem !important; width: 60px !important; height: 60px !important;">
03</h3>
</div>
<div>
<h3 class="text-center" style=" font-size: 1.7rem !important; font-weight: 600 !important;">
Employees Timesheet
</h3>
<p class="text-center"
style="color: #212529 !important; font-size: 1.3rem !important; font-weight: 300 !important;">
Display the Employees timesheet with Hours Spent.
</p>
</div>
</div>
<img src="./images/prg_db2.png" class="img-responsive border"
style="margin-top: -15px !important; margin-top: 1rem !important; margin-bottom: 4rem !important;">
<div style="text-align: center" ;class="d-flex m-0"
style="border-bottom: 1px solid #e5e5e5 !important;">
<div class="mr-3">
<h3
style="font-size: 2rem !important; font-weight: 800 !important; color: #ffffff !important; background-color: #58a360 !important; padding: 1rem !important; width: 60px !important; height: 60px !important;">
04</h3>
</div>
<div>
<h3 class="text-center" style=" font-size: 1.7rem !important; font-weight: 600 !important;">
Project Profitability
</h3>
<p class="text-center"
style="color: #212529 !important; font-size: 1.3rem !important; font-weight: 300 !important;">
Project Profitability Analysis by This Year, This month & Last Year.
</p>
</div>
</div>
<img src="./images/prg_db3.png" class="img-responsive border"
style="margin-top: -15px !important; margin-top: 1rem !important; margin-bottom: 4rem !important;">
<!-- endo of img -->
</div>
</div>
<!-- END OF SCREENSHOTS -->
<!-- SUGGESTED PRODUCTS -->
<div class="row">
<div class="col-lg-12 d-flex flex-column justify-content-center"
style="text-align: center; padding: 2.5rem 1rem !important;">
<h2 style="color: #212529 !important;">Suggested Products</h2>
<hr
style="border: 3px solid #AC1015 !important; background-color: #AC1015 !important; width: 80px !important; margin-bottom: 2rem !important;"/>
<div id="demo1" class="row carousel slide" data-ride="carousel">
<!-- The slideshow -->
<div class="carousel-inner">
<div class="carousel-item active" style="min-height:0px">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/14.0/customer_followup_community/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./images/modules/follow_image.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/14.0/dashboard_pos/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./images/modules/pos_image.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/14.0/product_approval_management/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./images/modules/approval_image.png">
</div>
</a>
</div>
</div>
<div class="carousel-item" style="min-height:0px">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/14.0/multiple_reference_per_product/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./images/modules/mulitple-ref_image.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/14.0/shopify_odoo_connector/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./images/modules/shopify_image.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/14.0/pos_order_types/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./images/modules/pos_order_image.png">
</div>
</a>
</div>
</div>
</div>
<!-- Left and right controls -->
<a class="carousel-control-prev" href="#demo1" data-slide="prev"
style="left:-25px;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="right:-25px;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 SUGGESTED PRODUCTS -->
<!-- OUR SERVICES -->
<section class="container" style="margin-top: 6rem !important;">
<div class="row">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center">
<h2 style="color: #212529 !important;">Our Services</h2>
<hr
style="border: 3px solid #AC1015 !important; background-color: #AC1015 !important; width: 80px !important; margin-bottom: 2rem !important;"/>
</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: #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>
</section>
<!-- END OF END OF OUR SERVICES -->
<!-- OUR INDUSTRIES -->
<section class="container" style="margin-top: 6rem !important;">
<div class="row">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center">
<h2 style="color: #212529 !important;">Our Industries</h2>
<hr
style="border: 3px solid #AC1015 !important; background-color: #AC1015 !important; width: 80px !important; margin-bottom: 2rem !important;"/>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 10px; 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: 10px; 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: 10px; 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: 10px; 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: 10px; 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: 10px; 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: 10px; 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: 10px; 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>
</section>
<!-- END OF END OF OUR INDUSTRIES -->
<!-- FOOTER -->
<!-- Footer Section -->
<section class="container" style="margin: 5rem auto 2rem;">
<div class="row" style="max-width:1540px;">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center">
<h2 style="color: #212529 !important;">Need Help?</h2>
<hr
style="border: 3px solid #AC1015 !important; background-color: #AC1015 !important; width: 80px !important; margin-bottom: 2rem !important;"/>
</div>
</div>
<!-- Contact Cards -->
<div class="row d-flex justify-content-center align-items-center"
style="max-width:1540px; margin: 0 auto 2rem auto;">
<div class="col-lg-12" style="padding: 0rem 3rem 2rem; border-radius: 10px; margin-right: 3rem; ">
<div class="row mt-4">
<div class="col-lg-6">
<a href="mailto:odoo@cybrosys.com" target="_blank" class="btn btn-block mb-2 deep_hover"
style="text-decoration: none; background-color: #4d4d4d; color: #FFF; border-radius: 4px;"><i
class="fa fa-envelope mr-2"></i>odoo@cybrosys.com</a>
</div>
<div class="col-lg-6">
<a href="https://api.whatsapp.com/send?phone=918606827707" target="_blank"
class="btn btn-block mb-2 deep_hover"
style="text-decoration: none; background-color: #25D366; color: #FFF; border-radius: 4px;"><i
class="fa fa-whatsapp mr-2"></i>WhatsApp</a>
</div>
</div>
</div>
</div>
<!-- End of Contact Cards -->
</section>
<!-- Footer -->
<section class="oe_container" style="padding: 2rem 3rem 1rem;">
<div class="row" style="max-width:1540px; margin: 0 auto; margin-right: 3rem; ">
<!-- Logo -->
<div class="col-lg-12 d-flex justify-content-center align-items-center" style="margin-top: 3rem;">
<img src="https://www.cybrosys.com/images/logo.png" width="200px" height="auto"/>
</div>
<!-- End of Logo -->
<div class="col-lg-12">
<hr
style="margin-top: 3rem;background: linear-gradient(90deg, rgba(2,0,36,0) 0%, rgba(229,229,229,1) 33%, rgba(229,229,229,1) 58%, rgba(0,212,255,0) 100%); height: 2px; border-style: none;">
<!-- End of Footer Section -->
</div>
</div>
</section>
<!-- END OF FOOTER -->
</div>
</div>

1013
project_dashboard_odoo/static/src/css/dashboard.css

File diff suppressed because it is too large

427
project_dashboard_odoo/static/src/css/lib/nv.d3.css

@ -0,0 +1,427 @@
.nvd3 .nv-axis {
pointer-events:none;
opacity: 1;
}
.nvd3 .nv-axis path {
fill: none;
stroke: #000;
stroke-opacity: .75;
shape-rendering: crispEdges;
}
.nvd3 .nv-axis path.domain {
stroke-opacity: .75;
}
.nvd3 .nv-axis.nv-x path.domain {
stroke-opacity: 0;
}
.nvd3 .nv-axis line {
fill: none;
stroke: #e5e5e5;
shape-rendering: crispEdges;
}
.nvd3 .nv-axis .zero line,
/*this selector may not be necessary*/ .nvd3 .nv-axis line.zero {
stroke-opacity: .75;
}
.nvd3 .nv-axis .nv-axisMaxMin text {
font-weight: bold;
}
.nvd3 .x .nv-axis .nv-axisMaxMin text,
.nvd3 .x2 .nv-axis .nv-axisMaxMin text,
.nvd3 .x3 .nv-axis .nv-axisMaxMin text {
text-anchor: middle
}
.nvd3 .nv-axis.nv-disabled {
opacity: 0;
}
/* scatter */
.nvd3 .nv-groups .nv-point.hover {
stroke-width: 20px;
stroke-opacity: .5;
}
.nvd3 .nv-scatter .nv-point.hover {
fill-opacity: 1;
}
.nv-noninteractive {
pointer-events: none;
}
.nv-distx, .nv-disty {
pointer-events: none;
}
.nvtooltip {
position: absolute;
background-color: rgba(255,255,255,1.0);
color: rgba(0,0,0,1.0);
padding: 1px;
border: 1px solid rgba(0,0,0,.2);
z-index: 10000;
display: block;
font-family: Arial;
font-size: 13px;
text-align: left;
pointer-events: none;
white-space: nowrap;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.nvtooltip {
background: rgba(255,255,255, 0.8);
border: 1px solid rgba(0,0,0,0.5);
border-radius: 4px;
}
/*Give tooltips that old fade in transition by
putting a "with-transitions" class on the container div.
*/
.nvtooltip.with-transitions, .with-transitions .nvtooltip {
transition: opacity 50ms linear;
-moz-transition: opacity 50ms linear;
-webkit-transition: opacity 50ms linear;
transition-delay: 200ms;
-moz-transition-delay: 200ms;
-webkit-transition-delay: 200ms;
}
.nvtooltip.x-nvtooltip,
.nvtooltip.y-nvtooltip {
padding: 8px;
}
.nvtooltip h3 {
margin: 0;
padding: 4px 14px;
line-height: 18px;
font-weight: normal;
background-color: rgba(247,247,247,0.75);
color: rgba(0,0,0,1.0);
text-align: center;
border-bottom: 1px solid #ebebeb;
-webkit-border-radius: 5px 5px 0 0;
-moz-border-radius: 5px 5px 0 0;
border-radius: 5px 5px 0 0;
}
.nvtooltip p {
margin: 0;
padding: 5px 14px;
text-align: center;
}
.nvtooltip span {
display: inline-block;
margin: 2px 0;
}
.nvtooltip table {
margin: 6px;
border-spacing:0;
}
.nvtooltip table td {
padding: 2px 9px 2px 0;
vertical-align: middle;
}
.nvtooltip table td.key {
font-weight: normal;
}
.nvtooltip table td.key.total {
font-weight: bold;
}
.nvtooltip table td.value {
text-align: right;
font-weight: bold;
}
.nvtooltip table tr.highlight td {
padding: 1px 9px 1px 0;
border-bottom-style: solid;
border-bottom-width: 1px;
border-top-style: solid;
border-top-width: 1px;
}
.nvtooltip table td.legend-color-guide div {
width: 8px;
height: 8px;
vertical-align: middle;
}
.nvtooltip table td.legend-color-guide div {
width: 12px;
height: 12px;
border: 1px solid #999;
}
.nvtooltip .footer {
padding: 3px;
text-align: center;
}
.nvtooltip-pending-removal {
pointer-events: none;
display: none;
}
/****
Interactive Layer
*/
.nvd3 .nv-interactiveGuideLine {
pointer-events:none;
}
.nvd3 line.nv-guideline {
stroke: #ccc;
}
.nvd3 .nv-bars rect {
fill-opacity: .75;
transition: fill-opacity 250ms linear;
-moz-transition: fill-opacity 250ms linear;
-webkit-transition: fill-opacity 250ms linear;
}
.nvd3 .nv-bars rect.hover {
fill-opacity: 1;
}
.nvd3 .nv-bars .hover rect {
fill: lightblue;
}
.nvd3 .nv-bars text {
fill: rgba(0,0,0,0);
}
.nvd3 .nv-bars .hover text {
fill: rgba(0,0,0,1);
}
.nvd3 .nv-multibar .nv-groups rect,
.nvd3 .nv-multibarHorizontal .nv-groups rect,
.nvd3 .nv-discretebar .nv-groups rect {
stroke-opacity: 0;
transition: fill-opacity 250ms linear;
-moz-transition: fill-opacity 250ms linear;
-webkit-transition: fill-opacity 250ms linear;
}
.nvd3 .nv-multibar .nv-groups rect:hover,
.nvd3 .nv-multibarHorizontal .nv-groups rect:hover,
.nvd3 .nv-candlestickBar .nv-ticks rect:hover,
.nvd3 .nv-discretebar .nv-groups rect:hover {
fill-opacity: 1;
}
.nvd3 .nv-discretebar .nv-groups text,
.nvd3 .nv-multibarHorizontal .nv-groups text {
font-weight: bold;
fill: rgba(0,0,0,1);
stroke: rgba(0,0,0,0);
}
.nvd3 .nv-groups path.nv-line {
fill: none;
}
.nvd3 .nv-groups path.nv-area {
stroke: none;
}
.nvd3.nv-line .nvd3.nv-scatter .nv-groups .nv-point {
fill-opacity: 0;
stroke-opacity: 0;
}
.nvd3.nv-scatter.nv-single-point .nv-groups .nv-point {
fill-opacity: .5 !important;
stroke-opacity: .5 !important;
}
.with-transitions .nvd3 .nv-groups .nv-point {
transition: stroke-width 250ms linear, stroke-opacity 250ms linear;
-moz-transition: stroke-width 250ms linear, stroke-opacity 250ms linear;
-webkit-transition: stroke-width 250ms linear, stroke-opacity 250ms linear;
}
.nvd3.nv-scatter .nv-groups .nv-point.hover,
.nvd3 .nv-groups .nv-point.hover {
stroke-width: 7px;
fill-opacity: .95 !important;
stroke-opacity: .95 !important;
}
.nvd3 .nv-point-paths path {
stroke: #aaa;
stroke-opacity: 0;
fill: #eee;
fill-opacity: 0;
}
.nvd3 .nv-indexLine {
cursor: ew-resize;
}
/********************
* SVG CSS
*/
/********************
Default CSS for an svg element nvd3 used
*/
svg.nvd3-svg {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-ms-user-select: none;
-moz-user-select: none;
user-select: none;
display: block;
width:100%;
height:100%;
margin-left: -100px;
}
/********************
Box shadow and border radius styling
*/
.nvtooltip.with-3d-shadow, .with-3d-shadow .nvtooltip {
-moz-box-shadow: 0 5px 10px rgba(0,0,0,.2);
-webkit-box-shadow: 0 5px 10px rgba(0,0,0,.2);
box-shadow: 0 5px 10px rgba(0,0,0,.2);
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
}
.nvd3 text {
font: normal 12px Arial;
}
.nvd3 .title {
font: bold 14px Arial;
}
.nvd3 .nv-background {
fill: white;
fill-opacity: 0;
}
.nvd3.nv-noData {
font-size: 18px;
font-weight: bold;
}
/**********
* Brush
*/
.nv-brush .extent {
fill-opacity: .125;
shape-rendering: crispEdges;
}
.nv-brush .resize path {
fill: #eee;
stroke: #666;
}
/**********
* Legend
*/
.nvd3 .nv-legend .nv-series {
cursor: pointer;
}
.nvd3 .nv-legend .nv-disabled circle {
fill-opacity: 0;
}
/* focus */
.nvd3 .nv-brush .extent {
fill-opacity: 0 !important;
}
.nvd3 .nv-brushBackground rect {
stroke: #000;
stroke-width: .4;
fill: #fff;
fill-opacity: .7;
}
.nvd3.nv-pie path {
stroke-opacity: 0;
transition: fill-opacity 250ms linear, stroke-width 250ms linear, stroke-opacity 250ms linear;
-moz-transition: fill-opacity 250ms linear, stroke-width 250ms linear, stroke-opacity 250ms linear;
-webkit-transition: fill-opacity 250ms linear, stroke-width 250ms linear, stroke-opacity 250ms linear;
}
.nvd3.nv-pie .nv-pie-title {
font-size: 24px;
fill: rgba(19, 196, 249, 0.59);
}
.nvd3.nv-pie .nv-slice text {
stroke: #000;
stroke-width: 0;
}
.nvd3.nv-pie path {
stroke: #fff;
stroke-width: 1px;
stroke-opacity: 1;
}
.nvd3.nv-pie path {
fill-opacity: .7;
}
.nvd3.nv-pie .hover path {
fill-opacity: 1;
}
.nvd3.nv-pie .nv-label {
pointer-events: none;
}
.nvd3.nv-pie .nv-label rect {
fill-opacity: 0;
stroke-opacity: 0;
}

568
project_dashboard_odoo/static/src/js/dashboard.js

@ -0,0 +1,568 @@
odoo.define('pj_dashboard.Dashboard', function (require) {
"use strict";
var AbstractAction = require('web.AbstractAction');
var core = require('web.core');
var QWeb = core.qweb;
var ajax = require('web.ajax');
var rpc = require('web.rpc');
var _t = core._t;
var session = require('web.session');
var web_client = require('web.web_client');
var abstractView = require('web.AbstractView');
var PjDashboard = AbstractAction.extend({
template:'PjDashboard',
cssLibs: [
'/project_dashboard_odoo/static/src/css/lib/nv.d3.css'
],
jsLibs: [
'/project_dashboard_odoo/static/src/js/lib/d3.min.js'
],
events: {
'click .tot_projects':'tot_projects',
'click .tot_tasks':'tot_tasks',
'click .tot_profitability':'tot_profitability',
'click .hr_recorded':'hr_recorded',
'click .tot_sale':'tot_sale',
'click .tot_emp':'tot_emp',
'click #income_this_year': 'onclick_income_this_year',
'click #income_last_year': 'onclick_income_last_year',
'click #income_this_month': 'onclick_income_this_month',
},
init: function(parent, context) {
this._super(parent, context);
this.dashboards_templates = ['DashboardProject','DashboardChart'];
this.today_sale = [];
},
willStart: function() {
var self = this;
return $.when(ajax.loadLibs(this), this._super()).then(function() {
return self.fetch_data();
});
},
start: function() {
var self = this;
this.set("title", 'Dashboard');
return this._super().then(function() {
self.render_dashboards();
self.render_graphs();
});
},
render_dashboards: function(){
var self = this;
_.each(this.dashboards_templates, function(template) {
self.$('.o_pj_dashboard').append(QWeb.render(template, {widget: self}));
});
},
render_graphs: function(){
var self = this;
self.render_project_task();
self.render_top_employees_graph();
},
on_reverse_breadcrumb: function() {
var self = this;
web_client.do_push_state({});
this.fetch_data().then(function() {
self.$('.o_pj_dashboard').empty();
self.render_dashboards();
self.render_graphs();
});
},
//
onclick_toggle_two: function(ev) {
this.onclick_income_this_year(ev);
this.onclick_income_last_year(ev);
this.onclick_income_this_month(ev);
},
render_project_task:function(){
var self = this;
var w = 400;
var h = 400;
var r = h/2;
var elem = this.$('.emp_graph');
var colors = ['#70cac1', '#659d4e', '#208cc2', '#4d6cb1', '#584999', '#8e559e', '#cf3650', '#f65337', '#fe7139',
'#ffa433', '#ffc25b', '#f8e54b'];
var color = d3.scale.ordinal().range(colors);
rpc.query({
model: "project.project",
method: "get_project_task",
}).then(function (data) {
var segColor = {};
var vis = d3.select(elem[0]).append("svg:svg").data([data]).attr("width", w).attr("height", h).append("svg:g").attr("transform", "translate(" + r + "," + r + ")");
var pie = d3.layout.pie().value(function(d){return d.value;});
var arc = d3.svg.arc().outerRadius(r);
var arcs = vis.selectAll("g.slice").data(pie).enter().append("svg:g").attr("class", "slice");
arcs.append("svg:path")
.attr("fill", function(d, i){
return color(i);
})
.attr("d", function (d) {
return arc(d);
});
var legend = d3.select(elem[0]).append("table").attr('class','legend');
var tr = legend.append("tbody").selectAll("tr").data(data).enter().append("tr");
tr.append("td").append("svg").attr("width", '16').attr("height", '16').append("rect")
.attr("width", '16').attr("height", '16')
.attr("fill",function(d, i){ return color(i) });
tr.append("td").text(function(d){ return d.label;});
tr.append("td").attr("class",'legendFreq')
.text(function(d){ return d.value;});
});
},
//project
tot_projects: function(e) {
var self = this;
e.stopPropagation();
e.preventDefault();
var options = {
on_reverse_breadcrumb: this.on_reverse_breadcrumb,
};
this.do_action({
name: _t("Projects"),
type: 'ir.actions.act_window',
res_model: 'project.project',
view_mode: 'kanban,form',
views: [[false, 'list'],[false, 'form']],
target: 'current'
}, options)
},
//task
tot_tasks: function(e) {
var self = this;
e.stopPropagation();
e.preventDefault();
var options = {
on_reverse_breadcrumb: this.on_reverse_breadcrumb,
};
this.do_action({
name: _t("Tasks"),
type: 'ir.actions.act_window',
res_model: 'project.task',
view_mode: 'tree,kanban,form',
views: [[false, 'list'],[false, 'form']],
target: 'current'
}, options)
},
//task
tot_profitability: function(e) {
var self = this;
e.stopPropagation();
e.preventDefault();
var options = {
on_reverse_breadcrumb: this.on_reverse_breadcrumb,
};
this.do_action({
name: _t("Profitability"),
type: 'ir.actions.act_window',
res_model: 'project.profitability.report',
view_mode: 'pivot',
views: [[false, 'pivot'],[false, 'graph']],
target: 'current'
}, options)
},
//hr timesheets
hr_recorded: function(e) {
var self = this;
e.stopPropagation();
e.preventDefault();
var options = {
on_reverse_breadcrumb: this.on_reverse_breadcrumb,
};
this.do_action({
name: _t("Timesheets"),
type: 'ir.actions.act_window',
res_model: 'account.analytic.line',
view_mode: 'tree,form',
views: [[false, 'list']],
// domain: [['project_id', '!=',self.project_id ]],
target: 'current'
}, options)
},
//total saleorder
tot_sale: function(e) {
var self = this;
e.stopPropagation();
e.preventDefault();
var options = {
on_reverse_breadcrumb: this.on_reverse_breadcrumb,
};
this.do_action({
name: _t("Sale Order"),
type: 'ir.actions.act_window',
res_model: 'sale.order',
view_mode: 'tree',
views: [[false, 'list']],
domain: [['analytic_account_id', '!=',self.analytic_account_id ]],
target: 'current'
}, options)
},
//total emp
tot_emp: function(e) {
var self = this;
e.stopPropagation();
e.preventDefault();
var options = {
on_reverse_breadcrumb: this.on_reverse_breadcrumb,
};
this.do_action({
name: _t("Employees"),
type: 'ir.actions.act_window',
res_model: 'hr.employee',
view_mode: 'tree,form',
views: [[false, 'list'],[false, 'form']],
// domain: [['project_id', '!=',self.project_id ]],
target: 'current'
}, options)
},
render_top_employees_graph:function(){
var self = this
var ctx = self.$(".top_selling_employees");
rpc.query({
model: "project.project",
method: "get_top_timesheet_employees",
}).then(function (arrays) {
var data = {
labels: arrays[1],
datasets: [
{
label: "Hours Spent",
data: arrays[0],
backgroundColor: [
"rgba(190, 27, 75,1)",
"rgba(31, 241, 91,1)",
"rgba(103, 23, 252,1)",
"rgba(158, 106, 198,1)",
"rgba(250, 217, 105,1)",
"rgba(255, 98, 31,1)",
"rgba(255, 31, 188,1)",
"rgba(75, 192, 192,1)",
"rgba(153, 102, 255,1)",
"rgba(10,20,30,1)"
],
borderColor: [
"rgba(190, 27, 75, 0.2)",
"rgba(190, 223, 122, 0.2)",
"rgba(103, 23, 252, 0.2)",
"rgba(158, 106, 198, 0.2)",
"rgba(250, 217, 105, 0.2)",
"rgba(255, 98, 31, 0.2)",
"rgba(255, 31, 188, 0.2)",
"rgba(75, 192, 192, 0.2)",
"rgba(153, 102, 255, 0.2)",
"rgba(10,20,30,0.3)"
],
borderWidth: 1
},
]
};
//options
var options = {
responsive: true,
title: {
display: true,
position: "top",
text: " Time by Employees",
fontSize: 18,
fontColor: "#111"
},
legend: {
display: true,
position: "bottom",
labels: {
fontColor: "#333",
fontSize: 16
}
},
scales: {
yAxes: [{
ticks: {
min: 0
}
}]
}
};
//create Chart class object
var chart = new Chart(ctx, {
type: "horizontalBar",
data: data,
options: options
});
});
},
onclick_income_last_year: function(ev) {
ev.preventDefault();
var selected = $('.btn.btn-tool.income');
var data = $(selected[0]).data();
var posted = 1;
rpc.query({
model: 'project.project',
method: 'get_income_last_year',
args: [],
})
.then(function(result) {
$('#net_profit_current_months').hide();
$('#net_profit_last_year').show();
$('#net_profit_this_year').hide();
var ctx = document.getElementById("canvas").getContext('2d');
// Define the data
var profit = result.profit;
var labels = result.month; // Add labels to array
// End Defining data
// End Defining data
if (window.myCharts != undefined)
window.myCharts.destroy();
window.myCharts = new Chart(ctx, {
//var myChart = new Chart(ctx, {
type: 'bar',
data: {
labels: labels,
datasets: [
{
label: 'Profitability', // Name the series
data: profit, // Specify the data values array
backgroundColor: '#0bd465',
borderColor: '#0bd465',
borderWidth: 1, // Specify bar border width
type: 'line', // Set this data to a line chart
fill: false
}
]
},
options: {
responsive: true, // Instruct chart js to respond nicely.
maintainAspectRatio: false, // Add to prevent default behaviour of full-width/height
}
});
})
},
onclick_income_this_year: function(ev) {
ev.preventDefault();
var selected = $('.btn.btn-tool.income');
var data = $(selected[0]).data();
var posted = false;
rpc.query({
model: 'project.project',
method: 'get_income_this_year',
args: [],
})
.then(function(result) {
$('#net_profit_current_months').hide();
$('#net_profit_last_year').hide();
$('#net_profit_this_year').show();
var ctx = document.getElementById("canvas").getContext('2d');
// Define the data
var income = result.income; // Add data values to array
// var expense = result.expense;
var profit = result.profit;
var labels = result.month; // Add labels to array
if (window.myCharts != undefined)
window.myCharts.destroy();
window.myCharts = new Chart(ctx, {
//var myChart = new Chart(ctx, {
type: 'bar',
data: {
labels: labels,
datasets: [
{
label: 'Profitability', // Name the series
data: profit, // Specify the data values array
backgroundColor: '#0bd465',
borderColor: '#0bd465',
borderWidth: 1, // Specify bar border width
type: 'line', // Set this data to a line chart
fill: false
}
]
},
options: {
responsive: true, // Instruct chart js to respond nicely.
maintainAspectRatio: false, // Add to prevent default behaviour of full-width/height
}
});
})
},
onclick_income_this_month: function(ev) {
ev.preventDefault();
var selected = $('.btn.btn-tool.income');
var data = $(selected[0]).data();
var posted = 1;
rpc.query({
model: 'project.project',
method: 'get_income_this_month',
args: [],
})
.then(function(result) {
var ctx = document.getElementById("canvas").getContext('2d');
// Define the data
var profit = result.profit;
var labels = result.date; // Add labels to array
// End Defining data
// End Defining data
if (window.myCharts != undefined)
window.myCharts.destroy();
window.myCharts = new Chart(ctx, {
//var myChart = new Chart(ctx, {
type: 'bar',
data: {
labels: labels,
datasets: [
{
label: 'Profitability', // Name the series
data: profit, // Specify the data values array
backgroundColor: '#0bd465',
borderColor: '#0bd465',
borderWidth: 1, // Specify bar border width
type: 'line', // Set this data to a line chart
fill: false
}
]
},
options: {
responsive: true, // Instruct chart js to respond nicely.
maintainAspectRatio: false, // Add to prevent default behaviour of full-width/height
}
});
})
},
fetch_data: function() {
var self = this;
var def1 = this._rpc({
model: 'project.project',
method: 'get_tiles_data'
}).then(function(result)
{
self.total_projects = result['total_projects'],
self.total_tasks = result['total_tasks'],
self.total_hours = result['total_hours'],
self.total_profitability = result['total_profitability'],
self.total_employees = result['total_employees'],
self.total_sale_orders = result['total_sale_orders']
});
var def2 = self._rpc({
model: "project.project",
method: "get_details",
})
.then(function (res) {
self.invoiced = res['invoiced'];
self.to_invoice = res['to_invoice'];
self.time_cost = res['time_cost'];
self.expen_cost = res['expen_cost'];
self.payment_details = res['payment_details'];
});
var def3 = self._rpc({
model: "project.project",
method: "get_hours_data",
})
.then(function (res) {
self.hour_recorded = res['hour_recorded'];
self.hour_recorde = res['hour_recorde'];
self.billable_fix = res['billable_fix'];
self.non_billable = res['non_billable'];
self.total_hr = res['total_hr'];
});
var def4 = self._rpc({
model: "project.project",
method: "get_task_data",
})
.then(function (res) {
self.task_data = res['project'];
});
return $.when(def1,def2,def3,def4);
},
});
core.action_registry.add('project_dashboard', PjDashboard);
return PjDashboard;
});

7828
project_dashboard_odoo/static/src/js/lib/d3.min.js

File diff suppressed because it is too large

446
project_dashboard_odoo/static/src/xml/dashboard.xml

@ -0,0 +1,446 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates id="template" xml:space="preserve">
<t t-name="PjDashboard">
<div class="oh_dashboards" style="margin-top: 20px;">
<div class="container-fluid o_pj_dashboard">
</div>
</div>
</t>
<t t-name="DashboardProject">
<div class="row main-section" style="margin-left: 170px;">
<div class="col-md-4 col-sm-6 tot_projects oh-payslip" >
<div class="oh-card" style="width: 410px;">
<div class="oh-card-body">
<div class="stat-widget-one">
<div class="stat-icon" style="background:#e08048;"><i class="fa fa-puzzle-piece"/></div>
<div class="stat-content">
<div class="stat-head">Total Project</div>
<div class="stat_count"><t t-esc="widget.total_projects"/></div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-4 col-sm-6 tot_emp oh-payslip">
<div class="oh-card" style="width: 410px;">
<div class="oh-card-body">
<div class="stat-widget-one">
<div class="stat-icon" style="background:#645bd0"><i class="fa fa-user"/></div>
<div class="stat-content">
<div class="stat-head">Total Employees</div>
<div class="stat_count"><t t-esc="widget.total_employees"/></div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-4 col-sm-6 tot_tasks oh-payslip">
<div class="oh-card" style="width: 410px;">
<div class="oh-card-body">
<div class="stat-widget-one">
<div class="stat-icon" style="background:#85d05b"><i class="fa fa-tasks"/></div>
<div class="stat-content">
<div class="stat-head">Total tasks</div>
<div class="stat_count"><t t-esc="widget.total_tasks"/></div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-4 col-sm-6 hr_recorded oh-payslip">
<div class="oh-card" style="width: 410px;">
<div class="oh-card-body">
<div class="stat-widget-one">
<div class="stat-icon" style="background:#d05bb8"><i class="fa fa-clock-o"/></div>
<div class="stat-content">
<div class="stat-head">Hours Recorded</div>
<div class="stat_count"><t t-esc="widget.total_hours"/></div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-4 col-sm-6 tot_profitability oh-payslip">
<div class="oh-card" style="width: 410px;">
<div class="oh-card-body">
<div class="stat-widget-one">
<div class="stat-icon" style="background:#d0c35b"><i class="fa fa-dollar"/></div>
<div class="stat-content">
<div class="stat-head">Total Profitability</div>
<div class="stat_count"><t t-esc="widget.total_profitability"/></div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-4 col-sm-6 tot_sale oh-payslip">
<div class="oh-card" style="width: 410px;">
<div class="oh-card-body">
<div class="stat-widget-one">
<div class="stat-icon" style="background:#5b8ed0"><i class="fa fa-ticket"/></div>
<div class="stat-content">
<div class="stat-head">Total Sale Orders</div>
<div class="stat_count"><t t-esc="widget.total_sale_orders"/></div>
</div>
</div>
</div>
</div>
</div>
</div>
</t>
<t t-name="DashboardChart">
<div class="col-xs-12 col-sm-12 col-lg-12 col-md-12">
<div class="row main-section">
<div class="col-sm-7 col-lg-7">
<div class="graph_view" style="padding:0">
<div class="text-color hr-chart-1">
<div class="oh-card-body pb-0">
<h4 class="mb-0"/>
<p class="stat-head" style="padding : 0px;">ProjectTask Analysis</p>
</div>
<div class="emp_graph"/>
</div>
</div>
</div>
<div class="col-md-4 col-lg-4" style="top: 82px;right: -100px;">
<div class="hr_notification" style="background: #fff;transition: transform 0.2s ease, box-shadow 0.2s ease;will-change: transform, box-shadow;box-shadow: 0 10px 40px 0 rgba(62,57,107,0.07), 0 2px 9px 0 rgba(62,57,107,0.06);
height: 316px;overflow-y: auto;margin-bottom: 15px;">
<div class="hr_notification_head"
style="font-size: 17px;text-align: center;padding: 12px 0;color: #fff;font-weight: 300;background: #218a45a3;margin-bottom: 9px;">
ProjectTask Details
</div>
<div class="col-sm-12 col-lg-12" style="padding:0;">
<div class="text-color">
<div class="media">
<div class="media-body">
<table class="table table-sm">
<thead>
<tr>
<th rowspan="14">Project Name</th>
<th rowspan="14">Task Name</th>
</tr>
</thead>
<tbody>
<t t-foreach="widget.task_data" t-as="proj">
<tr>
<td>
<t t-esc="proj[1]"/>
</td>
<td>
<t t-esc="proj[0]"/>
</td>
</tr>
</t>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-sm-12 col-lg-12 col-md-12">
<div class="row main-section">
<div class="col-sm-7 col-lg-7">
<div class="selling_product_graph_view">
<div class="oh-card text-color">
<div class="oh-card-body pb-0">
<h4 class="mb-0">
</h4>
<p class="stat-head" style="padding : 0px;">Timesheet Analysis</p>
</div>
<canvas class="top_selling_employees" width="200" height="120"/>
</div>
</div>
</div>
<div class="col-md-4 col-lg-4" style="top: 149px;right: -100px;">
<div class="hr_notification" style="background: #fff;transition: transform 0.2s ease, box-shadow 0.2s ease;will-change: transform, box-shadow;box-shadow: 0 10px 40px 0 rgba(62,57,107,0.07), 0 2px 9px 0 rgba(62,57,107,0.06);
height: 316px;overflow-y: auto;margin-bottom: 15px;">
<div class="hr_notification_head"
style="font-size: 17px;text-align: center;padding: 12px 0;color: #fff;font-weight: 300;background: #218a45a3;margin-bottom: 9px;">
Hours Recorded
</div>
<div class="col-sm-12 col-lg-12" style="padding:0;">
<div class="text-color">
<div class="">
<div class="media">
<div class="media-body">
<table class="table table-sm">
<thead>
<tr>
<th rowspan="14">Billed on Timesheet</th>
</tr>
</thead>
<tbody>
<t t-foreach="widget.hour_recorde" t-as="hour_recorde">
<tr>
<td>
<h2 class="text-color display-6" style="font-size: 15px;margin-left: 400px;margin-top: -30px;">
<t t-esc="hour_recorde"/>
</h2>
</td>
</tr>
</t>
</tbody>
</table>
<table class="table table-sm">
<thead>
<tr>
<th rowspan="14">Billed at a Fixed price</th>
</tr>
</thead>
<tbody>
<t t-foreach="widget.billable_fix" t-as="billable_fix">
<tr>
<td>
<h2 class="text-color display-6" style="font-size: 15px;margin-left: 400px;margin-top: -30px;">
<t t-esc="billable_fix"/>
</h2>
</td>
</tr>
</t>
</tbody>
</table>
<table class="table table-sm">
<thead>
<tr>
<th rowspan="14">No task found</th>
</tr>
</thead>
<tbody>
<t t-foreach="widget.hour_recorded" t-as="hour_recorded">
<tr>
<td>
<h2 class="text-color display-6" style="font-size: 15px;margin-left: 400px;margin-top: -30px;">
<t t-esc="hour_recorded"/>
</h2>
</td>
</tr>
</t>
</tbody>
</table>
<table class="table table-sm">
<thead>
<tr>
<th rowspan="14">Non Billable Tasks</th>
</tr>
</thead>
<tbody>
<t t-foreach="widget.non_billable" t-as="non_billable">
<tr>
<td>
<h2 class="text-color display-6" style="font-size: 15px;margin-left: 400px;margin-top: -30px;">
<t t-esc="non_billable"/>
</h2>
</td>
</tr>
</t>
</tbody>
</table>
<table class="table table-sm">
<thead>
<tr>
<th rowspan="14" style="padding-left: 24.3rem;">Total:</th>
</tr>
</thead>
<tbody>
<t t-foreach="widget.total_hr" t-as="total_hr">
<tr>
<td>
<h2 class="text-color display-6" style="font-size: 15px;margin-left: 400px;margin-top: -30px;">
<t t-esc="total_hr"/>
</h2>
</td>
</tr>
</t>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-sm-12 col-lg-12 col-md-12">
<div class="row main-section">
<div class="col-sm-7 col-lg-7">
<div class="row" style="margin:0px">
<div class="col-md-12" id="col-graph">
<div class="card">
<div class="card-header">
<div class="card-title">
<b>
<h3 class="custom-h3">Profitability</h3>
</b>
</div>
<div class="card-tools">
<select id="income_expense_values">
<option id="income_this_year" value="income_this_year">This Year</option>
<option id="income_this_month" value="income_this_month">This Month</option>
<div role="separator" class="dropdown-divider" />
<option id="income_last_year" value="income_this_year">Last Year</option>
</select>
</div>
</div>
<div class="card-body mt-3" id="in_ex_body_hide">
<div class="row">
<!-- <div class="col-md-12">-->
<p id="myelement1"> </p>
<div class="chart">
<!-- <canvas id="canvas"> </canvas>-->
<canvas id="canvas" width="300" height="200"> </canvas>
</div>
<!-- </div>-->
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-4 col-lg-4" style="top: 155px;right: -100px;">
<div class="hr_notification" style="background: #fff;transition: transform 0.2s ease, box-shadow 0.2s ease;will-change: transform, box-shadow;box-shadow: 0 10px 40px 0 rgba(62,57,107,0.07), 0 2px 9px 0 rgba(62,57,107,0.06);
height: 316px;overflow-y: auto;margin-bottom: 15px;">
<div class="hr_notification_head"
style="font-size: 17px;text-align: center;padding: 12px 0;color: #fff;font-weight: 300;background:#218a45a3;;margin-bottom: 9px;">
Profitability
</div>
<div class="col-sm-12 col-lg-12" style="padding:0;">
<div class="text-color">
<div class="">
<div class="media">
<div class="media-body">
<table class="table table-sm">
<thead>
<tr>
<th rowspan="14">Invoiced</th>
</tr>
</thead>
<tbody>
<t t-foreach="widget.invoiced" t-as="invoiced">
<tr>
<td>
<h2 class="text-color display-6" style="font-size: 15px;margin-left: 400px;margin-top: -30px;">
<t t-esc="invoiced"/>
</h2>
</td>
</tr>
</t>
</tbody>
</table>
<table class="table table-sm">
<thead>
<tr>
<th rowspan="14">To Invoice</th>
</tr>
</thead>
<tbody>
<t t-foreach="widget.to_invoice" t-as="to_invoice">
<tr>
<td>
<h2 class="text-color display-6" style="font-size: 15px;margin-left: 400px;margin-top: -30px;">
<t t-esc="to_invoice"/>
</h2>
</td>
</tr>
</t>
</tbody>
</table>
<table class="table table-sm">
<thead>
<tr>
<th rowspan="14">Timesheet costs</th>
</tr>
</thead>
<tbody>
<t t-foreach="widget.time_cost" t-as="time_cost">
<tr>
<td>
<h2 class="text-color display-6" style="font-size: 15px;margin-left: 400px;margin-top: -30px;">
<t t-esc="time_cost"/>
</h2>
</td>
</tr>
</t>
</tbody>
</table>
<table class="table table-sm">
<thead>
<tr>
<th rowspan="14">Other costs</th>
</tr>
</thead>
<tbody>
<t t-foreach="widget.expen_cost" t-as="expen_cost">
<tr>
<td>
<h2 class="text-color display-6" style="font-size: 15px;margin-left: 400px;margin-top: -30px;">
<t t-esc="expen_cost"/>
</h2>
</td>
</tr>
</t>
</tbody>
</table>
<table class="table table-sm">
<thead>
<tr>
<th rowspan="14" style="padding-left: 24.3rem;">Total:</th>
</tr>
</thead>
<tbody>
<t t-foreach="widget.payment_details" t-as="payment_method">
<tr>
<td>
<h2 class="text-color display-6" style="font-size: 15px;margin-left: 400px;margin-top: -30px;">
<t t-esc="payment_method"/>
</h2>
</td>
</tr>
</t>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</t>
</templates>

28
project_dashboard_odoo/views/dashboard_views.xml

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="project_action_dashboard" model="ir.actions.client">
<field name="name">Dashboard</field>
<field name="tag">project_dashboard</field>
</record>
<menuitem id="menu_project_dashboard"
name="Dashboard"
action="project_action_dashboard"
parent="project.menu_main_pm"
sequence="1"/>
<template id="assets_dashboard" name="Hr Dashboard assets" inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<script type="text/javascript" src="/project_dashboard_odoo/static/src/js/dashboard.js"/>
<link rel="stylesheet" href="/project_dashboard_odoo/static/src/css/dashboard.css"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.bundle.js"> </script>
<link rel="stylesheet" href="/project_dashboard_odoo/static/src/css/lib/nv.d3.css"/>
<script type="text/javascript" src="/project_dashboard_odoo/static/src/js/lib/d3.min.js"/>
</xpath>
</template>
</data>
</odoo>
Loading…
Cancel
Save