@ -0,0 +1,47 @@ |
|||||
|
.. image:: https://img.shields.io/badge/license-LGPL--3-green.svg |
||||
|
:target: https://www.gnu.org/licenses/lgpl-3.0-standalone.html |
||||
|
:alt: License: LGPL-3 |
||||
|
|
||||
|
Inventory Dashboard Odoo 17 |
||||
|
=========================== |
||||
|
Dashboard for Inventory module. |
||||
|
|
||||
|
Configuration |
||||
|
============= |
||||
|
No additional configurations needed. |
||||
|
|
||||
|
Company |
||||
|
------- |
||||
|
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__ |
||||
|
|
||||
|
License |
||||
|
------- |
||||
|
Lesser General Public License, Version 3 (LGPL v3) |
||||
|
(https://www.gnu.org/licenses/lgpl-3.0-standalone.html) |
||||
|
|
||||
|
Credits |
||||
|
------- |
||||
|
* Developer : (V17) Aysha Shalin |
||||
|
Contact: odoo@cybrosys.com |
||||
|
|
||||
|
Contacts |
||||
|
-------- |
||||
|
* Mail Contact : odoo@cybrosys.com |
||||
|
* Website : https://cybrosys.com |
||||
|
|
||||
|
Bug Tracker |
||||
|
----------- |
||||
|
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. |
||||
|
|
||||
|
Maintainer |
||||
|
========== |
||||
|
.. image:: https://cybrosys.com/images/logo.png |
||||
|
:target: https://cybrosys.com |
||||
|
|
||||
|
This module is maintained by Cybrosys Technologies. |
||||
|
|
||||
|
For support and more information, please visit `Our Website <https://cybrosys.com/>`__ |
||||
|
|
||||
|
Further information |
||||
|
=================== |
||||
|
HTML Description: `<static/description/index.html>`__ |
@ -0,0 +1,22 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Aysha Shalin (odoo@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,53 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################### |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Aysha Shalin (odoo@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': 'Inventory Dashboard Odoo 17', |
||||
|
'version': '17.0.1.0.0', |
||||
|
'category': 'Warehouse', |
||||
|
'summary': 'Detailed dashboard view for Inventory module.', |
||||
|
'description': """This module presents a detailed dashboard view for the |
||||
|
Inventory module, delivering a compr ehensive and concise overview that |
||||
|
serves as a valuable tool for both inventory users and administrators.""", |
||||
|
'author': 'Cybrosys Techno Solutions', |
||||
|
'company': 'Cybrosys Techno Solutions', |
||||
|
'maintainer': 'Cybrosys Techno Solutions', |
||||
|
'website': "https://www.cybrosys.com", |
||||
|
'depends': ['stock', 'base'], |
||||
|
'data': [ |
||||
|
'views/res_config_settings_views.xml', |
||||
|
'views/dashboard_menu.xml', |
||||
|
], |
||||
|
'assets': { |
||||
|
'web.assets_backend': [ |
||||
|
'https://fonts.googleapis.com/css2?family=Poppins:wght@400;600&display=swap', |
||||
|
'inventory_stock_dashboard_odoo/static/src/css/dashboard.css', |
||||
|
'inventory_stock_dashboard_odoo/static/src/js/dashboard.js', |
||||
|
'inventory_stock_dashboard_odoo/static/src/xml/inventory_dashboard_template.xml', |
||||
|
'https://cdn.jsdelivr.net/npm/chart.js', |
||||
|
], |
||||
|
}, |
||||
|
'images': ['static/description/banner.png'], |
||||
|
'license': 'LGPL-3', |
||||
|
'installable': True, |
||||
|
'auto_install': False, |
||||
|
'application': False, |
||||
|
} |
@ -0,0 +1,6 @@ |
|||||
|
## Module <inventory_stock_dashboard_odoo> |
||||
|
|
||||
|
#### 29.01.2024 |
||||
|
#### Version 17.0.1.0.0 |
||||
|
##### ADD |
||||
|
- Initial commit for Inventory Dashboard Odoo 17 |
@ -0,0 +1,26 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################### |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Aysha Shalin (odoo@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 res_config_settings |
||||
|
from . import stock_move |
||||
|
from . import stock_move_line |
||||
|
from . import stock_picking |
||||
|
from . import stock_quant |
@ -0,0 +1,56 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################### |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Aysha Shalin (odoo@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 fields, models |
||||
|
|
||||
|
|
||||
|
class ResConfigSettings(models.TransientModel): |
||||
|
""" Inheriting res.config.settings model for adding custom fields in |
||||
|
settings.""" |
||||
|
_inherit = "res.config.settings" |
||||
|
|
||||
|
out_of_stock = fields.Boolean( |
||||
|
string='Out of stock', |
||||
|
config_parameter='inventory_stock_dashboard_odoo.out_of_stock', |
||||
|
help="Enable if out of stock") |
||||
|
out_of_stock_quantity = fields.Integer( |
||||
|
string='Quantity', |
||||
|
config_parameter='inventory_stock_dashboard_odoo.out_of_stock_quantity', |
||||
|
required=True, |
||||
|
help='Set the minimum quantity for considering a product as out of' |
||||
|
'stock.') |
||||
|
dead_stock_bol = fields.Boolean( |
||||
|
string='Enable dead stock', |
||||
|
config_parameter='inventory_stock_dashboard_odoo.dead_stock_bol', |
||||
|
help='Enable if you want to consider dead stock.') |
||||
|
dead_stock = fields.Integer( |
||||
|
string='Dead stock', |
||||
|
config_parameter='inventory_stock_dashboard_odoo.dead_stock', |
||||
|
required=True, |
||||
|
help='Set the threshold quantity for considering a product as dead ' |
||||
|
'stock.') |
||||
|
dead_stock_type = fields.Selection( |
||||
|
[('day', 'Day'), ('week', 'Week'), ('month', 'Month')], |
||||
|
string='Type', default='day', |
||||
|
config_parameter='inventory_stock_dashboard_odoo.dead_stock_type', |
||||
|
required=True, |
||||
|
help='Select the time period to determine dead stock based on product' |
||||
|
'sales.') |
@ -0,0 +1,277 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################### |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Aysha Shalin (odoo@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 api, models |
||||
|
|
||||
|
|
||||
|
class StockMove(models.Model): |
||||
|
""" Extends 'stock.move' and provides methods for retrieving data for |
||||
|
dashboard.""" |
||||
|
_inherit = "stock.move" |
||||
|
|
||||
|
@api.model |
||||
|
def get_the_top_products(self): |
||||
|
""" Returns top ten products and done quantity.""" |
||||
|
company_id = self.env.company.id |
||||
|
query = '''select product_template.name,sum(product_uom_qty) from stock_move |
||||
|
inner join stock_picking on stock_move.picking_id = stock_picking.id |
||||
|
inner join stock_picking_type on stock_picking.picking_type_id = stock_picking_type.id |
||||
|
inner join product_product on stock_move.product_id = product_product.id |
||||
|
inner join product_template on product_template.id = product_product.product_tmpl_id |
||||
|
where stock_move.state = 'done' and stock_move.company_id=%s and stock_picking_type.code = 'outgoing' and |
||||
|
stock_move.create_date between (now() - interval '10 day') and now() |
||||
|
group by product_template.name ORDER BY sum DESC''' % company_id |
||||
|
self._cr.execute(query) |
||||
|
top_product = self._cr.dictfetchall() |
||||
|
total_quantity = [] |
||||
|
product_name = [] |
||||
|
for record in top_product[:10]: |
||||
|
total_quantity.append(record.get('sum')) |
||||
|
product_name.append(record.get('name')['en_US']) |
||||
|
value = {'products': product_name, 'count': total_quantity} |
||||
|
return value |
||||
|
|
||||
|
@api.model |
||||
|
def top_products_last_ten(self): |
||||
|
""" Returns top ten products and done quantity for last 10 days.""" |
||||
|
company_id = self.env.company.id |
||||
|
query = '''select product_template.name,sum(product_uom_qty) from stock_move |
||||
|
inner join stock_picking on stock_move.picking_id = stock_picking.id |
||||
|
inner join stock_picking_type on stock_picking.picking_type_id = stock_picking_type.id |
||||
|
inner join product_product on stock_move.product_id = product_product.id |
||||
|
inner join product_template on product_template.id = product_product.product_tmpl_id |
||||
|
where stock_move.state = 'done' and stock_move.company_id=%s and stock_picking_type.code = 'outgoing' and |
||||
|
stock_move.create_date between (now() - interval '10 day') and now() |
||||
|
group by product_template.name ORDER BY sum DESC''' % company_id |
||||
|
self._cr.execute(query) |
||||
|
top_product = self._cr.dictfetchall() |
||||
|
total_quantity = [] |
||||
|
product_name = [] |
||||
|
for record in top_product[:10]: |
||||
|
total_quantity.append(record.get('sum')) |
||||
|
product_name.append(record.get('name')['en_US']) |
||||
|
value = {'products': product_name, 'count': total_quantity} |
||||
|
return value |
||||
|
|
||||
|
@api.model |
||||
|
def top_products_last_thirty(self): |
||||
|
""" Returns top ten products and done quantity for last 30 days.""" |
||||
|
company_id = self.env.company.id |
||||
|
query = '''select product_template.name,sum(product_uom_qty) from stock_move |
||||
|
inner join stock_picking on stock_move.picking_id = stock_picking.id |
||||
|
inner join stock_picking_type on stock_picking.picking_type_id = stock_picking_type.id |
||||
|
inner join product_product on stock_move.product_id = product_product.id |
||||
|
inner join product_template on product_template.id = product_product.product_tmpl_id |
||||
|
where stock_move.state = 'done' and stock_move.company_id=%s and stock_picking_type.code = 'outgoing' |
||||
|
and stock_move.create_date between (now() - interval '30 day') and now() |
||||
|
group by product_template.name ORDER BY sum DESC''' % company_id |
||||
|
self._cr.execute(query) |
||||
|
top_product = self._cr.dictfetchall() |
||||
|
total_quantity = [] |
||||
|
product_name = [] |
||||
|
for record in top_product[:10]: |
||||
|
total_quantity.append(record.get('sum')) |
||||
|
product_name.append(record.get('name')['en_US']) |
||||
|
value = {'products': product_name, 'count': total_quantity} |
||||
|
return value |
||||
|
|
||||
|
@api.model |
||||
|
def top_products_last_three_months(self): |
||||
|
""" Returns top ten products and done quantity for last 3 months.""" |
||||
|
company_id = self.env.company.id |
||||
|
query = '''select product_template.name,sum(product_uom_qty) from stock_move |
||||
|
inner join stock_picking on stock_move.picking_id = stock_picking.id |
||||
|
inner join stock_picking_type on stock_picking.picking_type_id = stock_picking_type.id |
||||
|
inner join product_product on stock_move.product_id = product_product.id |
||||
|
inner join product_template on product_template.id = product_product.product_tmpl_id |
||||
|
where stock_move.state = 'done' and stock_move.company_id=%s and stock_picking_type.code ='outgoing' |
||||
|
and stock_move.create_date between (now() - interval '3 month') and now() |
||||
|
group by product_template.name ORDER BY sum DESC''' % company_id |
||||
|
self._cr.execute(query) |
||||
|
top_product = self._cr.dictfetchall() |
||||
|
total_quantity = [] |
||||
|
product_name = [] |
||||
|
for record in top_product[:10]: |
||||
|
total_quantity.append(record.get('sum')) |
||||
|
product_name.append(record.get('name')['en_US']) |
||||
|
value = {'products': product_name, 'count': total_quantity} |
||||
|
return value |
||||
|
|
||||
|
@api.model |
||||
|
def top_products_last_year(self): |
||||
|
""" Returns top ten products and done quantity for last year.""" |
||||
|
company_id = self.env.company.id |
||||
|
query = '''select product_template.name,sum(product_uom_qty) from stock_move |
||||
|
inner join stock_picking on stock_move.picking_id = stock_picking.id |
||||
|
inner join stock_picking_type on stock_picking.picking_type_id = stock_picking_type.id |
||||
|
inner join product_product on stock_move.product_id = product_product.id |
||||
|
inner join product_template on product_template.id = product_product.product_tmpl_id |
||||
|
where stock_move.state = 'done' and stock_move.company_id=%s and |
||||
|
stock_picking_type.code = 'outgoing' and |
||||
|
stock_move.create_date between (now() - interval '1 year') and now() |
||||
|
group by product_template.name ORDER BY sum DESC''' % company_id |
||||
|
self._cr.execute(query) |
||||
|
top_product = self._cr.dictfetchall() |
||||
|
total_quantity = [] |
||||
|
product_name = [] |
||||
|
for record in top_product[:10]: |
||||
|
total_quantity.append(record.get('sum')) |
||||
|
product_name.append(record.get('name')['en_US']) |
||||
|
value = {'products': product_name, 'count': total_quantity} |
||||
|
return value |
||||
|
|
||||
|
@api.model |
||||
|
def get_stock_moves(self): |
||||
|
""" Returns location name and quantity_done of stock moves graph""" |
||||
|
company_id = self.env.company.id |
||||
|
query = ('''select stock_location.complete_name, count(stock_move.id) from stock_move |
||||
|
inner join stock_location on stock_move.location_id = stock_location.id where stock_move.state = 'done' |
||||
|
and stock_move.company_id = %s group by stock_location.complete_name''' % company_id) |
||||
|
self._cr.execute(query) |
||||
|
stock_move = self._cr.dictfetchall() |
||||
|
count = [] |
||||
|
complete_name = [] |
||||
|
for record in stock_move: |
||||
|
count.append(record.get('count')) |
||||
|
complete_name.append(record.get('complete_name')) |
||||
|
value = {'name': complete_name, 'count': count} |
||||
|
return value |
||||
|
|
||||
|
@api.model |
||||
|
def stock_move_last_ten_days(self, post): |
||||
|
""" Returns location name and quantity_done of stock moves graph last |
||||
|
ten days.""" |
||||
|
company_id = self.env.company.id |
||||
|
query = ('''select stock_location.name,sum(stock_move_line.quantity) from stock_move_line |
||||
|
inner join stock_location on stock_move_line.location_id = stock_location.id |
||||
|
where stock_move_line.state = 'done' and stock_move_line.company_id = %s |
||||
|
and stock_move_line.create_date between (now() - interval '10 day') and now() |
||||
|
group by stock_location.name''' % company_id) |
||||
|
self._cr.execute(query) |
||||
|
location_quantity = self._cr.dictfetchall() |
||||
|
quantity_done = [] |
||||
|
name = [] |
||||
|
for record in location_quantity: |
||||
|
quantity_done.append(record.get('sum')) |
||||
|
name.append(record.get('name')) |
||||
|
value = {'name': name, 'count': quantity_done} |
||||
|
return value |
||||
|
|
||||
|
@api.model |
||||
|
def this_month(self, post): |
||||
|
""" Returns location name and quantity_done of stock moves graph for |
||||
|
current month.""" |
||||
|
company_id = self.env.company.id |
||||
|
query = ('''select stock_location.name,sum(stock_move_line.quantity) from stock_move_line |
||||
|
inner join stock_location on stock_move_line.location_id = stock_location.id |
||||
|
where stock_move_line.state = 'done' and stock_move_line.company_id = %s |
||||
|
and stock_move_line.create_date between (now() - interval '1 months') and now() |
||||
|
group by stock_location.name''' % company_id) |
||||
|
self._cr.execute(query) |
||||
|
location_quantity = self._cr.dictfetchall() |
||||
|
quantity_done = [] |
||||
|
name = [] |
||||
|
for record in location_quantity: |
||||
|
quantity_done.append(record.get('sum')) |
||||
|
name.append(record.get('name')) |
||||
|
value = {'name': name, 'count': quantity_done} |
||||
|
return value |
||||
|
|
||||
|
@api.model |
||||
|
def last_three_month(self, post): |
||||
|
""" Returns location name and quantity_done of stock moves graph for |
||||
|
last three months.""" |
||||
|
company_id = self.env.company.id |
||||
|
query = ('''select stock_location.name,sum(stock_move_line.quantity) from stock_move_line |
||||
|
inner join stock_location on stock_move_line.location_id = stock_location.id |
||||
|
where stock_move_line.state = 'done' and stock_move_line.company_id = %s |
||||
|
and stock_move_line.create_date between (now() - interval '3 months') and now() |
||||
|
group by stock_location.name''' % company_id) |
||||
|
self._cr.execute(query) |
||||
|
location_quantity = self._cr.dictfetchall() |
||||
|
quantity_done = [] |
||||
|
name = [] |
||||
|
for record in location_quantity: |
||||
|
quantity_done.append(record.get('sum')) |
||||
|
name.append(record.get('name')) |
||||
|
value = {'name': name, 'count': quantity_done} |
||||
|
return value |
||||
|
|
||||
|
@api.model |
||||
|
def last_year(self, post): |
||||
|
""" Returns location name and quantity_done of stock moves graph for |
||||
|
last year.""" |
||||
|
company_id = self.env.company.id |
||||
|
query = ('''select stock_location.name,sum(stock_move_line.quantity) from stock_move_line |
||||
|
inner join stock_location on stock_move_line.location_id = stock_location.id |
||||
|
where stock_move_line.state = 'done' and stock_move_line.company_id = %s |
||||
|
and stock_move_line.create_date between (now() - interval '12 months') and now() |
||||
|
group by stock_location.name''' % company_id) |
||||
|
self._cr.execute(query) |
||||
|
location_quantity = self._cr.dictfetchall() |
||||
|
quantity_done = [] |
||||
|
name = [] |
||||
|
for record in location_quantity: |
||||
|
quantity_done.append(record.get('sum')) |
||||
|
name.append(record.get('name')) |
||||
|
value = {'name': name, 'count': quantity_done} |
||||
|
return value |
||||
|
|
||||
|
@api.model |
||||
|
def get_dead_of_stock(self): |
||||
|
""" Returns product name and dead quantity of dead stock graph.""" |
||||
|
company_id = self.env.company.id |
||||
|
sett_dead_stock_bool = self.env['ir.config_parameter'].sudo(). \ |
||||
|
get_param("inventory_stock_dashboard_odoo.dead_stock_bol", default="") |
||||
|
sett_dead_stock_quantity = self.env['ir.config_parameter'].sudo().get_param( |
||||
|
"inventory_stock_dashboard_odoo.dead_stock", |
||||
|
default="") |
||||
|
sett_dead_stock_type = self.env['ir.config_parameter'].sudo().get_param( |
||||
|
"inventory_stock_dashboard_odoo.dead_stock_type", |
||||
|
default="") |
||||
|
if sett_dead_stock_bool == "True": |
||||
|
if sett_dead_stock_quantity: |
||||
|
out_stock_value = int(sett_dead_stock_quantity) |
||||
|
query = '''select product_product.id,stock_quant.quantity from product_product |
||||
|
inner join stock_quant on product_product.id = stock_quant.product_id |
||||
|
where stock_quant.company_id = %s and product_product.create_date not between (now() - interval '%s %s') |
||||
|
and now() and product_product.id NOT IN (select product_id from stock_move |
||||
|
inner join stock_picking on stock_move.picking_id = stock_picking.id |
||||
|
inner join stock_picking_type on stock_picking.picking_type_id = stock_picking_type.id |
||||
|
where stock_move.company_id = %s and stock_picking_type.code = 'outgoing' and |
||||
|
stock_move.state = 'done' and stock_move.create_date between (now() - interval '%s %s') and now() |
||||
|
group by product_id)''' % \ |
||||
|
(company_id, out_stock_value, sett_dead_stock_type, company_id, out_stock_value, |
||||
|
sett_dead_stock_type) |
||||
|
self._cr.execute(query) |
||||
|
result = self._cr.fetchall() |
||||
|
total_quantity = [] |
||||
|
product_name = [] |
||||
|
for record in result: |
||||
|
if record[1] > 0: |
||||
|
complete_name = self.env['product.product'].browse(record[0]).display_name |
||||
|
product_name.append(complete_name) |
||||
|
total_quantity.append(record[1]) |
||||
|
value = { |
||||
|
'product_name': product_name, |
||||
|
'total_quantity': total_quantity |
||||
|
} |
||||
|
return value |
@ -0,0 +1,84 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################### |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Aysha Shalin (odoo@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 api, models |
||||
|
|
||||
|
|
||||
|
class StockMoveLine(models.Model): |
||||
|
""" Extends 'stock.move.line' and provides methods for retrieving data for |
||||
|
dashboard.""" |
||||
|
_inherit = "stock.move.line" |
||||
|
|
||||
|
@api.model |
||||
|
def get_product_moves(self): |
||||
|
""" Returns product move and quantity_done.""" |
||||
|
company_id = self.env.company.id |
||||
|
query = ('''select product_template.name,sum(stock_move_line.quantity) from stock_move_line |
||||
|
inner join product_product on stock_move_line.product_id = product_product.id |
||||
|
inner join product_template on product_product.product_tmpl_id = product_template.id |
||||
|
where stock_move_line.company_id = %s group by product_template.name''' % company_id) |
||||
|
self._cr.execute(query) |
||||
|
products_quantity = self._cr.dictfetchall() |
||||
|
quantity_done = [] |
||||
|
name = [] |
||||
|
for record in products_quantity: |
||||
|
quantity_done.append(record.get('sum')) |
||||
|
name.append(record.get('name')) |
||||
|
value = {'name': name, 'count': quantity_done} |
||||
|
category_query = '''select product_category.id,product_category.name from stock_move_line |
||||
|
inner join product_product on stock_move_line.product_id = product_product.id |
||||
|
inner join product_template on product_product.product_tmpl_id = product_template.id |
||||
|
inner join product_category on product_template.categ_id = product_category.id |
||||
|
where stock_move_line.company_id = %s and stock_move_line.state = 'done' |
||||
|
group by product_category.id''' % company_id |
||||
|
self._cr.execute(category_query) |
||||
|
category = self._cr.dictfetchall() |
||||
|
category_id = [] |
||||
|
category_name = [] |
||||
|
for record in category: |
||||
|
category_id.append(record.get('id')) |
||||
|
category_name.append(record.get('name')) |
||||
|
value1 = {'category_id': category_id, 'category_name': category_name} |
||||
|
return value, value1 |
||||
|
|
||||
|
@api.model |
||||
|
def product_move_by_category(self, option): |
||||
|
""" Returns category name and quantity_done.""" |
||||
|
category_id = int(option) |
||||
|
company_id = self.env.company.id |
||||
|
query = ('''select product_template.name,sum(stock_move_line.quantity) from stock_move_line |
||||
|
inner join product_product on stock_move_line.product_id = product_product.id |
||||
|
inner join product_template on product_product.product_tmpl_id = product_template.id |
||||
|
inner join product_category on product_template.categ_id = product_category.id |
||||
|
where stock_move_line.company_id = %s and product_category.id = %s group by product_template.name''' % |
||||
|
(company_id, category_id)) |
||||
|
self._cr.execute(query) |
||||
|
product_move = self._cr.dictfetchall() |
||||
|
quantity_done = [] |
||||
|
name = [] |
||||
|
for record in product_move: |
||||
|
quantity_done.append(record.get('sum')) |
||||
|
name.append(record.get('name')['en_US']) |
||||
|
value = { |
||||
|
'name': name, |
||||
|
'count': quantity_done, |
||||
|
} |
||||
|
return value |
@ -0,0 +1,101 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################### |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Aysha Shalin (odoo@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 api, models |
||||
|
|
||||
|
|
||||
|
class StockPicking(models.Model): |
||||
|
""" Extends 'stock.picking' for retrieving stock picking data for |
||||
|
dashboard.""" |
||||
|
_inherit = "stock.picking" |
||||
|
|
||||
|
@api.model |
||||
|
def get_operation_types(self): |
||||
|
""" Method for retrieving operation type tiles, operation type graph and |
||||
|
returns operation type details. |
||||
|
no_transfer - count of transfers for each operation type, |
||||
|
late - count of late occurrences for each operation type, |
||||
|
waiting - count of waiting operations for each operation type, |
||||
|
operation_type_name - retrieve all operation type names, |
||||
|
backorder - count the number of backorders for each operation type. |
||||
|
""" |
||||
|
no_transfer = {} |
||||
|
stock_picking_type = self.env['stock.picking.type'].search([]) |
||||
|
stock_picking = self.env['stock.picking'].search([]) |
||||
|
stock = [] |
||||
|
length = [] |
||||
|
names = [] |
||||
|
late = {} |
||||
|
query = '''select stock_picking.picking_type_id, count(stock_picking.picking_type_id) from stock_picking |
||||
|
inner join stock_picking_type on stock_picking.picking_type_id = stock_picking_type.id |
||||
|
where stock_picking.company_id = %s and |
||||
|
stock_picking.state in ('assigned', 'waiting', 'confirmed') and (has_deadline_issue = true or |
||||
|
date_deadline <= now() or scheduled_date <= now()) |
||||
|
group by stock_picking.picking_type_id''' % self.env.company.id |
||||
|
self._cr.execute(query) |
||||
|
lates = self._cr.dictfetchall() |
||||
|
for rec in lates: |
||||
|
late.update({rec.get('picking_type_id'): rec.get('count')}) |
||||
|
waiting = {} |
||||
|
backorder = {} |
||||
|
operation_type_name = {} |
||||
|
for i in stock_picking_type: |
||||
|
names.append(i.name) |
||||
|
orders = stock_picking.filtered(lambda r: r.picking_type_id.id == i.id) |
||||
|
stock.append(len(orders)) |
||||
|
length_stock_picking = len(orders) |
||||
|
length.append(len(stock_picking.filtered(lambda r: r.picking_type_id.id == i.id))) |
||||
|
no_transfer.update({i.id: length_stock_picking}) |
||||
|
operation_type_name.update({i.id: i.name}) |
||||
|
if len(orders) > 0: |
||||
|
if len(orders.filtered(lambda r: r.state == 'confirmed')) > 0: |
||||
|
waiting.update({i.id: len(orders.filtered(lambda r: r.state == 'confirmed'))}) |
||||
|
if len(orders.mapped('backorder_id')) > 0: |
||||
|
backorder.update({i.id: len(orders.mapped('backorder_id'))}) |
||||
|
return no_transfer, late, waiting, operation_type_name, backorder |
||||
|
|
||||
|
@api.model |
||||
|
def get_product_category(self): |
||||
|
""" Return product categories and categories that have on-hand product |
||||
|
quantities.""" |
||||
|
category_ids = self.env['product.category'].search([]) |
||||
|
category_name = [] |
||||
|
product_count = [] |
||||
|
for rec in category_ids: |
||||
|
name = rec.name |
||||
|
category_name.append(name) |
||||
|
count = rec.product_count |
||||
|
product_count.append(count) |
||||
|
value = {'name': category_name, 'count': product_count} |
||||
|
return value |
||||
|
|
||||
|
@api.model |
||||
|
def get_locations(self): |
||||
|
""" Returns locations and locations that have on-hand product |
||||
|
quantities.""" |
||||
|
stock_quant_ids = self.env['stock.quant'].search([]) |
||||
|
locations = stock_quant_ids.mapped('location_id') |
||||
|
value = {} |
||||
|
for rec in locations: |
||||
|
loc_stock_quant = stock_quant_ids.filtered(lambda x: x.location_id == rec) |
||||
|
on_hand_quantity = sum(loc_stock_quant.mapped('inventory_quantity_auto_apply')) |
||||
|
value[rec.name] = on_hand_quantity |
||||
|
return value |
@ -0,0 +1,59 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################### |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Aysha Shalin (odoo@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 api, models |
||||
|
|
||||
|
|
||||
|
class StockQuant(models.Model): |
||||
|
""" Extends 'stock.quant' for retrieving data of products that are out of |
||||
|
stock.""" |
||||
|
_inherit = "stock.quant" |
||||
|
|
||||
|
@api.model |
||||
|
def get_out_of_stock(self): |
||||
|
""" Returns products and quantities that are out of stock.""" |
||||
|
company_id = self.env.company.id |
||||
|
sett_out_stock_bool = self.env['ir.config_parameter'].sudo(). \ |
||||
|
get_param("inventory_stock_dashboard_odoo.out_of_stock", default="") |
||||
|
sett_out_stock_quantity = self.env['ir.config_parameter'].sudo().\ |
||||
|
get_param("inventory_stock_dashboard_odoo.out_of_stock_quantity", default="") |
||||
|
if sett_out_stock_bool == "True": |
||||
|
if sett_out_stock_quantity: |
||||
|
out_stock_value = int(sett_out_stock_quantity) |
||||
|
query = '''select product_product.id,sum(stock_quant.quantity) from product_product |
||||
|
inner join stock_quant on product_product.id = stock_quant.product_id |
||||
|
where stock_quant.quantity < %s and stock_quant.company_id = %s group by product_product.id''' \ |
||||
|
% (out_stock_value, company_id) |
||||
|
self._cr.execute(query) |
||||
|
result = self._cr.fetchall() |
||||
|
total_quantity = [] |
||||
|
product_name = [] |
||||
|
for record in result: |
||||
|
total_quantity.append(record[1]) |
||||
|
for record in result: |
||||
|
complete_name = self.env['product.product'].browse( |
||||
|
record[0]).display_name |
||||
|
product_name.append(complete_name) |
||||
|
value = { |
||||
|
'product_name': product_name, |
||||
|
'total_quantity': total_quantity |
||||
|
} |
||||
|
return value |
After Width: | Height: | Size: 36 KiB |
After Width: | Height: | Size: 3.6 KiB |
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.1 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 673 B |
After Width: | Height: | Size: 11 KiB |
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: 80 KiB |
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 565 B |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 43 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 38 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 69 KiB |
After Width: | Height: | Size: 76 KiB |
After Width: | Height: | Size: 64 KiB |
After Width: | Height: | Size: 68 KiB |
After Width: | Height: | Size: 70 KiB |
After Width: | Height: | Size: 67 KiB |
After Width: | Height: | Size: 130 KiB |
After Width: | Height: | Size: 124 KiB |
After Width: | Height: | Size: 162 KiB |
After Width: | Height: | Size: 122 KiB |
After Width: | Height: | Size: 170 KiB |
After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 136 KiB |
After Width: | Height: | Size: 108 KiB |
After Width: | Height: | Size: 51 KiB |
After Width: | Height: | Size: 45 KiB |
After Width: | Height: | Size: 62 KiB |
After Width: | Height: | Size: 110 KiB |
After Width: | Height: | Size: 45 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 398 KiB |
After Width: | Height: | Size: 100 KiB |
After Width: | Height: | Size: 11 KiB |
@ -0,0 +1,756 @@ |
|||||
|
<!DOCTYPE html> |
||||
|
<html lang="en"> |
||||
|
<head> |
||||
|
<meta charset="UTF-8"> |
||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
||||
|
<title>Odoo App 3 Index</title> |
||||
|
<!-- Bootstrap CSS --> |
||||
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/css/bootstrap.min.css" |
||||
|
integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous"> |
||||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css"> |
||||
|
<link rel="preconnect" href="https://fonts.googleapis.com"> |
||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> |
||||
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet"> |
||||
|
</head> |
||||
|
<body> |
||||
|
<section> |
||||
|
<div class="container" style="font-family: 'Inter', sans-serif !important;background-color: #fff !important;"> |
||||
|
<div class="row"> |
||||
|
<div class="col-sm-12 col-md-12 col-lg-12 d-flex justify-content-between flex-wrap align-items-sm-center" |
||||
|
style="border-bottom:1px solid rgba(0, 0, 0, 0.22)"> |
||||
|
<div class="my-3"> |
||||
|
<img src="assets/misc/Cybrosys R.png" style="width:auto !important; height:40px !important"> |
||||
|
</div> |
||||
|
<div class="my-3 d-flex align-items-center"> |
||||
|
<div class="text-center" |
||||
|
style="background-color:#017E84 !important;font-size: 0.8rem !important; color:#fff !important; font-weight:500 !important; padding:4px !important; margin:0 3px !important; border-radius:50px !important; min-width: 120px !important;"> |
||||
|
Community |
||||
|
</div> |
||||
|
<div class="text-center" |
||||
|
style="background-color:#875A7B !important; color:#fff !important;font-size: 0.8rem !important; font-weight:500 !important; padding:4px !important; margin:0 3px !important; border-radius:50px !important;min-width: 120px !important;"> |
||||
|
Enterprise |
||||
|
</div> |
||||
|
<div class="text-center" |
||||
|
style="background-color:#7C7BAD !important; color:#fff !important;font-size: 0.8rem !important; font-weight:500 !important; padding:4px !important; margin:0 3px !important; border-radius:50px !important; min-width: 120px !important;"> |
||||
|
Odoo.sh |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="row"> |
||||
|
<div class="col-sm-12 col-md-12 col-lg-12 text-center d-flex align-items-center flex-column" |
||||
|
style="margin: 80px 0px !important;"> |
||||
|
<h1 style="font-size: 2.8rem;font-weight: 700; color: |
||||
|
#1A202C;"> |
||||
|
Inventory Dashboard Odoo 17</h1> |
||||
|
<p class="my-3 mb-4" |
||||
|
style="max-width: 80%; font-weight: 400 !important; line-height: 32px; color: #718096;"> |
||||
|
Detailed Dashboard View for Inventory. |
||||
|
</p> |
||||
|
<div style="width: 80%; margin-top: 3rem;"> |
||||
|
<img src="assets/screenshots/hero.gif" class="img-responsive" width="100%" height="auto"> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="container mt-5 mb-5"> |
||||
|
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-4"> |
||||
|
<p class="m-0" style="font-weight: 600; font-size: 24px; color:#714b67 !important">Key Highlights |
||||
|
</p> |
||||
|
</div> |
||||
|
<div class="row py-4"> |
||||
|
<div class="col-md-6 col-sm-12 p-3"> |
||||
|
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px; |
||||
|
background: #FFF; |
||||
|
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); "> |
||||
|
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67; |
||||
|
display: flex; justify-content: center; align-items: center; |
||||
|
margin-right: 10px; flex-shrink: 0;"> |
||||
|
<i class="fa-solid fa-star " style="color: #fff;font-size:14px;"></i> |
||||
|
</div> |
||||
|
<div> |
||||
|
<p style="color: #1A202C;font-weight: 600; |
||||
|
font-size: 1.2rem; margin-bottom: 2px;">Detailed View for Users and Admins.</p> |
||||
|
<p class="m-0" style="color:#718096">This Module Offers a Comprehensive and Concise Overview of the Inventory Module at a Glance, Serving as a Valuable Tool for Both Inventory Users and Administrators. |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-6 col-sm-12 p-3"> |
||||
|
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px; |
||||
|
background: #FFF; |
||||
|
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); "> |
||||
|
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67; |
||||
|
display: flex; justify-content: center; align-items: center; |
||||
|
margin-right: 10px; flex-shrink: 0;"> |
||||
|
<i class="fa-solid fa-star " style="color: #fff;font-size:14px;"></i> |
||||
|
</div> |
||||
|
<div> |
||||
|
<p style="color: #1A202C;font-weight: 600; |
||||
|
font-size: 1.2rem; margin-bottom: 2px;">Simplifies the Analysis of the Inventory Module's Functions.</p> |
||||
|
<p class="m-0" style="color:#718096">Allows to Easily Analyse the Functionalities of Inventory Module Using this Dashboard. |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-6 col-sm-12 p-3"> |
||||
|
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px; |
||||
|
background: #FFF; |
||||
|
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); "> |
||||
|
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67; |
||||
|
display: flex; justify-content: center; align-items: center; |
||||
|
margin-right: 10px; flex-shrink: 0;"> |
||||
|
<i class="fa-solid fa-star " style="color: #fff;font-size:14px;"></i> |
||||
|
</div> |
||||
|
<div> |
||||
|
<p style="color: #1A202C;font-weight: 600; |
||||
|
font-size: 1.2rem; margin-bottom: 2px;">Dashboard Tiles and Various Graphs.</p> |
||||
|
<p class="m-0" style="color:#718096">Dynamic and clickable Dashboard Tiles, Along with a Variety of Graphs, Greatly Enhance the Analysis Process. |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-6 col-sm-12 p-3"> |
||||
|
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px; |
||||
|
background: #FFF; |
||||
|
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); "> |
||||
|
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67; |
||||
|
display: flex; justify-content: center; align-items: center; |
||||
|
margin-right: 10px; flex-shrink: 0; "> |
||||
|
<i class="fa-solid fa-star " style="color: #fff;font-size:14px;"></i> |
||||
|
</div> |
||||
|
<div> |
||||
|
<p style="color: #1A202C;font-weight: 600; |
||||
|
font-size: 1.2rem; margin-bottom: 2px;">Filtering Options for Specific Graphs.</p> |
||||
|
<p class="m-0" style="color:#718096">Graphs can be Filtered According to Various Time Periods. |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="container rounded" > |
||||
|
<ul class="nav nav-tabs d-flex" style="width: fit-content;margin: 0 auto;gap: 1rem;"> |
||||
|
<li class="col text-center py-2 text-nowrap " |
||||
|
style="color: #fff; background-color: #714B67;border-radius: 6px 6px 0px 0px;"><a |
||||
|
class="active show" data-toggle="tab" href="#tab1" |
||||
|
style="color: #fff;font-weight: 500; background-color: #714B67; text-decoration: none;"> |
||||
|
<i class="fa-regular fa-image pr-2" style="color: #fff;"></i> |
||||
|
Screenshots</a></li> |
||||
|
<li class="col text-center py-2 text-nowrap " |
||||
|
style="color: #fff; background-color: #714B67;border-radius: 6px 6px 0px 0px;"><a |
||||
|
data-toggle="tab" href="#tab2" |
||||
|
style="color: #fff;font-weight: 500; text-decoration: none;"><i |
||||
|
class="fa-solid fa-star pr-2" style="color: #fff;"></i>Features</a></li> |
||||
|
<li class="col text-center py-2 text-nowrap " |
||||
|
style="color: #fff; background-color: #714B67;border-radius: 6px 6px 0px 0px;"><a |
||||
|
data-toggle="tab" href="#tab3" |
||||
|
style="color: #fff;font-weight: 500; text-decoration: none; background-color: #714B67;"><i |
||||
|
class="fa-solid fa-book-open pr-2" style="color: #fff;"></i>Released Notes</a></li> |
||||
|
</ul> |
||||
|
<div class="tab-content" style="background-color: rgba(121, 113, 119, 0.04);"> |
||||
|
<div id="tab1" class="tab-pane fade in active show"> |
||||
|
<div class="col-lg-12 py-2" style="padding: 1rem 4rem !important;"> |
||||
|
<div |
||||
|
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<div class="row justify-content-center p-3 w-100 m-0"> |
||||
|
<img src="assets/screenshots/1.png" class="img-responsive" width="100%" height="auto"> |
||||
|
</div> |
||||
|
<div class="px-3"> |
||||
|
<h4 class="mt-2" |
||||
|
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
||||
|
Dynamic And Clickable Dashboard Tiles.</h4> |
||||
|
<p class="m-0" style="color:#718096">User can Click the Tiles and States in Tile,That shows the Detailed View of Corresponding Operation Type. |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-lg-12 py-2" style="padding: 1rem 4rem !important;"> |
||||
|
<div |
||||
|
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<div class="row justify-content-center p-3 w-100 m-0"> |
||||
|
<img src="assets/screenshots/2.png" class="img-responsive" width="100%" height="auto"> |
||||
|
</div> |
||||
|
<div class="px-3"> |
||||
|
<h4 class="mt-2" |
||||
|
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
||||
|
Different Types of Graphs.</h4> |
||||
|
<p class="m-0" style="color:#718096">Inventory Dashboard have Different Types of Graphs that will Give You Complete Analysis of the Inventory Module. |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-lg-12 py-2" style="padding: 1rem 4rem !important;"> |
||||
|
<div |
||||
|
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<div class="row justify-content-center p-3 w-100 m-0"> |
||||
|
<img src="assets/screenshots/3.png" class="img-responsive" width="100%" height="auto"> |
||||
|
</div> |
||||
|
<div class="px-3"> |
||||
|
<h4 class="mt-2" |
||||
|
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
||||
|
Show Details Button on the Inventory Dashboard Provides Detailed Information About that Specific Graph.</h4> |
||||
|
<p class="m-0" style="color:#718096">The Inventory Dashboard Features a Variety of Graphs that Provide a Comprehensive Analysis of the Inventory Module. |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-lg-12 py-2" style="padding: 1rem 4rem !important;"> |
||||
|
<div |
||||
|
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<div class="row justify-content-center p-3 w-100 m-0"> |
||||
|
<img src="assets/screenshots/4.png" class="img-responsive" width="100%" height="auto"> |
||||
|
</div> |
||||
|
<div class="px-3"> |
||||
|
<h4 class="mt-2" |
||||
|
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
||||
|
Filtering Options for Specific Graphs.</h4> |
||||
|
<p class="m-0" style="color:#718096">Graphs can be Filtered According to Various Time Periods. |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-lg-12 py-2" style="padding: 1rem 4rem !important;"> |
||||
|
<div |
||||
|
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<div class="row justify-content-center p-3 w-100 m-0"> |
||||
|
<img src="assets/screenshots/5.png" class="img-responsive" width="100%" height="auto"> |
||||
|
</div> |
||||
|
<div class="px-3"> |
||||
|
<h4 class="mt-2" |
||||
|
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
||||
|
1. Top Moving Products.</h4> |
||||
|
<p class="m-0" style="color:#718096">The Ten Best-selling Products Along with their Corresponding Sales Counts. |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-lg-12 py-2" style="padding: 1rem 4rem !important;"> |
||||
|
<div |
||||
|
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<div class="row justify-content-center p-3 w-100 m-0"> |
||||
|
<img src="assets/screenshots/6.png" class="img-responsive" width="100%" height="auto"> |
||||
|
</div> |
||||
|
<div class="px-3"> |
||||
|
<h4 class="mt-2" |
||||
|
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
||||
|
2. Product Categories.</h4> |
||||
|
<p class="m-0" style="color:#718096">Displaying Product Categories and the Product Count Within their Respective Categories. |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-lg-12 py-2" style="padding: 1rem 4rem !important;"> |
||||
|
<div |
||||
|
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<div class="row justify-content-center p-3 w-100 m-0"> |
||||
|
<img src="assets/screenshots/7.png" class="img-responsive" width="100%" height="auto"> |
||||
|
</div> |
||||
|
<div class="px-3"> |
||||
|
<h4 class="mt-2" |
||||
|
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
||||
|
3. Product Moves By Category.</h4> |
||||
|
<p class="m-0" style="color:#718096"> |
||||
|
This Graph Shows the Product Move Report and is Filtered Based on the Available Categories in the Product Movement. |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-lg-12 py-2" style="padding: 1rem 4rem !important;"> |
||||
|
<div |
||||
|
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<div class="row justify-content-center p-3 w-100 m-0"> |
||||
|
<img src="assets/screenshots/8.png" class="img-responsive" width="100%" height="auto"> |
||||
|
</div> |
||||
|
<div class="px-3"> |
||||
|
<h4 class="mt-2" |
||||
|
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
||||
|
4. Stock Moves By Location.</h4> |
||||
|
<p class="m-0" style="color:#718096"> |
||||
|
Displays the Stock Move Report by Location and the Corresponding Stock Move Count. |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-lg-12 py-2" style="padding: 1rem 4rem !important;"> |
||||
|
<div |
||||
|
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<div class="row justify-content-center p-3 w-100 m-0"> |
||||
|
<img src="assets/screenshots/9.png" class="img-responsive" width="100%" height="auto"> |
||||
|
</div> |
||||
|
<div class="px-3"> |
||||
|
<h4 class="mt-2" |
||||
|
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
||||
|
5. Operation Types.</h4> |
||||
|
<p class="m-0" style="color:#718096"> |
||||
|
Operation Types and their Corresponding Transfer Counts. |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-lg-12 py-2" style="padding: 1rem 4rem !important;"> |
||||
|
<div |
||||
|
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<div class="row justify-content-center p-3 w-100 m-0"> |
||||
|
<img src="assets/screenshots/10.png" class="img-responsive" width="100%" height="auto"> |
||||
|
</div> |
||||
|
<div class="px-3"> |
||||
|
<h4 class="mt-2" |
||||
|
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
||||
|
6. Dead Stock.</h4> |
||||
|
<p class="m-0" style="color:#718096">Dead Stocks Refer to Unsold Inventory Items that have been Stored in Your Warehouse or Store for a Specified Period. |
||||
|
Users can Configure the Dead Stock Duration in the Settings, and there is an Option to Enable or Disable it. Users can Also Enable or Disable the Graph in the Settings. |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-lg-12 py-2" style="padding: 1rem 4rem !important;"> |
||||
|
<div |
||||
|
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<div class="row justify-content-center p-3 w-100 m-0"> |
||||
|
<img src="assets/screenshots/11.png" class="img-responsive" width="100%" height="auto"> |
||||
|
</div> |
||||
|
<div class="px-3"> |
||||
|
<h4 class="mt-2" |
||||
|
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
||||
|
The Graph Displays Dead Stock Products and their Current Stock.</h4> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-lg-12 py-2" style="padding: 1rem 4rem !important;"> |
||||
|
<div |
||||
|
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<div class="row justify-content-center p-3 w-100 m-0"> |
||||
|
<img src="assets/screenshots/12.png" class="img-responsive" width="100%" height="auto"> |
||||
|
</div> |
||||
|
<div class="px-3"> |
||||
|
<h4 class="mt-2" |
||||
|
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
||||
|
7. Out of Stock Products.</h4> |
||||
|
<p class="m-0" style="color:#718096">Displaying Out-of-stock Products. Users can Configure the Out-of-stock Products Using Inventory Settings, |
||||
|
and there is an Option for Enabling and Disabling this Feature. Users can Also Enable or Disable the Graph in the Settings. |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-lg-12 py-2" style="padding: 1rem 4rem !important;"> |
||||
|
<div |
||||
|
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<div class="row justify-content-center p-3 w-100 m-0"> |
||||
|
<img src="assets/screenshots/13.png" class="img-responsive" width="100%" height="auto"> |
||||
|
</div> |
||||
|
<div class="px-3"> |
||||
|
<h4 class="mt-2" |
||||
|
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
||||
|
The Graph Displays Out-of-stock Products and Their Current Stock.</h4> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-lg-12 py-2" style="padding: 1rem 4rem !important;"> |
||||
|
<div |
||||
|
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<div class="row justify-content-center p-3 w-100 m-0"> |
||||
|
<img src="assets/screenshots/14.png" class="img-responsive" width="100%" height="auto"> |
||||
|
</div> |
||||
|
<div class="px-3"> |
||||
|
<h4 class="mt-2" |
||||
|
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
||||
|
8. Locations Table.</h4> |
||||
|
<p class="m-0" style="color:#718096">Locations and Their Corresponding On-hand Quantities. |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div id="tab2" class="tab-pane fade"> |
||||
|
<div class="col-mg-12" style="padding: 1rem 4rem;"> |
||||
|
<ul style="list-style: none; padding: 1rem 0;font-weight: 500;"> |
||||
|
<li class="py-3" |
||||
|
style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; margin-bottom: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<span style="margin-right: 12px;"><img src="assets/misc/star (1) 2.svg" alt="" |
||||
|
width="16px"></span>Detailed View for Users and Admins. |
||||
|
</li> |
||||
|
<li class="py-3" |
||||
|
style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; margin-bottom: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<span style="margin-right: 12px;"><img src="assets/misc/star (1) 2.svg" alt="" |
||||
|
width="16px"></span>Dynamic And Clickable Tiles and Various Graphs. |
||||
|
</li> |
||||
|
<li class="py-3" |
||||
|
style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; margin-bottom: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<span style="margin-right: 12px;"><img src="assets/misc/star (1) 2.svg" alt="" |
||||
|
width="16px"></span>Show Details Button for Graphs. |
||||
|
</li> |
||||
|
<li class="py-3" |
||||
|
style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; margin-bottom: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<span style="margin-right: 12px;"><img src="assets/misc/star (1) 2.svg" alt="" |
||||
|
width="16px"></span>Dead Stock and Out of Stock Graph. |
||||
|
<ul style="list-style: none;font-weight: 400; color:#718096"> |
||||
|
<li>Users have the Option to Enable or Disable the Dead Stock and Out of Stock Graphs.</li> |
||||
|
</ul> |
||||
|
</li> |
||||
|
</ul> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div id="tab3" class="tab-pane fade"> |
||||
|
<div class="col-mg-12 active" style="padding: 1rem 4rem;"> |
||||
|
<div class="py-3" |
||||
|
style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<div class="d-flex mb-3" style="font-size: 0.8rem; font-weight: 500;"><span>Version |
||||
|
17.0.1.0.0</span><span class="px-2">|</span><span |
||||
|
style="color: #714B67;font-weight: 600;">Released on:06th November 2023</span> |
||||
|
</div> |
||||
|
<p class="m-0" |
||||
|
style=" color:#718096!important; font-size:1rem !important;line-height: 28px;"> |
||||
|
Initial Commit for Inventory Dashboard Odoo 17.</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="container mt-5"> |
||||
|
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-5"> |
||||
|
<p class="m-0" style="font-weight: 600; font-size: 24px; color:#000 !important">Related Products</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div id="myCarousel" class="carousel slide py-3" data-ride="carousel"> |
||||
|
<div class="carousel-inner"> |
||||
|
<div class="carousel-item active"> |
||||
|
<div class="row p-4"> |
||||
|
<div class="col"> |
||||
|
<div class="p-3"> |
||||
|
<a href="https://apps.odoo.com/apps/modules/16.0/inventory_barcode_scanning/" style="color: #000; text-decoration: none;"> |
||||
|
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;"> |
||||
|
<div style="width: 300px; "> |
||||
|
<img src="assets/modules/inventory_barcode_scanning.png" alt="" width="100%" height="auto"> |
||||
|
</div> |
||||
|
<p class="text-center pt-2 text-black font-weight-bold">Barcode scanning in Inventory</p> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col"> |
||||
|
<div class="p-3"> |
||||
|
<a href="https://apps.odoo.com/apps/modules/16.0/product_barcode/" style="color: #000; text-decoration: none;"> |
||||
|
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;"> |
||||
|
<div style="width: 300px; "> |
||||
|
<img src="assets/modules/product_barcode.png" alt="" width="100%" height="auto"> |
||||
|
|
||||
|
</div> |
||||
|
<p class="text-center pt-2 text-black font-weight-bold">Product Barcode Generator</p> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col"> |
||||
|
<div class="p-3"> |
||||
|
<a href="https://apps.odoo.com/apps/modules/16.0/inventory_report_generator/" style="color: #000; text-decoration: none;"> |
||||
|
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;"> |
||||
|
<div style="width: 300px; "> |
||||
|
<img src="assets/modules/inventory_report_generator.png" alt="" width="100%" height="auto"> |
||||
|
</div> |
||||
|
<p class="text-center pt-2 text-black font-weight-bold">Inventory All In One Report Generator</p> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="carousel-item"> |
||||
|
<div class="row p-4"> |
||||
|
<div class="col"> |
||||
|
<div class="p-3"> |
||||
|
<a href="https://apps.odoo.com/apps/modules/16.0/quality_assurance/" style="color: #000; text-decoration: none;"> |
||||
|
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;"> |
||||
|
<div style="width: 300px; "> |
||||
|
<img src="assets/modules/quality_assurance.png" alt="" width="100%" height="auto"> |
||||
|
</div> |
||||
|
<p class="text-center pt-2 text-black font-weight-bold">Quality Assurance</p> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col"> |
||||
|
<div class="p-3"> |
||||
|
<a href="https://apps.odoo.com/apps/modules/16.0/product_batch_report/" style="color: #000; text-decoration: none;"> |
||||
|
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;"> |
||||
|
<div style="width: 300px;"> |
||||
|
<img src="assets/modules/product_batch_report.png" alt="" width="100%" height="auto"> |
||||
|
</div> |
||||
|
<p class="text-center pt-2 text-black font-weight-bold">Lot and Serial Number Expiry Report</p> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col"> |
||||
|
<div class="p-3"> |
||||
|
<a href="https://apps.odoo.com/apps/modules/16.0/odoo_product_tags/" style="color: #000; text-decoration: none;"> |
||||
|
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;"> |
||||
|
<div style="width: 300px;"> |
||||
|
<img src="assets/modules/odoo_product_tags.png" alt="" width="100%" height="auto"> |
||||
|
</div> |
||||
|
<p class="text-center pt-2 text-black font-weight-bold">Odoo Product Tags</p> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<a class="carousel-control-prev" href="#myCarousel" data-slide="prev" style="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="#myCarousel" data-slide="next" style="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 class="container mt-5"> |
||||
|
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-4"> |
||||
|
<p class="m-0" style="font-weight: 600; font-size: 24px; color:#000 !important">Our Services</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="container my-5"> |
||||
|
<div class="row py-3"> |
||||
|
<div class="col-md-4 col-sm-6 px-4 py-4"> |
||||
|
<div |
||||
|
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;"> |
||||
|
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> |
||||
|
<div style="background-color:#13EA36 ; border-radius: 50%; padding: 15px; width: 68px; |
||||
|
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> |
||||
|
<img src="assets/icons/cogs.png" alt="service-icon" width="38px" height="auto"> |
||||
|
</div> |
||||
|
</div> |
||||
|
<p style="margin-top: 20px; font-weight: bold;">Odoo Customization</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-4 col-sm-6 px-4 py-4"> |
||||
|
<div |
||||
|
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;"> |
||||
|
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> |
||||
|
<div style="background-color:#DBC711; border-radius: 50%; padding: 15px; width: 68px; |
||||
|
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> |
||||
|
<img src="assets/icons/wrench.png" alt="service-icon" width="38px" height="auto"> |
||||
|
</div> |
||||
|
</div> |
||||
|
<p style="margin-top: 20px; font-weight: bold;">Odoo Implementation</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-4 col-sm-6 px-4 py-4"> |
||||
|
<div |
||||
|
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative; border-radius: 4px;"> |
||||
|
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> |
||||
|
<div style="background-color:#FF6B6B ; border-radius: 50%; padding: 15px; width: 68px; |
||||
|
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> |
||||
|
<img src="assets/icons/lifebuoy.png" alt="service-icon" width="38px" height="auto"> |
||||
|
</div> |
||||
|
</div> |
||||
|
<p style="margin-top: 20px; font-weight: bold;">Odoo Support</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-4 col-sm-6 px-4 py-4"> |
||||
|
<div |
||||
|
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative; border-radius: 4px;"> |
||||
|
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> |
||||
|
<div style="background-color:#FFA801 ; border-radius: 50%; padding: 15px; width: 68px; |
||||
|
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> |
||||
|
<img src="assets/icons/user.png" alt="service-icon" width="38px" height="auto"> |
||||
|
</div> |
||||
|
</div> |
||||
|
<p style="margin-top: 20px; font-weight: bold;">Hire Odoo Developer</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-4 col-sm-6 px-4 py-4"> |
||||
|
<div |
||||
|
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative; border-radius: 4px;"> |
||||
|
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> |
||||
|
<div style="background-color:#54A0FF; border-radius: 50%; padding: 15px; width: 68px; |
||||
|
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> |
||||
|
<img src="assets/icons/puzzle.png" alt="service-icon" width="38px" height="auto"> |
||||
|
</div> |
||||
|
</div> |
||||
|
<p style="margin-top: 20px; font-weight: bold;">Odoo Integration</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-4 col-sm-6 px-4 py-4"> |
||||
|
<div |
||||
|
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;"> |
||||
|
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> |
||||
|
<div style="background-color:#6D7680 ; border-radius: 50%; padding: 15px; width: 68px; |
||||
|
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> |
||||
|
<img src="assets/icons/update.png" alt="service-icon" width="38px" height="auto"> |
||||
|
</div> |
||||
|
</div> |
||||
|
<p style="margin-top: 20px; font-weight: bold;">Odoo Migration</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-4 col-sm-6 px-4 py-4"> |
||||
|
<div |
||||
|
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;"> |
||||
|
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> |
||||
|
<div style="background-color:#786FA6 ; border-radius: 50%; padding: 15px; width: 68px; |
||||
|
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> |
||||
|
<img src="assets/icons/consultation.png" alt="service-icon" width="38px" height="auto"> |
||||
|
</div> |
||||
|
</div> |
||||
|
<p style="margin-top: 20px; font-weight: bold;">Odoo Consultancy</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-4 col-sm-6 px-4 py-4"> |
||||
|
<div |
||||
|
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px;position: relative;border-radius: 4px;"> |
||||
|
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> |
||||
|
<div style="background-color:#F8A5C2 ; border-radius: 50%; padding: 15px; width: 68px; |
||||
|
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> |
||||
|
<img src="assets/icons/training.png" alt="service-icon" width="38px" height="auto"> |
||||
|
</div> |
||||
|
</div> |
||||
|
<p style="margin-top: 20px; font-weight: bold;">Odoo Implementation</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-4 col-sm-6 px-4 py-4"> |
||||
|
<div |
||||
|
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;"> |
||||
|
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> |
||||
|
<div style="background-color:#E6BE26; border-radius: 50%; padding: 15px; width: 68px; |
||||
|
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> |
||||
|
<img src="assets/icons/license.png" alt="service-icon" width="38px" height="auto"> |
||||
|
</div> |
||||
|
</div> |
||||
|
<p style="margin-top: 20px; font-weight: bold;">Odoo Licensing Consultancy</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="container mt-5"> |
||||
|
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-4"> |
||||
|
<p class="m-0" style="font-weight: 600; font-size: 24px; color:#000 !important">Our Industries</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="container"> |
||||
|
<div class="row my-5 py-4"> |
||||
|
<div class="col-md-3 col-sm-6 p-0"> |
||||
|
<div class="d-flex flex-column h-100 " |
||||
|
style="border-right: 1px solid rgb(209, 209, 209); border-bottom: 1px solid rgb(209, 209, 209); padding: 30px; box-shadow: 6px 0 10px rgba(228, 227, 227, 0.373);"> |
||||
|
<img src="assets/icons/trading-black.png" width="42px" height="auto" alt=""> |
||||
|
<p style="color: #714B67;font-weight: 600; margin-top: 10px; |
||||
|
font-size: 1.2rem; margin-bottom: 2px;">Trading</p> |
||||
|
<p>Easily procure and sell your products</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-3 col-sm-6 p-0"> |
||||
|
<div class="d-flex flex-column h-100" |
||||
|
style="border-right: 1px solid rgb(209, 209, 209);border-bottom: 1px solid rgb(209, 209, 209); padding: 30px;"> |
||||
|
<img src="assets/icons/pos-black.png" width="42px" height="auto" alt=""> |
||||
|
<p style="color: #714B67;font-weight: 600; margin-top: 10px; |
||||
|
font-size: 1.2rem; margin-bottom: 2px;">POS</p> |
||||
|
<p>Easy configuration and convivial experience</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-3 col-sm-6 p-0"> |
||||
|
<div class="d-flex flex-column h-100" |
||||
|
style="border-right: 1px solid rgb(209, 209, 209);border-bottom: 1px solid rgba(0, 0, 0, 0.2); padding: 30px; box-shadow: 0 5px 10px rgba(228, 227, 227, 0.373)"> |
||||
|
<img src="assets/icons/education-black.png" width="42px" height="auto" alt=""> |
||||
|
<p style="color: #714B67;font-weight: 600; margin-top: 10px; |
||||
|
font-size: 1.2rem; margin-bottom: 2px;">Education</p> |
||||
|
<p>A platform for educational management</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-3 col-sm-6 p-0"> |
||||
|
<div class="d-flex flex-column h-100" |
||||
|
style="border-bottom: 1px solid rgb(209, 209, 209); padding: 30px; "> |
||||
|
<img src="assets/icons/manufacturing-black.png" width="42px" height="auto" alt=""> |
||||
|
<p style="color: #714B67;font-weight: 600; margin-top: 10px; |
||||
|
font-size: 1.2rem; margin-bottom: 2px;">Manufacturing</p> |
||||
|
<p>Plan, track and schedule your operations</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-3 col-sm-6 p-0"> |
||||
|
<div class="d-flex flex-column h-100" |
||||
|
style="border-right: 1px solid rgb(209, 209, 209); padding: 30px;"> |
||||
|
<img src="assets/icons/ecom-black.png" width="42px" height="auto" alt=""> |
||||
|
<p style="color: #714B67;font-weight: 600; margin-top: 10px; |
||||
|
font-size: 1.2rem; margin-bottom: 2px;">E-commerce & Website</p> |
||||
|
<p>Mobile friendly, awe-inspiring product pages</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-3 col-sm-6 p-0"> |
||||
|
<div class="d-flex flex-column h-100" |
||||
|
style="border-right: 1px solid rgb(209, 209, 209); padding: 30px;box-shadow: 0 -5px 10px rgba(228, 227, 227, 0.373);"> |
||||
|
<img src="assets/icons/service-black.png" width="42px" height="auto" alt=""> |
||||
|
<p style="color: #714B67;font-weight: 600; margin-top: 10px; |
||||
|
font-size: 1.2rem; margin-bottom: 2px;">Service Management</p> |
||||
|
<p>Keep track of services and invoice</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-3 col-sm-6 p-0"> |
||||
|
<div class="d-flex flex-column h-100" |
||||
|
style="border-right: 1px solid rgb(209, 209, 209); padding: 30px; "> |
||||
|
<img src="assets/icons/restaurant-black.png" width="42px" height="auto" alt=""> |
||||
|
<p style="color: #714B67;font-weight: 600; margin-top: 10px; |
||||
|
font-size: 1.2rem; margin-bottom: 2px;">Restaurant</p> |
||||
|
<p>Run your bar or restaurant methodically</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-3 col-sm-6 p-0"> |
||||
|
<div class="d-flex flex-column h-100" |
||||
|
style=" padding: 30px;box-shadow: -5px 0 10px rgba(228, 227, 227, 0.373);"> |
||||
|
<img src="assets/icons/hotel-black.png" width="42px" height="auto" alt=""> |
||||
|
<p style="color: #714B67;font-weight: 600; margin-top: 10px; |
||||
|
font-size: 1.2rem; margin-bottom: 2px;">Hotel Management</p> |
||||
|
<p>An all-inclusive hotel management application</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="container mt-5"> |
||||
|
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-5"> |
||||
|
<p class="m-0" style="font-weight: 600; font-size: 24px; color:#000 !important">Support</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="container my-5"> |
||||
|
<div class="row" style="background-color: #FFFAFE;"> |
||||
|
<div class="col-md-6 pb-4 d-flex align-items-center justify-content-center" |
||||
|
style="border-right: 1px solid #D9D9D9;"> |
||||
|
<div style="padding: 30px;"> |
||||
|
<div class="d-flex align-items-center"> |
||||
|
<img src="assets/misc/support (1) 1.svg" alt="" width="60px" style="margin-right: 12px;"> |
||||
|
<div style="padding: 0px 8px;"> |
||||
|
<span |
||||
|
style="color: #714B67;font-size: 24px;font-weight: 600;padding-bottom: 1rem;">Need |
||||
|
Help?</span> |
||||
|
<p class="m-0" style="color:#718096;">Got questions or need help? Get in touch.</p> |
||||
|
<div style="font-weight: 400;"><span><img src="assets/misc/support-email.svg" alt="" |
||||
|
width="18px" |
||||
|
style="filter: invert(1);margin-right: 0.8rem;"></span>odoo@cybrosys.com |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-6 pb-4 d-flex align-items-center justify-content-center"> |
||||
|
<div style="padding: 30px;"> |
||||
|
<div class="d-flex align-items-center"> |
||||
|
<img src="assets/misc/whatsapp 1.svg" alt="" width="60px" style="margin-right: 12px;"> |
||||
|
<div> |
||||
|
<span style="color: #714B67;font-size: 24px;font-weight: 600;">WhatsApp</span> |
||||
|
<p class="m-0" style="color:#718096;">Say hi to us on WhatsApp!</p> |
||||
|
<div style="font-weight: 400; font-size: 16px;"><span><img src="assets/misc/phone.svg" |
||||
|
alt="" width="14px" |
||||
|
style="filter: invert(1); margin-right: 0.8rem;"></span>+91 |
||||
|
99456767686</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
<!-- Optional JavaScript --> |
||||
|
<!-- jQuery first, then Popper.js, then Bootstrap JS --> |
||||
|
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> |
||||
|
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script> |
||||
|
</body> |
||||
|
</html> |
@ -0,0 +1,880 @@ |
|||||
|
.item-container { |
||||
|
background-image: -webkit-linear-gradient(white, white); |
||||
|
} |
||||
|
.item-header { |
||||
|
padding-left: 30px; |
||||
|
background-image: -webkit-linear-gradient(white, #c3c9d4); |
||||
|
} |
||||
|
.col-sm, |
||||
|
.col-sm-1, |
||||
|
.col-sm-10, |
||||
|
.col-sm-11, |
||||
|
.col-sm-12, |
||||
|
.col-sm-2, |
||||
|
.col-sm-3, |
||||
|
.col-sm-4, |
||||
|
.col-xl-auto { |
||||
|
position: relative; |
||||
|
padding-right: 7.5px; |
||||
|
padding-left: 7.5px; |
||||
|
} |
||||
|
#location_table thead th { |
||||
|
border-bottom: none; |
||||
|
background-color: #67b7dc; |
||||
|
color: white; |
||||
|
width: 250px; |
||||
|
height: 30px; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .card-header { |
||||
|
background-color: |
||||
|
transparent; |
||||
|
border-bottom: 1px solid rgba(0, 0, 0, .125); |
||||
|
padding: .75rem 1.25rem; |
||||
|
position: relative; |
||||
|
border-top-left-radius: .25rem; |
||||
|
border-top-right-radius: .25rem; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .fa:hover { |
||||
|
-ms-transform: scale(1.5); |
||||
|
/* IE 9 */ |
||||
|
-webkit-transform: scale(1.5); |
||||
|
/* Safari 3-8 */ |
||||
|
transform: scale(1.5); |
||||
|
} |
||||
|
.accounts-dashboard-wrap .card-header>.card-tools { |
||||
|
float: right; |
||||
|
margin-right: -.625rem; |
||||
|
} |
||||
|
.right { |
||||
|
float: left; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .tooltip:hover .tooltiptext { |
||||
|
visibility: visible; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .col-6 { |
||||
|
-ms-flex: 0 0 50%; |
||||
|
flex: 0 0 50%; |
||||
|
max-width: 50%; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .fa-cog { |
||||
|
content: "\f013" |
||||
|
} |
||||
|
.accounts-dashboard-wrap .fa, |
||||
|
.accounts-dashboard-wrap .fas { |
||||
|
font-weight: 900; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .fa, |
||||
|
.accounts-dashboard-wrap .fab, |
||||
|
.accounts-dashboard-wrap .fad, |
||||
|
.accounts-dashboard-wrap .fal, |
||||
|
.accounts-dashboard-wrap .far, |
||||
|
.accounts-dashboard-wrap .fas { |
||||
|
-moz-osx-font-smoothing: grayscale; |
||||
|
-webkit-font-smoothing: antialiased; |
||||
|
display: inline-block; |
||||
|
font-style: normal; |
||||
|
font-variant: normal; |
||||
|
text-rendering: auto; |
||||
|
line-height: 1; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .info-box .info-box-icon { |
||||
|
|
||||
|
border-radius: .25rem; |
||||
|
-ms-flex-align: center; |
||||
|
align-items: center; |
||||
|
display: -ms-flexbox; |
||||
|
display: flex; |
||||
|
font-size: 1.875rem; |
||||
|
-ms-flex-pack: center; |
||||
|
justify-content: center; |
||||
|
text-align: center; |
||||
|
width: 70px; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .info-box { |
||||
|
box-shadow: 0 0 1px rgba(0, 0, 0, .125), 0 1px 3px rgba(0, 0, 0, .2); |
||||
|
border-radius: .25rem; |
||||
|
background: #fff; |
||||
|
display: -ms-flexbox; |
||||
|
display: flex; |
||||
|
margin-bottom: 1rem; |
||||
|
min-height: 80px; |
||||
|
padding: .5rem; |
||||
|
position: relative; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .o_datepicker .o_datepicker_input { |
||||
|
width: 100%; |
||||
|
cursor: pointer; |
||||
|
} |
||||
|
.accounts-dashboard-wrap #overdue { |
||||
|
width: 100%; |
||||
|
cursor: pointer; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .o_input { |
||||
|
border: 1px solid #cfcfcf; |
||||
|
border-top-style: none; |
||||
|
border-right-style: none; |
||||
|
border-left-style: none; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .in_graph { |
||||
|
padding-left: 90px; |
||||
|
height: auto; |
||||
|
padding-bottom: 65px; |
||||
|
text-align: center !important; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .oh_dashboards { |
||||
|
padding-top: 15px; |
||||
|
background-color: #f8faff !important; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .container-fluid.o_in_dashboard { |
||||
|
padding: 0px !important; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .o_action_manager { |
||||
|
overflow-y: scroll !important; |
||||
|
max-width: 100%; |
||||
|
} |
||||
|
// new tile |
||||
|
|
||||
|
.oh_dashboards { |
||||
|
background-color: #ececec; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .container { |
||||
|
margin: 50px 0 0 100px; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .o_dashboards { |
||||
|
color: #2a2a2a; |
||||
|
background-color: #f2f2f2 !important; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .dash-header { |
||||
|
margin: 15px 0px 12px 0 !important; |
||||
|
display: block; |
||||
|
padding: 7px 25px 7px 0; |
||||
|
color: #0e1319; |
||||
|
font-size: 2rem; |
||||
|
font-weight: 400; |
||||
|
background-color: |
||||
|
rgba(255, 255, 255, 0.9) !important; |
||||
|
color: #212529; |
||||
|
padding: 1.5rem; |
||||
|
border-radius: 3px; |
||||
|
box-shadow: 0 0px 10px 0px rgba(0, 0, 0, 0.05) !important; |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
align-items: center; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .dashboard-h1 { |
||||
|
display: block; |
||||
|
padding: 7px 25px 7px 0; |
||||
|
color: #0e1319; |
||||
|
font-size: 2rem; |
||||
|
font-weight: 400; |
||||
|
color: #212529; |
||||
|
float: left; |
||||
|
margin-bottom: 0; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .card { |
||||
|
position: relative !important; |
||||
|
border-top: 0 !important; |
||||
|
margin-bottom: 30px !important; |
||||
|
width: 100% !important; |
||||
|
background-color: #ffffff !important; |
||||
|
border-radius: 0.25rem !important; |
||||
|
padding: 0px !important; |
||||
|
-webkit-transition: .5s !important; |
||||
|
transition: .5s !important; |
||||
|
display: -ms-flexbox !important; |
||||
|
display: flex !important; |
||||
|
-ms-flex-direction: column !important; |
||||
|
flex-direction: column !important; |
||||
|
box-shadow: 0 0px 10px 0px rgba(0, 0, 0, 0.05) !important; |
||||
|
border-radius: 0.25rem; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .card-header { |
||||
|
border: 0; |
||||
|
padding: 0; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .card-header>.card-tools { |
||||
|
float: right; |
||||
|
margin-right: 0.375rem; |
||||
|
margin-top: 5px; |
||||
|
margin-bottom: 10px; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .card-header i.fa { |
||||
|
font-size: 1.3rem; |
||||
|
display: inline-block; |
||||
|
padding: 0 0px; |
||||
|
margin: 0 0px; |
||||
|
color: #57769c; |
||||
|
opacity: .8; |
||||
|
-webkit-transition: 0.3s linear; |
||||
|
transition: 0.3s linear; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .dropdown-toggle::after { |
||||
|
display: inline-block; |
||||
|
margin-left: 0.255em; |
||||
|
vertical-align: 0.255em; |
||||
|
content: ""; |
||||
|
border-top: 0.3em solid; |
||||
|
border-right: 0.3em solid transparent; |
||||
|
border-bottom: 0; |
||||
|
border-left: 0.3em solid transparent; |
||||
|
color: #7891af; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .account-details { |
||||
|
display: flex; |
||||
|
} |
||||
|
.main-title { |
||||
|
color: #a3a3a3; |
||||
|
display: block; |
||||
|
margin-bottom: 5px; |
||||
|
font-size: 20px; |
||||
|
font-weight: 400; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .main-title { |
||||
|
display: block; |
||||
|
margin-bottom: 5px; |
||||
|
font-size: 13px; |
||||
|
font-weight: 600; |
||||
|
color: #fff !important; |
||||
|
text-transform: uppercase; |
||||
|
padding: 1rem; |
||||
|
border-radius: 5px; |
||||
|
border-bottom-left-radius: 0; |
||||
|
border-bottom-right-radius: 0; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .card-body { |
||||
|
background-color: rgba(255, 255, 255, 0.9) !important; |
||||
|
color: #212529; |
||||
|
padding-top: 0; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .tile.wide.invoice { |
||||
|
margin-bottom: 27px; |
||||
|
-webkit-box-shadow: 1px 5px 24px 0 rgba(68, 102, 242, 0.05); |
||||
|
box-shadow: 1px 5px 24px 0 rgba(68, 102, 242, 0); |
||||
|
background-color: #ffffff; |
||||
|
border-radius: 5px; |
||||
|
position: relative; |
||||
|
width: 100%; |
||||
|
padding: 0rem 0rem; |
||||
|
border: 1px solid rgba(0, 0, 0, 0.07); |
||||
|
height: 140px; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .box-1 .main-title { |
||||
|
background: #67b7dc; |
||||
|
color: #fff; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .box-2 .main-title { |
||||
|
background: #6794dc !important; |
||||
|
color: #fff; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .box-3 .main-title { |
||||
|
background: #8067dc; |
||||
|
color: #fff; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .box-4 .main-title { |
||||
|
background: #c767dc; |
||||
|
color: #fff; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .count { |
||||
|
margin-bottom: 1rem; |
||||
|
} |
||||
|
.accounts-dashboard-wrap .main-title~div { |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
margin-top: 1rem; |
||||
|
padding: 1rem; |
||||
|
background: #fff; |
||||
|
} |
||||
|
#location_table { |
||||
|
background-color: #fff; |
||||
|
color: (--mauve); |
||||
|
} |
||||
|
#tile_main_div:hover { |
||||
|
border-top-left-radius: 10px; |
||||
|
border-bottom-left-radius: 10px; |
||||
|
animation-name: example; |
||||
|
animation-duration: 0.25s; |
||||
|
border-left: 8px solid var(--mauve); |
||||
|
box-shadow: 0 14px 28px rgba(0,0,0,0.25), 0 10px 10px rgba(0,0,0,0.22); |
||||
|
} |
||||
|
#tiles:hover { |
||||
|
border-top-left-radius: 10px; |
||||
|
border-bottom-left-radius: 10px; |
||||
|
animation-name: example; |
||||
|
animation-duration: 0.25s; |
||||
|
box-shadow: 0 14px 28px rgba(0,0,0,0.25), 0 10px 10px rgba(0,0,0,0.22); |
||||
|
} |
||||
|
.details_table{ |
||||
|
align-content: left; |
||||
|
} |
||||
|
.graph_details_table{ |
||||
|
position: absolute; |
||||
|
top: 45px; |
||||
|
right: 15px; |
||||
|
background-color: white; |
||||
|
border-collapse: collapse; |
||||
|
border: 1px solid #ddd; |
||||
|
} |
||||
|
.graph_details_table th{ |
||||
|
background-color:#67b7dc; |
||||
|
color: white; |
||||
|
width: 250px; |
||||
|
height: 30px; |
||||
|
} |
||||
|
.graph_details_table td{ |
||||
|
border: 1px solid #ddd; |
||||
|
height: 20px; |
||||
|
} |
||||
|
.graph_details_table tr:nth-child(even){background-color: #f2f2f2;} |
||||
|
.graph_details_table tr:hover {background-color: #ddd;} |
||||
|
#product_moves_selection{ |
||||
|
position: relative; |
||||
|
right: 10px; |
||||
|
top: 5px; |
||||
|
} |
||||
|
:root { |
||||
|
/* Primary */ |
||||
|
--mauve: #7D7EAF; |
||||
|
--pink-dark: #BD85BA; |
||||
|
--pink: #F78EAD; |
||||
|
--peach: #FFA48E; |
||||
|
--orange: #FFCA71; |
||||
|
--gold: #CEA716; |
||||
|
--green: #1EC198; |
||||
|
--grey: #a0a0a0; |
||||
|
/* Light */ |
||||
|
--mauve-light: #e5e5ef; |
||||
|
--pink-dark-light: #f2e7f1; |
||||
|
--pink-light: #fde8ef; |
||||
|
--peach-light: #ffede8; |
||||
|
--orange-light: #fff4e3; |
||||
|
--gold-light: #faf6e8; |
||||
|
--green-light: #e9f9f5; |
||||
|
--grey-light: #e0e0e0; |
||||
|
|
||||
|
/*Lighter*/ |
||||
|
--grey-lighter: #fafafa; |
||||
|
--grey-dark-lighter: #f3f3f3; |
||||
|
} |
||||
|
/* Background */ |
||||
|
.bg-mauve-light { |
||||
|
background-color: var(--mauve-light); |
||||
|
} |
||||
|
.bg-pink-dark-light { |
||||
|
background-color: var(--pink-dark-light); |
||||
|
} |
||||
|
.bg-pink-light { |
||||
|
background-color: var(--pink-light); |
||||
|
} |
||||
|
.bg-peach-light { |
||||
|
background-color: var(--peach-light); |
||||
|
} |
||||
|
.bg-orange-light { |
||||
|
background-color: var(--orange-light); |
||||
|
} |
||||
|
.bg-gold-light { |
||||
|
background-color: var(--gold-light); |
||||
|
} |
||||
|
.bg-green-light { |
||||
|
background-color: var(--green-light); |
||||
|
} |
||||
|
/* Text */ |
||||
|
.text-mauve { |
||||
|
color: var(--mauve); |
||||
|
} |
||||
|
.text-pink-dark { |
||||
|
color: var(--pink-dark); |
||||
|
} |
||||
|
.text-pink { |
||||
|
color: var(--pink); |
||||
|
} |
||||
|
.text-peach { |
||||
|
color: var(--peach); |
||||
|
} |
||||
|
.text-orange { |
||||
|
color: var(--orange); |
||||
|
} |
||||
|
.text-gold { |
||||
|
color: var(--gold); |
||||
|
} |
||||
|
.text-green { |
||||
|
color: var(--green); |
||||
|
} |
||||
|
/* Cards */ |
||||
|
/*.dashboard-card { |
||||
|
border-radius: 0.3rem; |
||||
|
display: flex; |
||||
|
justify-content: center; |
||||
|
padding: 1.7rem 1.5rem 1.5rem 1.5rem; |
||||
|
margin: 1rem auto; |
||||
|
height: 90px; |
||||
|
}*/ |
||||
|
.dashboard-card__icon-container { |
||||
|
height: 50px; |
||||
|
width: 50px; |
||||
|
border-radius: 50%; |
||||
|
} |
||||
|
.dashboard-card__icon-container i { |
||||
|
font-size: 20px; |
||||
|
} |
||||
|
.dashboard-card__details { |
||||
|
margin-left: 0rem !important; |
||||
|
max-width: 120px; |
||||
|
} |
||||
|
.dashboard-card__details h3 { |
||||
|
font-weight: 700; |
||||
|
font-size: 1.5rem; |
||||
|
} |
||||
|
.dashboard-card__details h4 { |
||||
|
font-weight: 700; |
||||
|
font-size: 0.7rem; |
||||
|
color: var(--grey); |
||||
|
margin-top: -5px; |
||||
|
} |
||||
|
h2.section-header { |
||||
|
font-weight: 700; |
||||
|
font-size: 1.5rem; |
||||
|
} |
||||
|
.chart-container { |
||||
|
border-radius: 0.3rem; |
||||
|
padding: 1rem; |
||||
|
margin: 1rem auto; |
||||
|
} |
||||
|
.chart-container.card-shadow { |
||||
|
height: 100%; |
||||
|
} |
||||
|
.half_chart.chart-container.card-shadow { |
||||
|
height: 49%; |
||||
|
} |
||||
|
.chart-container h2 { |
||||
|
font-weight: 700; |
||||
|
font-size: 1.125rem; |
||||
|
} |
||||
|
.item-container { |
||||
|
background-color: var(--grey-lighter); |
||||
|
border-radius: 0.3rem; |
||||
|
padding: 1.2rem 1rem; |
||||
|
margin: 1rem auto; |
||||
|
} |
||||
|
.item-container:hover { |
||||
|
background-color: var(--grey-dark-lighter); |
||||
|
transition: all 0.3s ease-in-out; |
||||
|
cursor: pointer; |
||||
|
} |
||||
|
.count-container { |
||||
|
font-weight: 700; |
||||
|
font-size: 2rem; |
||||
|
background-color: var(--mauve-light); |
||||
|
color: var(--mauve); |
||||
|
height: 60px !important; |
||||
|
width: 60px !important; |
||||
|
border-radius: 50%; |
||||
|
display: -webkit-box; |
||||
|
display: -webkit-flex; |
||||
|
display: flex; |
||||
|
justify-content: center; |
||||
|
align-items: center; |
||||
|
} |
||||
|
.item-header { |
||||
|
display: flex; |
||||
|
align-items: flex-start; |
||||
|
} |
||||
|
.item-title h3 { |
||||
|
font-size: 1.3rem; |
||||
|
font-weight: 700; |
||||
|
} |
||||
|
.item-content ul { |
||||
|
list-style: none; |
||||
|
padding-left: 0px; |
||||
|
} |
||||
|
.item-content ul>li { |
||||
|
font-size: 0.9rem; |
||||
|
color: var(--grey); |
||||
|
font-weight: 700; |
||||
|
} |
||||
|
/* Misc */ |
||||
|
.card-shadow { |
||||
|
-webkit-box-shadow: 1px 3px 5px 0px rgba(222, 222, 222, 1); |
||||
|
-moz-box-shadow: 1px 3px 5px 0px rgba(222, 222, 222, 1); |
||||
|
box-shadow: 1px 3px 5px 0px rgba(222, 222, 222, 1); |
||||
|
} |
||||
|
.table td, |
||||
|
.table th { |
||||
|
border-top: 1px solid #eceff2; |
||||
|
} |
||||
|
.crm_scroll_table { |
||||
|
max-height: 395px; |
||||
|
overflow-y: auto; |
||||
|
} |
||||
|
.recent_activity_div .crm_scroll_table { |
||||
|
max-height: 435px; |
||||
|
} |
||||
|
.crm_scroll_table thead { |
||||
|
position: sticky; |
||||
|
top: 0; |
||||
|
} |
||||
|
.dashboard-card__stat_late:hover { |
||||
|
border-bottom-color: darkgray; |
||||
|
} |
||||
|
.dashboard-card__stat_waiting:hover { |
||||
|
border-bottom-color: darkgray; |
||||
|
} |
||||
|
.dashboard-card__stat_backorder:hover { |
||||
|
border-bottom-color: darkgray; |
||||
|
} |
||||
|
|
||||
|
.location_value { |
||||
|
font-weight: 700; |
||||
|
font-size: 1.2rem; |
||||
|
text-align: center; |
||||
|
} |
||||
|
.btn__custom-info{ |
||||
|
background-color: #e9ebf6; |
||||
|
color: #070920; |
||||
|
border-radius: 1.5rem; |
||||
|
padding: 0.15rem 2rem; |
||||
|
border: 1px solid #dddfea; |
||||
|
position: absolute; |
||||
|
right: 0px; |
||||
|
top: -3px; |
||||
|
} |
||||
|
.btn__custom-info:hover{ |
||||
|
background-color: #dddfea; |
||||
|
border: 1px solid #d2d4dd; |
||||
|
transition: all 0.3s ease-in-out; |
||||
|
} |
||||
|
.btn_info { |
||||
|
position: absolute; |
||||
|
top: 18px; |
||||
|
right: 17px; |
||||
|
background-color: #e9ebf6; |
||||
|
height: 28px; |
||||
|
width: 26px; |
||||
|
border-radius: 24%; |
||||
|
} |
||||
|
#top_product_selection { |
||||
|
position: absolute; |
||||
|
top: 18px; |
||||
|
} |
||||
|
#top_product_button { |
||||
|
position: absolute; |
||||
|
top: 1px; |
||||
|
right: 63px; |
||||
|
} |
||||
|
#product_move_select { |
||||
|
position: absolute; |
||||
|
top: 1px; |
||||
|
right: 63px; |
||||
|
} |
||||
|
#product_move_selection { |
||||
|
position: absolute; |
||||
|
top: 18px; |
||||
|
} |
||||
|
#stock_move_select { |
||||
|
position: absolute; |
||||
|
top: 1px; |
||||
|
right: 63px; |
||||
|
} |
||||
|
#stock_moves_selection { |
||||
|
position: absolute; |
||||
|
top: 18px; |
||||
|
} |
||||
|
.location_table_value{ |
||||
|
text-align: center; |
||||
|
} |
||||
|
/* X-Small devices (portrait phones, less than 576px)*/ |
||||
|
@media (max-width: 575.98px) { |
||||
|
#top_product_selection{ |
||||
|
width: 180%; |
||||
|
margin-left: -100%; |
||||
|
} |
||||
|
#product_move_selection{ |
||||
|
width: 180%; |
||||
|
margin-left: -100%; |
||||
|
} |
||||
|
#stock_move_selection{ |
||||
|
width: 180%; |
||||
|
margin-left: -100%; |
||||
|
} |
||||
|
} |
||||
|
.tile-container { |
||||
|
padding: 1rem; |
||||
|
display: flex; |
||||
|
justify-content: space-around; |
||||
|
align-items: center; |
||||
|
flex-wrap: wrap; |
||||
|
border-radius: 0.5rem; |
||||
|
background-image: url('./assets/background.png'); |
||||
|
background-repeat: no-repeat; |
||||
|
background-size: cover; |
||||
|
background-position-x: right; |
||||
|
} |
||||
|
.tile-container:hover { |
||||
|
opacity: 0.9; |
||||
|
cursor: pointer; |
||||
|
transition: all 0.4s ease-in-out; |
||||
|
} |
||||
|
.title-container__icon-container { |
||||
|
padding: 1.3rem 1rem; |
||||
|
border-radius: 0.5rem; |
||||
|
} |
||||
|
.title-container__icon { |
||||
|
font-size: 1.5rem; |
||||
|
} |
||||
|
.title-container__count { |
||||
|
font-size: 1.6rem; |
||||
|
font-weight: 600; |
||||
|
} |
||||
|
.title-container__title { |
||||
|
font-size: 1rem; |
||||
|
font-weight: 600; |
||||
|
} |
||||
|
/* Colors */ |
||||
|
.red-bkg { |
||||
|
background-color: #FFE1E2; |
||||
|
} |
||||
|
.red-font { |
||||
|
color: #E8565E; |
||||
|
} |
||||
|
.blue-bkg { |
||||
|
background-color: #C2D5FF; |
||||
|
} |
||||
|
.blue-font { |
||||
|
color: #225AE3; |
||||
|
} |
||||
|
.green-bkg { |
||||
|
background-color: #BDE4E0; |
||||
|
} |
||||
|
.green-font { |
||||
|
color: #2CA79A; |
||||
|
} |
||||
|
.pink-bkg { |
||||
|
background-color: #FFE4EF; |
||||
|
} |
||||
|
.pink-font { |
||||
|
color: #CE3372; |
||||
|
} |
||||
|
.yellow-bkg { |
||||
|
background-color: #F9ECC6; |
||||
|
} |
||||
|
.yellow-font { |
||||
|
color: #CBA846; |
||||
|
} |
||||
|
.white-bkg { |
||||
|
background-color: #FFFFFF; |
||||
|
} |
||||
|
.white-font { |
||||
|
color: #FFFFFF; |
||||
|
} |
||||
|
/*Second Section CSS */ |
||||
|
.card-contianer__header { |
||||
|
background-color: #37274B; |
||||
|
padding: 0.4rem; |
||||
|
border-top: 3px solid #D84315; |
||||
|
} |
||||
|
.card-container__content { |
||||
|
padding: 1rem; |
||||
|
} |
||||
|
.card-container__normal-header { |
||||
|
font-size: 1.2rem; |
||||
|
color: #000000; |
||||
|
font-weight: 600; |
||||
|
} |
||||
|
.card-container__header-text { |
||||
|
font-size: 1.2rem; |
||||
|
color: #FFFFFF; |
||||
|
font-weight: 400; |
||||
|
text-align: center; |
||||
|
} |
||||
|
.dashboard-card { |
||||
|
box-shadow: rgba(60, 64, 67, 0.3) 0px 1px 2px 0px, rgba(60, 64, 67, 0.15) 0px 2px 6px 2px; |
||||
|
padding: 1.5rem; |
||||
|
margin: 0.5rem auto; |
||||
|
min-height: 185px; |
||||
|
display: flex !important; |
||||
|
justify-content: space-between !important; |
||||
|
align-items: flex-start !important; |
||||
|
} |
||||
|
.dashboard-card--border-top { |
||||
|
border-top: 5px solid #000; |
||||
|
} |
||||
|
.dashboard-card--border-top-red { |
||||
|
border-color: #D32F2F; |
||||
|
} |
||||
|
.dashboard-card--border-top-blue { |
||||
|
border-color: #2962FF; |
||||
|
} |
||||
|
.dashboard-card--border-top-green { |
||||
|
border-color: #00FF00; |
||||
|
} |
||||
|
.dashboard-card--border-top-purple { |
||||
|
border-color: #800080; |
||||
|
} |
||||
|
.dashboard-card--border-top-brown { |
||||
|
border-color: #964B00; |
||||
|
} |
||||
|
.dashboard-card--border-top-pink { |
||||
|
border-color: #FFC0CB; |
||||
|
} |
||||
|
.dashboard-card--border-top-grey { |
||||
|
border-color: #696969; |
||||
|
} |
||||
|
.dashboard-card--border-top-black { |
||||
|
border-color: black; |
||||
|
} |
||||
|
.dashboard-card--border-top-rebecca { |
||||
|
border-color: #663399; |
||||
|
} |
||||
|
.dashboard-card--border-top-steel { |
||||
|
border-color: #607D8B; |
||||
|
} |
||||
|
.dashboard-card--border-top-orange { |
||||
|
border-color: #FFA500; |
||||
|
} |
||||
|
.dashboard-card__title { |
||||
|
font-weight: bold; |
||||
|
display: block; |
||||
|
margin-top: 0.5rem; |
||||
|
} |
||||
|
.dashboard-card__count { |
||||
|
font-size: 3rem; |
||||
|
} |
||||
|
.dashboard-card__stats { |
||||
|
list-style: none; |
||||
|
padding-left: 0; |
||||
|
width: 50% |
||||
|
} |
||||
|
.dashboard-card__stat_late { |
||||
|
padding: 0.5rem 0rem; |
||||
|
border-bottom: 1px solid rgba(0, 0, 0, 0.1); |
||||
|
} |
||||
|
.dashboard-card__stat_waiting { |
||||
|
padding: 0.5rem 0rem; |
||||
|
border-bottom: 1px solid rgba(0, 0, 0, 0.1); |
||||
|
} |
||||
|
.dashboard-card__stat_backorder { |
||||
|
padding: 0.5rem 0rem; |
||||
|
border-bottom: 1px solid rgba(0, 0, 0, 0.1); |
||||
|
} |
||||
|
.dashboard-card__stat-count_late { |
||||
|
min-width: 25px; |
||||
|
min-height: 20px; |
||||
|
background-color: rgba(0, 0, 0, 0.1); |
||||
|
font-size: 0.9rem; |
||||
|
font-weight: bold; |
||||
|
color: rgba(0, 0, 0, 0.6); |
||||
|
display: flex; |
||||
|
justify-content: center; |
||||
|
align-items: center; |
||||
|
border-radius: 50%; |
||||
|
} |
||||
|
.dashboard-card__stat-count_waiting { |
||||
|
min-width: 25px; |
||||
|
min-height: 20px; |
||||
|
background-color: rgba(0, 0, 0, 0.1); |
||||
|
font-size: 0.9rem; |
||||
|
font-weight: bold; |
||||
|
color: rgba(0, 0, 0, 0.6); |
||||
|
display: flex; |
||||
|
justify-content: center; |
||||
|
align-items: center; |
||||
|
border-radius: 50%; |
||||
|
} |
||||
|
.dashboard-card__stat-count_backorder { |
||||
|
min-width: 25px; |
||||
|
min-height: 20px; |
||||
|
background-color: rgba(0, 0, 0, 0.1); |
||||
|
font-size: 0.9rem; |
||||
|
font-weight: bold; |
||||
|
color: rgba(0, 0, 0, 0.6); |
||||
|
display: flex; |
||||
|
justify-content: center; |
||||
|
align-items: center; |
||||
|
border-radius: 50%; |
||||
|
} |
||||
|
.oh_dashboards { |
||||
|
font-family: 'Raleway', sans-serif; |
||||
|
} |
||||
|
.main-part{ |
||||
|
width:100%; |
||||
|
margin:0 auto; |
||||
|
text-align: center; |
||||
|
padding: 0px 5px; |
||||
|
} |
||||
|
.cpanel{ |
||||
|
width:32%; |
||||
|
display: inline-block; |
||||
|
background-color:#34495E; |
||||
|
color:#fff; |
||||
|
margin-top: 50px; |
||||
|
} |
||||
|
.icon-part i{ |
||||
|
font-size: 30px; |
||||
|
padding:10px; |
||||
|
border:1px solid #fff; |
||||
|
border-radius:50%; |
||||
|
margin-top:-25px; |
||||
|
margin-bottom: 10px; |
||||
|
background-color:#34495E; |
||||
|
} |
||||
|
.icon-part p{ |
||||
|
margin:0px; |
||||
|
font-size: 20px; |
||||
|
padding-bottom: 10px; |
||||
|
} |
||||
|
.card-content-part{ |
||||
|
background-color: #2F4254; |
||||
|
padding: 5px 0px; |
||||
|
} |
||||
|
.cpanel .card-content-part:hover{ |
||||
|
background-color: #5a5a5a; |
||||
|
cursor: pointer; |
||||
|
} |
||||
|
.card-content-part a{ |
||||
|
color:#fff; |
||||
|
text-decoration: none; |
||||
|
} |
||||
|
.cpanel-green .icon-part,.cpanel-green .icon-part i{ |
||||
|
background-color: #16A085; |
||||
|
} |
||||
|
.cpanel-green .card-content-part{ |
||||
|
background-color: #149077; |
||||
|
} |
||||
|
.cpanel-orange .icon-part,.cpanel-orange .icon-part i{ |
||||
|
background-color: #F39C12; |
||||
|
} |
||||
|
.cpanel-orange .card-content-part{ |
||||
|
background-color: #DA8C10; |
||||
|
} |
||||
|
.cpanel-blue .icon-part,.cpanel-blue .icon-part i{ |
||||
|
background-color: #2980B9; |
||||
|
} |
||||
|
.cpanel-blue .card-content-part{ |
||||
|
background-color:#2573A6; |
||||
|
} |
||||
|
.cpanel-red .icon-part,.cpanel-red .icon-part i{ |
||||
|
background-color:#E74C3C; |
||||
|
} |
||||
|
.cpanel-red .card-content-part{ |
||||
|
background-color:#CF4436; |
||||
|
} |
||||
|
.cpanel-skyblue .icon-part,.cpanel-skyblue .icon-part i{ |
||||
|
background-color:#8E44AD; |
||||
|
} |
||||
|
.cpanel-skyblue .card-content-part{ |
||||
|
background-color:#803D9B; |
||||
|
} |
||||
|
.icon-part{ |
||||
|
height: 121px; |
||||
|
background-color: #16A085; |
||||
|
min-height: 120px; |
||||
|
} |
||||
|
.col-lg-3:hover { |
||||
|
-ms-transform: scale(1); |
||||
|
/* IE 9 */ |
||||
|
-webkit-transform: scale(1); |
||||
|
/* Safari 3-8 */ |
||||
|
transform: scale(1.05); |
||||
|
} |
||||
|
option { |
||||
|
color: black; |
||||
|
} |
@ -0,0 +1,344 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<!-- Inventory Dashboard template --> |
||||
|
<templates id="inventory_dashboard_template" xml:space="preserve"> |
||||
|
<t t-name="Dashboard" owl="1"> |
||||
|
<div class="oh_dashboards" t-ref="root" style="height:100%; overflow-y: scroll; overflow-x: hidden;"> |
||||
|
<!-- Tiles --> |
||||
|
<div class="tiles"> |
||||
|
<div class="container-fluid py-5"> |
||||
|
<div class="row" id="set"> |
||||
|
<t t-foreach="state.op_types" t-as="op_type" t-key="op_type_index"> |
||||
|
<div class="col-sm-12 col-md-6 col-lg-3" t-att-id="op_type" t-on-click="onclick_tiles"> |
||||
|
<div t-attf-class="dashboard-card dashboard-card--border-top dashboard-card--border-top-#{state.colors[op_type_index]}"> |
||||
|
<div class="dashboard-card__details"> |
||||
|
<span class="dashboard-card__title"> |
||||
|
<t t-out="state.operations[op_type]"/> |
||||
|
</span> |
||||
|
<span class="count-container"><t t-out="state.op_types[op_type]"/></span> |
||||
|
</div> |
||||
|
<ul class="dashboard-card__stats"> |
||||
|
<t t-if="op_type in state.late_status"> |
||||
|
<li class="dashboard-card__stat_late" t-att-id="op_type" t-on-click="onclick_late_status"> |
||||
|
<div class="d-flex justify-content-between align-items-center text-dark text-decoration-none"> |
||||
|
<div class="dashboard-card__stat-title_late"> |
||||
|
Late |
||||
|
</div> |
||||
|
<div class="dashboard-card__stat-count_late"> |
||||
|
<t t-out="state.late_status[op_type]"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</li> |
||||
|
</t> |
||||
|
<t t-if="op_type in state.waiting_status"> |
||||
|
<li class="dashboard-card__stat_waiting" t-att-id="op_type" t-on-click="onclick_waiting_status"> |
||||
|
<div class="d-flex justify-content-between align-items-center text-dark text-decoration-none"> |
||||
|
<div class="dashboard-card__stat-title_waiting"> |
||||
|
Waiting |
||||
|
</div> |
||||
|
<div class="dashboard-card__stat-count_waiting"> |
||||
|
<t t-out="state.waiting_status[op_type]"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</li> |
||||
|
</t> |
||||
|
<t t-if="op_type in state.backorder_status"> |
||||
|
<li class="dashboard-card__stat_backorder" t-att-id="op_type" t-on-click="onclick_backorders_status"> |
||||
|
<div class="d-flex justify-content-between align-items-center text-dark text-decoration-none"> |
||||
|
<div class="dashboard-card__stat-title_backorder"> |
||||
|
Backorder |
||||
|
</div> |
||||
|
<div class="dashboard-card__stat-count_backorder"> |
||||
|
<t t-out="state.backorder_status[op_type]"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</li> |
||||
|
</t> |
||||
|
</ul> |
||||
|
</div> |
||||
|
</div> |
||||
|
</t> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<!-- Graphs --> |
||||
|
<div class="row mt-4 px-4" id="graphs" style="padding-bottom:30px;"> |
||||
|
<!-- Top moving products - bar graph --> |
||||
|
<div class="year_to_date_graph_div col-sm-12 col-md-6 my-4"> |
||||
|
<div class="chart-container card-shadow" id="tiles"> |
||||
|
<div style="height: 20px; max-height: 20px;"> |
||||
|
<h2>Top Moving Products</h2> |
||||
|
<div class="form-group col-2" |
||||
|
id="top_product_button"> |
||||
|
<select id="top_product_selection" class="btn btn-primary" t-on-change="onchange_top_product_selection"> |
||||
|
<option id="top_last_10_days" |
||||
|
value="top_last_10_days" |
||||
|
selected="selected">Last 10 Days</option> |
||||
|
<option id="top_last_30_days" |
||||
|
value="top_last_30_days">Last 30 Days</option> |
||||
|
<option id="top_last_3_month" |
||||
|
value="top_last_3_month">Last 3 Month</option> |
||||
|
<option id="top_last_year" |
||||
|
value="top_last_year">Last Year</option> |
||||
|
</select> |
||||
|
</div> |
||||
|
<button class="btn_info" id="top_product_info" |
||||
|
title="Show Details" t-on-click="onclick_top_product_info"> |
||||
|
<i class="fa fa-ellipsis-v"/> |
||||
|
</button> |
||||
|
<table class="graph_details_table" id="pro_info" style="display:none;"> |
||||
|
<tr> |
||||
|
<th>Products</th> |
||||
|
<th>Quantity Transferred</th> |
||||
|
</tr> |
||||
|
<t t-foreach="state.countDictionary" t-as="count" t-key="count_index"> |
||||
|
<tr> |
||||
|
<td><t t-out="count"/></td> |
||||
|
<td><t t-esc="state.countDictionary[count]"/></td> |
||||
|
</tr> |
||||
|
</t> |
||||
|
</table> |
||||
|
</div> |
||||
|
<hr/> |
||||
|
<div class="graph_canvas" style="margin-top: 30px;"> |
||||
|
<canvas id="canvaspie" height="500px" |
||||
|
width="150px"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<!-- Product categories - doughnut chart --> |
||||
|
<div class="year_to_date_graph_div col-sm-12 col-md-6 my-4"> |
||||
|
<div class="chart-container card-shadow" id="tiles"> |
||||
|
<div style="height: 20px; max-height: 20px;"> |
||||
|
<h2>Product Categories</h2> |
||||
|
<button class="btn_info" id="pro_cate_info" |
||||
|
title="Show Details" t-on-click="onclick_product_category_info"> |
||||
|
<i class="fa fa-ellipsis-v"/> |
||||
|
</button> |
||||
|
<table class="graph_details_table" id="category_table"> |
||||
|
<tr> |
||||
|
<th>Categories</th> |
||||
|
<th>Onhand Quantity</th> |
||||
|
</tr> |
||||
|
<t t-foreach="state.categCountDict" t-as="data" t-key="data_index"> |
||||
|
<tr> |
||||
|
<td><t t-out="data"/></td> |
||||
|
<td><t t-out="state.categName[data_index]"/></td> |
||||
|
</tr> |
||||
|
</t> |
||||
|
</table> |
||||
|
</div> |
||||
|
<hr/> |
||||
|
<div class="graph_canvas" style="margin-top: 30px;"> |
||||
|
<canvas class="canpie" id="product_category" height="500px" |
||||
|
width="150px"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<!-- Product moves by category graph --> |
||||
|
<div class="year_to_date_graph_div col-sm-12 col-md-6 my-4"> |
||||
|
<div class="chart-container card-shadow" id="tiles"> |
||||
|
<div style="height: 20px; max-height: 20px;" |
||||
|
class="d-flex justify-content-between align-items-center"> |
||||
|
<h2>Product Moves By Category</h2> |
||||
|
<div class="form-group col-2" |
||||
|
id="product_move_select"> |
||||
|
<select id="product_move_selection" t-ref="product_move_selection" class="btn btn-primary" t-on-change="onchange_product_moves_selection"> |
||||
|
<t t-foreach="state.category" t-as="categ" t-key="categ_index"> |
||||
|
<t t-if="categ_index == 0"> |
||||
|
<option t-att-id="categ_index" t-att-value="state.categoryId[categ_index]" selected="selected"> |
||||
|
<t t-out="state.category[categ_index]"/> |
||||
|
</option> |
||||
|
</t> |
||||
|
<t t-else=""> |
||||
|
<option t-att-id="categ_index" t-attf-value="#{state.categoryId[categ_index]}"> |
||||
|
<t t-out="state.category[categ_index]"/> |
||||
|
</option> |
||||
|
</t> |
||||
|
</t> |
||||
|
</select> |
||||
|
</div> |
||||
|
<button class="btn_info" id="product_move_info" title="Show Details" t-on-click="onclick_product_move_info"> |
||||
|
<i class="fa fa-ellipsis-v"/> |
||||
|
</button> |
||||
|
<table class="graph_details_table" id="product_move_table"> |
||||
|
<tr> |
||||
|
<th>Products</th> |
||||
|
<th>Quantity Done</th> |
||||
|
</tr> |
||||
|
<t t-foreach="state.monthly_stock_count" t-as="monthly_count" t-key="monthly_count_index"> |
||||
|
<tr> |
||||
|
<td><t t-out="state.monthly_stock[monthly_count_index]"/></td> |
||||
|
<td><t t-esc="monthly_count"/></td> |
||||
|
</tr> |
||||
|
</t> |
||||
|
</table> |
||||
|
</div> |
||||
|
<hr/> |
||||
|
<div class="graph_canvas" style="margin-top: 30px;"> |
||||
|
<canvas id="product_move_graph" height="500px" |
||||
|
width="150px"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<!-- Stock moves by location - pie chart --> |
||||
|
<div class="year_to_date_graph_div col-sm-12 col-md-6 my-4"> |
||||
|
<div class="chart-container card-shadow" id="tiles"> |
||||
|
<div style="height: 20px; max-height: 20px;" |
||||
|
class="d-flex justify-content-between align-items-center"> |
||||
|
<h2>Stock Moves By Location</h2> |
||||
|
<div class="form-group col-2" |
||||
|
id="stock_move_select"> |
||||
|
<select id="stock_moves_selection" class="btn btn-primary" t-on-change="onchange_stock_moves_selection"> |
||||
|
<option id="last_10_days" value="last_10_days" selected="selected"> |
||||
|
Last 10 Days</option> |
||||
|
<option id="this_month" value="this_month">Last month</option> |
||||
|
<option id="last_3_month" |
||||
|
value="last_3_month">Last 3 months</option> |
||||
|
<option id="last_year" value="last_year">Last Year</option> |
||||
|
</select> |
||||
|
</div> |
||||
|
<button class="btn_info" id="stock_move_info" title="Show Details" |
||||
|
t-on-click="onclick_stock_move_info"> |
||||
|
<i class="fa fa-ellipsis-v"/> |
||||
|
</button> |
||||
|
<table class="graph_details_table" id="stock_move_table" style="display:none;"> |
||||
|
<tr> |
||||
|
<th>Location</th> |
||||
|
<th>Stock Moves Count</th> |
||||
|
</tr> |
||||
|
<t t-foreach="state.MoveData" t-as="move" t-key="move_index"> |
||||
|
<tr> |
||||
|
<td><t t-out="move"/></td> |
||||
|
<td><t t-esc="state.MoveData[move]"/></td> |
||||
|
</tr> |
||||
|
</t> |
||||
|
</table> |
||||
|
</div> |
||||
|
<hr/> |
||||
|
<div class="graph_canvas" style="margin-top: 30px;"> |
||||
|
<canvas id="stock_moves" height="500px" |
||||
|
width="150px"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<!-- Operation types bar graph --> |
||||
|
<div class="year_to_date_graph_div col-sm-12 col-md-6 my-4"> |
||||
|
<div class="chart-container card-shadow" id="tiles"> |
||||
|
<div style="height: 20px; max-height: 20px;"> |
||||
|
<h2>Operation Types</h2> |
||||
|
<button class="btn_info" id="operation_type_info" |
||||
|
title="Show Details" t-on-click="onclick_operation_type_info"> |
||||
|
<i class="fa fa-ellipsis-v"/> |
||||
|
</button> |
||||
|
<table class="graph_details_table" |
||||
|
id="operation_type_table"> |
||||
|
<tr> |
||||
|
<th>Operation Types</th> |
||||
|
<th>Transfer Count</th> |
||||
|
</tr> |
||||
|
<t t-foreach="state.operationDict" t-as="count" t-key="count_index"> |
||||
|
<tr> |
||||
|
<td><t t-out="count"/></td> |
||||
|
<td><t t-esc="state.operationDict[count]"/></td> |
||||
|
</tr> |
||||
|
</t> |
||||
|
</table> |
||||
|
</div> |
||||
|
<hr/> |
||||
|
<div class="graph_canvas" style="margin-top: 30px;"> |
||||
|
<canvas id="operation" height="500px" width="150px"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<!-- Location graph --> |
||||
|
<div class="year_to_date_graph_div col-sm-12 col-md-6 my-4"> |
||||
|
<div class="chart-container card-shadow" id="tiles"> |
||||
|
<div style="height: 20px; max-height: 20px"> |
||||
|
<h2>Locations</h2> |
||||
|
</div> |
||||
|
<hr/> |
||||
|
<table style="margin-top: 30px;" class="table table-hover" |
||||
|
id="location_table"> |
||||
|
<thead> |
||||
|
<tr> |
||||
|
<th><h2>Location</h2></th> |
||||
|
<th><h2 style="text-align: center;">On Hand Quantity</h2></th> |
||||
|
</tr> |
||||
|
</thead> |
||||
|
<tbody class="storage"> |
||||
|
<t t-foreach="state.location_data" t-as="location" t-key="location_index"> |
||||
|
<tr> |
||||
|
<td> |
||||
|
<t t-out="location"/> |
||||
|
</td> |
||||
|
<td class="location_table_value"> |
||||
|
<t t-esc="state.location_data[location]"/> |
||||
|
</td> |
||||
|
</tr> |
||||
|
</t> |
||||
|
</tbody> |
||||
|
</table> |
||||
|
</div> |
||||
|
</div> |
||||
|
<!-- Out of stock graph --> |
||||
|
<div class="year_to_date_graph_div col-sm-12 col-md-6 my-4" id="out_of_stock" style="display: none;"> |
||||
|
<div class="chart-container card-shadow" id="tiles"> |
||||
|
<div style="height: 20px; max-height: 20px;"> |
||||
|
<h2>Out of Stock Products</h2> |
||||
|
<button class="btn_info" id="out_of_stock_info" title="Show Details" t-on-click="onclick_out_of_stock_info"> |
||||
|
<i class="fa fa-ellipsis-v"/> |
||||
|
</button> |
||||
|
<table class="graph_details_table" id="out_of_stock_table"> |
||||
|
<tr> |
||||
|
<th>Products</th> |
||||
|
<th>Out of Quantity</th> |
||||
|
</tr> |
||||
|
<t t-foreach="state.out_stock" t-as="name" t-key="name_index"> |
||||
|
<tr> |
||||
|
<td><t t-out="name"/></td> |
||||
|
<td><t t-esc="state.out_stock_count[name_index]"/></td> |
||||
|
</tr> |
||||
|
</t> |
||||
|
</table> |
||||
|
</div><hr/> |
||||
|
<div class="graph_canvas" style="margin-top: 30px;"> |
||||
|
<canvas id="out_of_stock_graph" height="500px" width="150px"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<!-- Dead stock graph --> |
||||
|
<div class="year_to_date_graph_div col-sm-12 col-md-6 my-4" id="dead_stock" style="display:none;"> |
||||
|
<div class="chart-container card-shadow" id="tiles"> |
||||
|
<div style="height: 20px; max-height: 20px"> |
||||
|
<h2>Dead Stock</h2> |
||||
|
<button class="btn_info" id="dead_stock_info" title="Show Details" t-on-click="onclick_dead_stock_info"> |
||||
|
<i class="fa fa-ellipsis-v"/> |
||||
|
</button> |
||||
|
<table style="margin-top: 30px;" class="graph_details_table" |
||||
|
id="dead_stock_table"> |
||||
|
<tr> |
||||
|
<th><h2>Products</h2></th> |
||||
|
<th>Dead Quantity</th> |
||||
|
</tr> |
||||
|
<t t-foreach="state.dead_stock_name" t-as="stock_name" t-key="stock_name_index"> |
||||
|
<tr> |
||||
|
<td> |
||||
|
<t t-out="stock_name"/> |
||||
|
</td> |
||||
|
<td> |
||||
|
<t t-esc="state.dead_stock_count[stock_name_index]"/> |
||||
|
</td> |
||||
|
</tr> |
||||
|
</t> |
||||
|
</table> |
||||
|
</div> |
||||
|
<hr/> |
||||
|
<div class="graph_canvas" style="margin-top: 30px;"> |
||||
|
<canvas id="dead_stock_graph" height="500px" width="150px"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</t> |
||||
|
</templates> |
@ -0,0 +1,14 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<!-- Action for dashboard menu --> |
||||
|
<record id="dashboard_action" model="ir.actions.client"> |
||||
|
<field name="name">Dashboard</field> |
||||
|
<field name="tag">inventory_dashboard_tag</field> |
||||
|
</record> |
||||
|
<!-- Dashboard menu item --> |
||||
|
<menuitem id="dashboard_menu_root" name="Dashboard" |
||||
|
parent="stock.menu_stock_root" |
||||
|
action="dashboard_action" |
||||
|
groups="stock.group_stock_user" |
||||
|
sequence="-10"/> |
||||
|
</odoo> |
@ -0,0 +1,51 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<!-- Adding fields in settings to enable dead stock and out of stock graphs. --> |
||||
|
<record id="res_config_settings_view_form" model="ir.ui.view"> |
||||
|
<field name="name">res.config.settings.view.form.inherit.inventory.stock.dashboard.odoo</field> |
||||
|
<field name="model">res.config.settings</field> |
||||
|
<field name="priority" eval="99"/> |
||||
|
<field name="inherit_id" ref="stock.res_config_settings_view_form"/> |
||||
|
<field name="arch" type="xml"> |
||||
|
<block id="production_lot_info" position="after"> |
||||
|
<div class="app_settings_block"> |
||||
|
<h2>Dashboard</h2> |
||||
|
<div class="row mt16 o_settings_container"> |
||||
|
<div class="col-12 col-lg-6 o_setting_box"> |
||||
|
<div class="o_setting_left_pane"> |
||||
|
<field name="out_of_stock"/> |
||||
|
</div> |
||||
|
<div class="o_setting_right_pane"> |
||||
|
<label for="out_of_stock"/> |
||||
|
<div class="text-muted"> |
||||
|
Set Your Out Of Stock Quantity |
||||
|
</div> |
||||
|
<field name="out_of_stock_quantity" invisible="out_of_stock == False"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-12 col-lg-6 o_setting_box"> |
||||
|
<div class="o_setting_left_pane"> |
||||
|
<field name="dead_stock_bol"/> |
||||
|
</div> |
||||
|
<div class="o_setting_right_pane"> |
||||
|
<label for="dead_stock_bol"/> |
||||
|
<div class="text-muted"> |
||||
|
Show Dead Stocks In Dashboard |
||||
|
</div> |
||||
|
<div> |
||||
|
<field name="dead_stock" invisible="dead_stock_bol == False"/> |
||||
|
</div> |
||||
|
<div> |
||||
|
<field name="dead_stock_type" invisible="dead_stock_bol == False"/> |
||||
|
<span invisible="dead_stock_bol == False"> |
||||
|
  Duration |
||||
|
</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</block> |
||||
|
</field> |
||||
|
</record> |
||||
|
</odoo> |