@ -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> |