@ -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>`__ |
||||
|
|
@ -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 |
@ -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, |
||||
|
} |
@ -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 |
@ -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 |
@ -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 |
||||
|
} |
After Width: | Height: | Size: 310 B |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 576 B |
After Width: | Height: | Size: 733 B |
After Width: | Height: | Size: 911 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 673 B |
After Width: | Height: | Size: 878 B |
After Width: | Height: | Size: 653 B |
After Width: | Height: | Size: 905 B |
After Width: | Height: | Size: 839 B |
After Width: | Height: | Size: 427 B |
After Width: | Height: | Size: 627 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 988 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 46 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 1.3 MiB |
After Width: | Height: | Size: 207 KiB |
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 51 KiB |
After Width: | Height: | Size: 58 KiB |
After Width: | Height: | Size: 53 KiB |
After Width: | Height: | Size: 52 KiB |
After Width: | Height: | Size: 58 KiB |
After Width: | Height: | Size: 54 KiB |
After Width: | Height: | Size: 38 KiB |
After Width: | Height: | Size: 36 KiB |
After Width: | Height: | Size: 32 KiB |
After Width: | Height: | Size: 80 KiB |
After Width: | Height: | Size: 76 KiB |
After Width: | Height: | Size: 106 KiB |
After Width: | Height: | Size: 67 KiB |
After Width: | Height: | Size: 79 KiB |
After Width: | Height: | Size: 80 KiB |
@ -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 & 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> |
@ -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; |
||||
|
} |
@ -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; |
||||
|
|
||||
|
}); |
||||
|
|
@ -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> |
||||
|
|
||||
|
|
@ -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> |