@ -0,0 +1,47 @@ |
|||
.. image:: https://img.shields.io/badge/licence-LGPL--3-blue.svg |
|||
:target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html |
|||
:alt: License: LGPL-3 |
|||
|
|||
Packers & Movers Management |
|||
=========================== |
|||
* Packers & Movers Management module helps Users to book the trucks through online. |
|||
|
|||
Installation |
|||
============ |
|||
- www.odoo.com/documentation/16.0/setup/install.html |
|||
- Install our custom addon |
|||
|
|||
License |
|||
------- |
|||
General Public License, Version 3 (LGPL v3). |
|||
(https://www.odoo.com/documentation/user/16.0/legal/licenses/licenses.html) |
|||
|
|||
Company |
|||
------- |
|||
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__ |
|||
|
|||
Credits |
|||
------- |
|||
* Developer: |
|||
(V16) Afra M P @cybrosys |
|||
|
|||
Contacts |
|||
-------- |
|||
* Mail Contact : odoo@cybrosys.com |
|||
|
|||
Bug Tracker |
|||
----------- |
|||
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. |
|||
|
|||
Maintainer |
|||
========== |
|||
.. image:: https://cybrosys.com/images/logo.png |
|||
:target: https://cybrosys.com |
|||
This module is maintained by Cybrosys Technologies. |
|||
|
|||
For support and more information, please visit https://www.cybrosys.com |
|||
|
|||
Further information |
|||
=================== |
|||
HTML Description: `<static/description/index.html>`__ |
|||
|
@ -0,0 +1,25 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Afra MP (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 controllers |
|||
from . import models |
|||
from . import report |
|||
from . import wizard |
@ -0,0 +1,76 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Afra MP (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': 'Packers & Movers Management', |
|||
'version': '16.0.1.0.0', |
|||
'category': 'Industries,Website', |
|||
'summary': """Users can reserve trucks online with the help of the Packers & Movers Management module.""", |
|||
'description': """The Packers & Movers Management module helps Users to |
|||
book the trucks through online""", |
|||
'author': 'Cybrosys Techno Solutions', |
|||
'company': 'Cybrosys Techno Solutions', |
|||
'maintainer': 'Cybrosys Techno Solutions', |
|||
'website': "https://www.cybrosys.com", |
|||
'depends': ['website', 'fleet', 'mail', 'account'], |
|||
'data': [ |
|||
'security/packers_and_movers_security.xml', |
|||
'security/ir.model.access.csv', |
|||
'data/truck_booking_sequence.xml', |
|||
'data/website_form_data.xml', |
|||
'data/goods_type_data.xml', |
|||
'data/truck_type_data.xml', |
|||
'data/fleet_truck_data.xml', |
|||
'report/booking_form_report_templates.xml', |
|||
'report/booking_report_templates.xml', |
|||
'report/booking_report_views.xml', |
|||
'views/website_page_booking_templates.xml', |
|||
'views/goods_type_views.xml', |
|||
'views/truck_booking_views.xml', |
|||
'views/website_page_goods_templates.xml', |
|||
'views/website_page_truck_templates.xml', |
|||
'views/fleet_vehicle_model_views.xml', |
|||
'views/res_config_settings_views.xml', |
|||
'views/dashboard_views.xml', |
|||
'wizard/make_truck_booking_pdf_views.xml' |
|||
], |
|||
'assets': { |
|||
'web.assets_frontend': [ |
|||
'packers_and_movers_management/static/src/js/website_page.js', |
|||
'packers_and_movers_management/static/src/css/website_page.css', |
|||
], |
|||
'web.assets_backend': [ |
|||
'packers_and_movers_management/static/src/css/dashboard.css', |
|||
'packers_and_movers_management/static/src/scss/style.scss', |
|||
'packers_and_movers_management/static/src/js/lib/chart_bundle.js', |
|||
'packers_and_movers_management/static/src/js/dashboard_action.js', |
|||
'packers_and_movers_management/static/src/xml/dashboard_templates.xml' |
|||
] |
|||
}, |
|||
'external_dependencies': { |
|||
'python': ['geopy'], |
|||
}, |
|||
'images': ['static/description/banner.png'], |
|||
'license': 'LGPL-3', |
|||
'installable': True, |
|||
'auto_install': False, |
|||
'application': True, |
|||
} |
@ -0,0 +1,22 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Afra MP (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 packers_and_movers_management |
@ -0,0 +1,96 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Afra MP (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 math import cos, sin, asin, sqrt, radians |
|||
from geopy import Nominatim |
|||
from odoo import http |
|||
from odoo.http import request |
|||
|
|||
|
|||
class PackersAndMoversManagementController(http.Controller): |
|||
"""Class to add truck booking menu in website""" |
|||
|
|||
@http.route('/booking', type='http', auth='public', website=True) |
|||
def truck_booking(self): |
|||
"""Function to render truck booking values to XML""" |
|||
truck_ids = request.env['fleet.vehicle.model'].sudo().search([('vehicle_type', '=', 'truck')]) |
|||
goods_ids = request.env['goods.type'].sudo().search([]) |
|||
state_ids = request.env['res.country.state'].sudo().search([]) |
|||
country_ids = request.env['res.country'].sudo().search([]) |
|||
return http.request.render('packers_and_movers_management.truck_booking_page', |
|||
{'truck_ids': truck_ids, |
|||
'goods_ids': goods_ids, |
|||
'state_ids': state_ids, |
|||
'country_ids': country_ids}) |
|||
|
|||
@http.route('/booking/submit', type='http', auth='public', website=True) |
|||
def booking_success_page(self, **post): |
|||
"""Function to create booking and return to success page""" |
|||
partner_id = request.env['res.partner'].sudo().create({ |
|||
'name': post.get('name'), |
|||
'mobile': post.get('mobile_no'), |
|||
'city': post.get('city'), |
|||
'state_id': post.get('state'), |
|||
'country_id': post.get('country') |
|||
}) |
|||
booking_id = request.env['truck.booking'].sudo().create({ |
|||
'partner_id': partner_id.id, |
|||
'from_location': post.get('pickup_location'), |
|||
'to_location': post.get('drop_location'), |
|||
'truck_id': post.get('truck_type'), |
|||
'date': post.get('date'), |
|||
'goods_type_id': post.get('goods_type'), |
|||
'weight': post.get('weight'), |
|||
'unit': post.get('unit') |
|||
}) |
|||
return request.render('packers_and_movers_management.truck_booking_success_page', |
|||
{'partner_id': partner_id, |
|||
'booking_id': booking_id}) |
|||
|
|||
@http.route('/goods', type='http', auth='public', website=True) |
|||
def goods_type(self): |
|||
"""Function to return values to xml""" |
|||
goods_ids = request.env['goods.type'].sudo().search([]) |
|||
return http.request.render('packers_and_movers_management.goods_page', |
|||
{'goods_ids': goods_ids}) |
|||
|
|||
@http.route('/truck', type='http', auth='public', website=True) |
|||
def truck_details(self): |
|||
"""Function to render values to XML""" |
|||
truck_type_ids = request.env['truck.type'].sudo().search([]) |
|||
return http.request.render('packers_and_movers_management.truck_page', |
|||
{'truck_type_ids': truck_type_ids}) |
|||
|
|||
@http.route(['/geo/<from_location>/<to_location>'], type='json', auth="none", website=False, csrf=False) |
|||
def geo_location(self, from_location, to_location): |
|||
"""Function to Calculate distance between from and to location""" |
|||
locator = Nominatim(user_agent="myGeocoder") |
|||
from_location = locator.geocode(from_location) |
|||
to_location = locator.geocode(to_location) |
|||
from_lat = radians(from_location.latitude) |
|||
from_long = radians(from_location.longitude) |
|||
to_lat = radians(to_location.latitude) |
|||
to_long = radians(to_location.longitude) |
|||
dist_long = to_long - from_long |
|||
dist_lat = to_lat - from_lat |
|||
comp = sin(dist_lat / 2) ** 2 + cos(from_lat) * cos(to_lat) * sin( |
|||
dist_long / 2) ** 2 |
|||
return int(2 * asin(sqrt(comp)) * 6371) |
@ -0,0 +1,29 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<data noupdate="1"> |
|||
<record id="brand_tata" model="fleet.vehicle.model.brand"> |
|||
<field name="name">TATA</field> |
|||
</record> |
|||
<record id="brand_eicher" model="fleet.vehicle.model.brand"> |
|||
<field name="name">EICHER</field> |
|||
</record> |
|||
<record id="model_gold" model="fleet.vehicle.model"> |
|||
<field name="name">Tata Ace gold</field> |
|||
<field name="brand_id" ref="brand_tata"/> |
|||
<field name="vehicle_type">truck</field> |
|||
<field name="truck_type_id" ref="truck_type_data1"/> |
|||
</record> |
|||
<record id="model_ev" model="fleet.vehicle.model"> |
|||
<field name="name">Tata Ace EV</field> |
|||
<field name="brand_id" ref="brand_tata"/> |
|||
<field name="vehicle_type">truck</field> |
|||
<field name="truck_type_id" ref="truck_type_data1"/> |
|||
</record> |
|||
<record id="model_pro_3015" model="fleet.vehicle.model"> |
|||
<field name="name">Eicher Pro 3015</field> |
|||
<field name="brand_id" ref="brand_eicher"/> |
|||
<field name="vehicle_type">truck</field> |
|||
<field name="truck_type_id" ref="truck_type_data3"/> |
|||
</record> |
|||
</data> |
|||
</odoo> |
@ -0,0 +1,26 @@ |
|||
<?xml version="1.0" encoding="utf-8" ?> |
|||
<odoo> |
|||
<data noupdate="1"> |
|||
<record id="goods_type_data1" model="goods.type"> |
|||
<field name="name">Industrial Machinery</field> |
|||
</record> |
|||
<record id="goods_type_data2" model="goods.type"> |
|||
<field name="name">Household Goods</field> |
|||
</record> |
|||
<record id="goods_type_data3" model="goods.type"> |
|||
<field name="name">Healthcare/Pharmacy Products/Medicines</field> |
|||
</record> |
|||
<record id="goods_type_data4" model="goods.type"> |
|||
<field name="name">Electrical Wires/Cables</field> |
|||
</record> |
|||
<record id="goods_type_data5" model="goods.type"> |
|||
<field name="name">Scrap</field> |
|||
</record> |
|||
<record id="goods_type_data6" model="goods.type"> |
|||
<field name="name">Plants</field> |
|||
</record> |
|||
<record id="goods_type_data7" model="goods.type"> |
|||
<field name="name">Other</field> |
|||
</record> |
|||
</data> |
|||
</odoo> |
@ -0,0 +1,12 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<data noupdate="1"> |
|||
<record id="truck_booking_sequence" model="ir.sequence"> |
|||
<field name="name">Truck Booking Sequence</field> |
|||
<field name="code">truck.booking</field> |
|||
<field name="prefix">TR</field> |
|||
<field name="padding">5</field> |
|||
<field name="company_id" eval="False"/> |
|||
</record> |
|||
</data> |
|||
</odoo> |
@ -0,0 +1,41 @@ |
|||
<?xml version="1.0" encoding="utf-8" ?> |
|||
<odoo> |
|||
<data noupdate="1"> |
|||
<record id="truck_type_data1" model="truck.type"> |
|||
<field name="name">TATA ACE</field> |
|||
<field name="capacity">1</field> |
|||
<field name="weight">850</field> |
|||
<field name="unit">kg</field> |
|||
<field name="length">7</field> |
|||
<field name="width">4.8</field> |
|||
<field name="height">4.8</field> |
|||
</record> |
|||
<record id="truck_type_data2" model="truck.type"> |
|||
<field name="name">TATA 407</field> |
|||
<field name="capacity">1.5</field> |
|||
<field name="weight">2.5</field> |
|||
<field name="unit">tons</field> |
|||
<field name="length">9</field> |
|||
<field name="width">5.5</field> |
|||
<field name="height">5</field> |
|||
</record> |
|||
<record id="truck_type_data3" model="truck.type"> |
|||
<field name="name">EICHER 17 FEET</field> |
|||
<field name="capacity">2.5</field> |
|||
<field name="weight">5</field> |
|||
<field name="unit">tons</field> |
|||
<field name="length">17</field> |
|||
<field name="width">6</field> |
|||
<field name="height">7</field> |
|||
</record> |
|||
<record id="truck_type_data5" model="truck.type"> |
|||
<field name="name">CONTAINER 20 FT</field> |
|||
<field name="capacity">4</field> |
|||
<field name="weight">6.5</field> |
|||
<field name="unit">tons</field> |
|||
<field name="length">20</field> |
|||
<field name="width">8</field> |
|||
<field name="height">8</field> |
|||
</record> |
|||
</data> |
|||
</odoo> |
@ -0,0 +1,23 @@ |
|||
<?xml version="1.0" encoding="utf-8" ?> |
|||
<odoo> |
|||
<data noupdate="1"> |
|||
<record id="menu_booking" model="website.menu"> |
|||
<field name="name">Booking</field> |
|||
<field name="url">/booking</field> |
|||
<field name="parent_id" ref="website.main_menu"/> |
|||
<field name="sequence" type="int">50</field> |
|||
</record> |
|||
<record id="menu_truck" model="website.menu"> |
|||
<field name="name">Truck</field> |
|||
<field name="url">/truck</field> |
|||
<field name="parent_id" ref="website.main_menu"/> |
|||
<field name="sequence" type="int">51</field> |
|||
</record> |
|||
<record id="menu_goods" model="website.menu"> |
|||
<field name="name">Goods</field> |
|||
<field name="url">/goods</field> |
|||
<field name="parent_id" ref="website.main_menu"/> |
|||
<field name="sequence" type="int">52</field> |
|||
</record> |
|||
</data> |
|||
</odoo> |
@ -0,0 +1,6 @@ |
|||
## Module <packers_and_movers_management> |
|||
|
|||
#### 01.06.2023 |
|||
#### Version 16.0.1.0.0 |
|||
#### ADD |
|||
- Initial commit for Packers & Movers Management |
@ -0,0 +1,27 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Afra MP (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 account_move |
|||
from . import fleet_vehicle_model |
|||
from . import goods_type |
|||
from . import res_config_settings |
|||
from . import truck_booking |
|||
from . import truck_type |
@ -0,0 +1,40 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Afra MP (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 models |
|||
|
|||
|
|||
class AccountMove(models.Model): |
|||
"""Inherit the class account_move""" |
|||
_inherit = 'account.move' |
|||
|
|||
def action_post(self): |
|||
"""Super the action_post() to change truck_booking state into invoice""" |
|||
res = super(AccountMove, self).action_post() |
|||
if self: |
|||
booking_id = self.env['truck.booking']\ |
|||
.browse(self.env.context.get('active_id')) |
|||
amount = sum(self.search([ |
|||
('invoice_origin', '=', booking_id.reference_no), |
|||
('state', '!=', 'cancel')]).mapped('amount_untaxed_signed')) |
|||
if booking_id.amount == amount: |
|||
booking_id.write({'state': 'invoice'}) |
|||
return res |
@ -0,0 +1,32 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Afra MP (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 FleetVehicle(models.Model): |
|||
"""Inherit fleet.vehicle.model to add a vehicle type""" |
|||
_inherit = 'fleet.vehicle.model' |
|||
|
|||
vehicle_type = fields.Selection(selection_add=[('truck', 'Truck')], |
|||
ondelete={'truck': 'cascade'}) |
|||
truck_type_id = fields.Many2one('truck.type', string='Truck Type', |
|||
required=True, help='Select truck type') |
@ -0,0 +1,33 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Afra MP (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 GoodsType(models.Model): |
|||
"""Class to add goods_type menu in the module""" |
|||
_name = 'goods.type' |
|||
_description = 'Goods Type' |
|||
|
|||
name = fields.Char(string='Type', help='Name of the goods') |
|||
company_id = fields.Many2one('res.company', string='Company', |
|||
default=lambda self: self.env.user.company_id.id, |
|||
help='Select the company to which this record belongs.') |
@ -0,0 +1,38 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Afra MP (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): |
|||
"""Inherit the model res.config.settings to add distance amount""" |
|||
_inherit = 'res.config.settings' |
|||
|
|||
distance_amount = fields.Float(string='Distance Amount/KM', |
|||
config_parameter='packers_and_movers_management.distance_amount', |
|||
help="Enter the distance amount/KM") |
|||
is_extra = fields.Boolean(string='Apply Extra Amount', |
|||
config_parameter='packers_and_movers_management.is_extra', |
|||
default=False, |
|||
help="Enable, if extra charge want to add") |
|||
extra_amount = fields.Float(string='Extra Amount', |
|||
config_parameter='packers_and_movers_management.extra_amount', |
|||
help='Enter extra amount/KM') |
@ -0,0 +1,399 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Afra MP (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 geopy import Nominatim |
|||
from math import cos, sin, asin, sqrt, radians |
|||
from odoo import api, fields, models, _ |
|||
from odoo.exceptions import ValidationError |
|||
|
|||
|
|||
class TruckBooking(models.Model): |
|||
"""Class to add truck_booking menu to view all truck_booking""" |
|||
_name = "truck.booking" |
|||
_inherit = 'mail.thread', 'mail.activity.mixin' |
|||
_description = "Truck Booking" |
|||
_rec_name = 'reference_no' |
|||
|
|||
reference_no = fields.Char(string='Order Reference', readonly=True, |
|||
default=lambda self: _('New'), copy=False, |
|||
help='Order reference number') |
|||
partner_id = fields.Many2one('res.partner', string='Customer', |
|||
required=True, help='Customer Name') |
|||
company_id = fields.Many2one('res.company', string='Company', |
|||
default=lambda self: self.env.user.company_id.id, |
|||
help='Select the company to which this record belongs.') |
|||
from_location = fields.Char(string='Pickup City', required=True, |
|||
help='Goods source location') |
|||
to_location = fields.Char(string='Drop City', required=True, |
|||
help='Goods destination location') |
|||
distance = fields.Float(string='Distance', compute='_compute_distance', |
|||
store=True, help='Total distance to travel') |
|||
truck_id = fields.Many2one('fleet.vehicle.model', string='Truck Type', |
|||
domain=[('vehicle_type', '=', 'truck')], |
|||
required=True, help='Select the truck type') |
|||
goods_type_id = fields.Many2one('goods.type', string='Goods Type', |
|||
help='Select goods type', required=True) |
|||
weight = fields.Integer(string='Weight', help='Total weight of goods') |
|||
amount = fields.Float(string='Amount', compute='_compute_amount', |
|||
store=True, |
|||
help='Total amount is the distance travelled by the truck') |
|||
date = fields.Date(string='Date', help='Delivery date') |
|||
unit = fields.Selection(selection=[('kg', 'KG'), ('tons', 'Tons')], |
|||
string='Unit', default='kg', help='Select unit') |
|||
state = fields.Selection(selection=[('draft', 'Draft'), |
|||
('confirm', 'Confirm'), |
|||
('invoice', 'Invoiced')], |
|||
string='State', default="draft", |
|||
help="Booking State") |
|||
invoice_count = fields.Integer(string="Invoice Count", |
|||
compute='_compute_invoice_count', |
|||
help='Total invoice count') |
|||
invoiced_amount = fields.Float(string='Invoiced amount', |
|||
compute='_compute_invoiced_amount', |
|||
help='Total invoiced amount') |
|||
hide_invoice = fields.Boolean(string='Hide Invoice', |
|||
help="To hide create invoice button", |
|||
default=False) |
|||
|
|||
@api.model |
|||
def create(self, vals_list): |
|||
"""Function to create sequence""" |
|||
if vals_list.get('reference_no', _('New')) == _('New'): |
|||
vals_list['reference_no'] = self.env['ir.sequence'].next_by_code( |
|||
'truck.booking') or _('New') |
|||
return super(TruckBooking, self).create(vals_list) |
|||
|
|||
def action_confirm(self): |
|||
"""Function to change state to confirm""" |
|||
self.write({'state': 'confirm'}) |
|||
|
|||
@api.depends('from_location', 'to_location') |
|||
def _compute_distance(self): |
|||
"""Function to calculate distance between from and to location""" |
|||
for location in self: |
|||
locator = Nominatim(user_agent="myGeocoder") |
|||
from_location = locator.geocode(location.from_location) |
|||
to_location = locator.geocode(location.to_location) |
|||
if from_location is None or to_location is None: |
|||
raise ValidationError(_("Please enter valid city.")) |
|||
else: |
|||
from_lat = radians(from_location.latitude) |
|||
from_long = radians(from_location.longitude) |
|||
to_lat = radians(to_location.latitude) |
|||
to_long = radians(to_location.longitude) |
|||
dist_long = to_long - from_long |
|||
dist_lat = to_lat - from_lat |
|||
comp = sin(dist_lat / 2) ** 2 + cos(from_lat) * cos(to_lat) * sin(dist_long / 2) ** 2 |
|||
location.distance = int(2 * asin(sqrt(comp)) * 6371) |
|||
|
|||
@api.depends('distance') |
|||
def _compute_amount(self): |
|||
"""Function to calculate amount for booking""" |
|||
for record in self: |
|||
amount = record.env['ir.config_parameter'].sudo().\ |
|||
get_param('packers_and_movers_management.distance_amount') |
|||
total = float(amount) * record.distance |
|||
is_extra = record.env['ir.config_parameter'].sudo().\ |
|||
get_param('packers_and_movers_management.is_extra') |
|||
if is_extra: |
|||
extra_amount = record.env['ir.config_parameter'].sudo(). \ |
|||
get_param('packers_and_movers_management.extra_amount') |
|||
total *= float(extra_amount) |
|||
record.amount = total |
|||
|
|||
def action_create_invoice(self): |
|||
"""Function to create invoice for the booking""" |
|||
invoice_id = self.env['account.move'].search( |
|||
[('invoice_origin', '=', self.reference_no), |
|||
('state', '=', 'draft')]) |
|||
if not invoice_id: |
|||
invoice = self.env['account.move'].create([{ |
|||
'move_type': 'out_invoice', |
|||
'partner_id': self.partner_id.id, |
|||
'invoice_origin': self.reference_no, |
|||
'invoice_line_ids': [(0, 0,{ |
|||
'name': "{} to {}".format(self.from_location,self.to_location), |
|||
'quantity': 1, |
|||
'price_unit': self.amount - self.invoiced_amount, |
|||
'price_subtotal': self.amount})]}]) |
|||
return { |
|||
'name': 'Invoice', |
|||
'view_mode': 'form', |
|||
'res_id': invoice.id, |
|||
'res_model': 'account.move', |
|||
'type': 'ir.actions.act_window', |
|||
'target': 'current', |
|||
} |
|||
else: |
|||
invoice_id.write({'invoice_line_ids': [(0, 0,{ |
|||
'name': "{} to {}".format(self.from_location,self.to_location), |
|||
'quantity': 1, |
|||
'price_unit': self.amount - self.invoiced_amount, |
|||
'price_subtotal': self.amount})]}) |
|||
return { |
|||
'name': 'Invoice', |
|||
'view_mode': 'form', |
|||
'res_id': invoice_id.id, |
|||
'res_model': 'account.move', |
|||
'type': 'ir.actions.act_window', |
|||
'target': 'current', |
|||
} |
|||
|
|||
def _compute_invoice_count(self): |
|||
"""Function to count invoice""" |
|||
for record in self: |
|||
record.invoice_count = self.env['account.move'].\ |
|||
search_count([('invoice_origin', '=', self.reference_no)]) |
|||
|
|||
def _compute_invoiced_amount(self): |
|||
"""Function to add invoiced amount""" |
|||
for record in self: |
|||
invoices = record.env['account.move'].search([ |
|||
('invoice_origin', '=', record.reference_no), |
|||
('state', '!=', 'cancel')]) |
|||
record.invoiced_amount = sum(invoices.mapped('amount_untaxed_signed')) |
|||
record.hide_invoice = sum( |
|||
invoices.mapped('amount_untaxed_signed')) == record.amount |
|||
|
|||
def action_view_invoice(self): |
|||
"""Smart button to view the Corresponding Invoices for the truck_booking""" |
|||
return { |
|||
'type': 'ir.actions.act_window', |
|||
'name': 'Invoice', |
|||
'view_mode': 'tree,form', |
|||
'res_model': 'account.move', |
|||
'target': 'current', |
|||
'domain': [('invoice_origin', '=', self.reference_no)], |
|||
'context': {"create": False}, |
|||
} |
|||
|
|||
@api.model |
|||
def get_total_booking(self): |
|||
"""Function to get total booking, distance and invoice amount details""" |
|||
total_booking = self.env['truck.booking'].search_count([]) |
|||
booking_ids = self.env['truck.booking'].search([]) |
|||
invoice_ids = self.env['truck.booking'].\ |
|||
search([('state', '=', 'invoice')]).mapped('amount') |
|||
return {'total_booking': total_booking, |
|||
'total_distance_count': sum(booking_ids.mapped('distance')), |
|||
'total_invoice': sum(invoice_ids), |
|||
'total_amount': sum(booking_ids.mapped('amount'))} |
|||
|
|||
@api.model |
|||
def get_top_truck(self): |
|||
"""Function to return top truck and customer details query to js""" |
|||
self.env.cr.execute('''select fv.name,count(name) from truck_booking as tb |
|||
inner join fleet_vehicle_model as fv on fv.id = tb.truck_id |
|||
group by name order by count desc limit 10''') |
|||
truck = self.env.cr.dictfetchall() |
|||
self.env.cr.execute('''select pr.name,count(name) from truck_booking as tb |
|||
inner join res_partner as pr on pr.id = tb.partner_id |
|||
group by name order by count desc limit 10''') |
|||
customer = self.env.cr.dictfetchall() |
|||
self.env.cr.execute('''select tb.reference_no,pr.name,tb.date from |
|||
truck_booking as tb |
|||
inner join res_partner as pr on pr.id = tb.partner_id |
|||
where tb.date >= '%s' and tb.state = 'invoice' |
|||
order by tb.date''' % fields.date.today()) |
|||
upcoming = self.env.cr.dictfetchall() |
|||
return {'truck': truck, 'customer': customer, 'upcoming': upcoming} |
|||
|
|||
@api.model |
|||
def get_booking_analysis(self): |
|||
"""Function to return customer details to js for graph view""" |
|||
self.env.cr.execute('''select pr.name,sum(tb.amount) from truck_booking as tb |
|||
inner join res_partner as pr on pr.id = tb.partner_id |
|||
group by name''') |
|||
booking = self.env.cr.dictfetchall() |
|||
count = [] |
|||
customer = [] |
|||
for record in booking: |
|||
customer.append(record.get('name')) |
|||
count.append(record.get('sum')) |
|||
value = {'name': customer, 'count': count} |
|||
return value |
|||
|
|||
@api.model |
|||
def get_truck_analysis(self): |
|||
"""Function to return truck details to js for graph view""" |
|||
self.env.cr.execute('''select fv.name,sum(tb.amount) from truck_booking as tb |
|||
inner join fleet_vehicle_model as fv on fv.id = tb.truck_id |
|||
group by name''') |
|||
booking = self.env.cr.dictfetchall() |
|||
count = [] |
|||
customer = [] |
|||
for record in booking: |
|||
customer.append(record.get('name')) |
|||
count.append(record.get('sum')) |
|||
return {'name': customer, 'count': count} |
|||
|
|||
@api.model |
|||
def get_distance(self): |
|||
"""Function to return total distance on the basis of customer and truck""" |
|||
self.env.cr.execute('''select pr.name,sum(tb.distance) from truck_booking as tb |
|||
inner join res_partner as pr on pr.id = tb.partner_id |
|||
group by name''') |
|||
customer = self.env.cr.dictfetchall() |
|||
cust_sum = [] |
|||
cust = [] |
|||
for record in customer: |
|||
cust.append(record.get('name')) |
|||
cust_sum.append(record.get('sum')) |
|||
self.env.cr.execute('''select fv.name,sum(tb.distance) from truck_booking as tb |
|||
inner join fleet_vehicle_model as fv on fv.id = tb.truck_id |
|||
group by name''') |
|||
|
|||
truck = self.env.cr.dictfetchall() |
|||
truck_sum = [] |
|||
truck_name = [] |
|||
for record in truck: |
|||
truck_name.append(record.get('name')) |
|||
truck_sum.append(record.get('sum')) |
|||
return {'cust': cust, 'cust_sum': cust_sum, 'truck_name': truck_name, |
|||
'truck_sum': truck_sum} |
|||
|
|||
@api.model |
|||
def get_weight(self): |
|||
"""Function to get total weight of the goods""" |
|||
self.env.cr.execute('''select pr.name,sum(tb.weight) from truck_booking as tb |
|||
inner join res_partner as pr on pr.id = tb.partner_id |
|||
group by name''') |
|||
customer = self.env.cr.dictfetchall() |
|||
self.env.cr.execute('''select fv.name,sum(tb.weight) from truck_booking as tb |
|||
inner join fleet_vehicle_model as fv on fv.id = tb.truck_id |
|||
group by name''') |
|||
truck = self.env.cr.dictfetchall() |
|||
cust_sum = [] |
|||
cust = [] |
|||
for record in customer: |
|||
cust.append(record.get('name')) |
|||
cust_sum.append(record.get('sum')) |
|||
truck_sum = [] |
|||
truck_name = [] |
|||
for record in truck: |
|||
truck_name.append(record.get('name')) |
|||
truck_sum.append(record.get('sum')) |
|||
return {'cust': cust, 'cust_sum': cust_sum, 'truck_name': truck_name, |
|||
'truck_sum': truck_sum} |
|||
|
|||
@api.model |
|||
def get_select_filter(self,option): |
|||
"""Function to filter data on the bases of the year""" |
|||
if option == 'year': |
|||
create_date = '''create_date between (now() - interval '1 year') and now()''' |
|||
elif option == 'month': |
|||
create_date = '''create_date between (now() - interval '1 months') and now()''' |
|||
elif option == 'week': |
|||
create_date = '''create_date between (now() - interval '7 day') and now()''' |
|||
elif option == 'day': |
|||
create_date = '''create_date between (now() - interval '1 day') and now()''' |
|||
|
|||
self.env.cr.execute('''select count(*) from truck_booking |
|||
where %s''' % create_date) |
|||
booking = self.env.cr.dictfetchall() |
|||
self.env.cr.execute('''select sum(distance) from truck_booking |
|||
where %s''' % create_date) |
|||
distance = self.env.cr.dictfetchall() |
|||
self.env.cr.execute('''select sum(amount) from truck_booking |
|||
where %s''' % create_date) |
|||
amount = self.env.cr.dictfetchall() |
|||
self.env.cr.execute('''select sum(amount) from truck_booking |
|||
where state = 'invoice' and %s''' % create_date) |
|||
invoice = self.env.cr.dictfetchall() |
|||
self.env.cr.execute('''select fv.name,count(name) from truck_booking as tb |
|||
inner join fleet_vehicle_model as fv on fv.id = tb.truck_id |
|||
where tb.%s |
|||
group by name |
|||
order by count desc |
|||
limit 10''' % create_date) |
|||
truck = self.env.cr.dictfetchall() |
|||
self.env.cr.execute('''select pr.name,count(name) from truck_booking as tb |
|||
inner join res_partner as pr on pr.id = tb.partner_id |
|||
where tb.%s group by name |
|||
order by count desc limit 10''' % create_date) |
|||
customer = self.env.cr.dictfetchall() |
|||
self.env.cr.execute('''select pr.name,sum(tb.amount) from truck_booking as tb |
|||
inner join res_partner as pr on pr.id = tb.partner_id |
|||
where tb.%s group by name''' % create_date) |
|||
cust_invoice = self.env.cr.dictfetchall() |
|||
cust_invoice_name = [] |
|||
cust_invoice_sum = [] |
|||
for record in cust_invoice: |
|||
cust_invoice_name.append(record.get('name')) |
|||
cust_invoice_sum.append(record.get('sum')) |
|||
self.env.cr.execute('''select fv.name,sum(tb.amount) from truck_booking as tb |
|||
inner join fleet_vehicle_model as fv on fv.id = tb.truck_id |
|||
where tb.%s group by name''' % create_date) |
|||
truck_invoice = self.env.cr.dictfetchall() |
|||
truck_invoice_name = [] |
|||
truck_invoice_count = [] |
|||
for record in truck_invoice: |
|||
truck_invoice_name.append(record.get('name')) |
|||
truck_invoice_count.append(record.get('sum')) |
|||
self.env.cr.execute('''select pr.name,sum(tb.distance) from truck_booking as tb |
|||
inner join res_partner as pr on pr.id = tb.partner_id |
|||
where tb.%s |
|||
group by name''' % create_date) |
|||
cust_distance = self.env.cr.dictfetchall() |
|||
cust_distance_name = [] |
|||
cust_distance_count = [] |
|||
for record in cust_distance: |
|||
cust_distance_name.append(record.get('name')) |
|||
cust_distance_count.append(record.get('sum')) |
|||
self.env.cr.execute('''select fv.name,sum(tb.distance) from truck_booking as tb |
|||
inner join fleet_vehicle_model as fv on fv.id = tb.truck_id |
|||
where tb.%s |
|||
group by name''' % create_date) |
|||
truck_distance = self.env.cr.dictfetchall() |
|||
truck_distance_name = [] |
|||
truck_distance_count = [] |
|||
for record in truck_distance: |
|||
truck_distance_name.append(record.get('name')) |
|||
truck_distance_count.append(record.get('sum')) |
|||
self.env.cr.execute('''select pr.name,sum(tb.weight) from truck_booking as tb |
|||
inner join res_partner as pr on pr.id = tb.partner_id |
|||
where tb.%s group by name''' % create_date) |
|||
cust_weight = self.env.cr.dictfetchall() |
|||
cust_weight_name = [] |
|||
cust_weight_count = [] |
|||
for record in cust_weight: |
|||
cust_weight_name.append(record.get('name')) |
|||
cust_weight_count.append(record.get('sum')) |
|||
self.env.cr.execute('''select fv.name,sum(tb.weight) from truck_booking as tb |
|||
inner join fleet_vehicle_model as fv on fv.id = tb.truck_id |
|||
where tb.%s group by name''' % create_date) |
|||
truck_weight = self.env.cr.dictfetchall() |
|||
truck_weight_name = [] |
|||
truck_weight_count = [] |
|||
for record in truck_weight: |
|||
truck_weight_name.append(record.get('name')) |
|||
truck_weight_count.append(record.get('sum')) |
|||
return {'booking': booking, 'distance': distance, 'amount': amount, |
|||
'invoice': invoice, 'truck': truck,'customer': customer, |
|||
'cust_invoice_name': cust_invoice_name, 'cust_invoice_sum': |
|||
cust_invoice_sum, 'truck_invoice_name': truck_invoice_name, |
|||
'truck_invoice_count': truck_invoice_count, 'cust_distance_name': |
|||
cust_distance_name, 'cust_distance_count': cust_distance_count, |
|||
'truck_distance_name': truck_distance_name, |
|||
'truck_distance_count': truck_distance_count, |
|||
'cust_weight_name': cust_weight_name, 'cust_weight_count': |
|||
cust_weight_count, 'truck_weight_name': truck_weight_name, |
|||
'truck_weight_count': truck_weight_count} |
@ -0,0 +1,40 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Afra MP (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 TruckType(models.Model): |
|||
"""Add new menu truck_type model in the fleet model to select truck type""" |
|||
_name = 'truck.type' |
|||
_description = 'Truck Type' |
|||
|
|||
name = fields.Char(string='Truck Type', required=True, help='Truck type name') |
|||
length = fields.Float(string='Length', help='Length of the container') |
|||
width = fields.Float(string='Width', help='Width of the container') |
|||
height = fields.Float(string='Height', help='Height of the container') |
|||
capacity = fields.Float(string='House Hold Capacity', required=True, help='Suitable for house size') |
|||
weight = fields.Float(string='Max Weight', required=True, help='Max Load of container') |
|||
company_id = fields.Many2one('res.company', string='Company', |
|||
default=lambda self: self.env.user.company_id.id, |
|||
help='Select the company to which this record belongs.') |
|||
unit = fields.Selection(selection=[('kg', 'KG'), ('tons', 'Tons')], |
|||
default='kg', help='Select unit', string="Unit") |
@ -0,0 +1,22 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Afra MP (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 form_truck_booking_report |
@ -0,0 +1,91 @@ |
|||
<?xml version="1.0" encoding="utf-8" ?> |
|||
<odoo> |
|||
<!-- Template used to show the booking forms--> |
|||
<template id="form_truck_booking_report"> |
|||
<t t-call="web.html_container"> |
|||
<t t-call="web.external_layout"> |
|||
<div class="page"> |
|||
<div> |
|||
<h1 style="font-size:30px"> |
|||
<span t-esc="report[0]['reference_no']"/> |
|||
</h1> |
|||
<h3 style="font-size:20px">Customer: |
|||
<span t-esc="report[0]['name']"/> |
|||
</h3> |
|||
</div> |
|||
<br/> |
|||
<br/> |
|||
<div class="row"> |
|||
<table class="table" style="height: 362px;"> |
|||
<tr> |
|||
<th> |
|||
From Location |
|||
</th> |
|||
<td> |
|||
<span t-esc="report[0]['from_location']"/> |
|||
</td> |
|||
<th> |
|||
Truck Type |
|||
</th> |
|||
<td> |
|||
<span t-esc="report[0]['truck']"/> |
|||
</td> |
|||
</tr> |
|||
<tr> |
|||
<th> |
|||
To Location |
|||
</th> |
|||
<td> |
|||
<span t-esc="report[0]['to_location']"/> |
|||
</td> |
|||
<th> |
|||
Goods Type |
|||
</th> |
|||
<td> |
|||
<span t-esc="report[0]['goods']"/> |
|||
</td> |
|||
</tr> |
|||
<tr> |
|||
<th> |
|||
Date |
|||
</th> |
|||
<td> |
|||
<span t-esc="report[0]['date']"/> |
|||
</td> |
|||
<th> |
|||
Distance |
|||
</th> |
|||
<td> |
|||
<span t-esc="report[0]['distance']"/>KM |
|||
</td> |
|||
</tr> |
|||
<tr> |
|||
<th> |
|||
Weight / Unit |
|||
</th> |
|||
<td> |
|||
<span t-esc="report[0]['weight']"/>/ |
|||
<span t-esc="report[0]['unit']"/> |
|||
</td> |
|||
<th> |
|||
Total Amount |
|||
</th> |
|||
<td> |
|||
<span t-esc="report[0]['amount']"/> |
|||
</td> |
|||
</tr> |
|||
<tr> |
|||
<th> |
|||
State |
|||
</th> |
|||
<td> |
|||
<span t-esc="report[0]['state']"/> |
|||
</td> |
|||
</tr> |
|||
</table> |
|||
</div> |
|||
</div> |
|||
</t> |
|||
</t> |
|||
</template> |
|||
</odoo> |
@ -0,0 +1,99 @@ |
|||
<?xml version="1.0" encoding="utf-8" ?> |
|||
<odoo> |
|||
<!-- Template used to create form for the booking report--> |
|||
<template id="report_truck_booking"> |
|||
<t t-call="web.html_container"> |
|||
<t t-call="web.external_layout"> |
|||
<div class="page"> |
|||
<div class="text-center"> |
|||
<h1 style="font-size:30px">Packers And Movers |
|||
Management |
|||
</h1> |
|||
</div> |
|||
<br/> |
|||
<br/> |
|||
<div class="row"> |
|||
<table class="table"> |
|||
<thead> |
|||
<tr> |
|||
<th> |
|||
References |
|||
</th> |
|||
<th> |
|||
Date |
|||
</th> |
|||
<th> |
|||
Customer |
|||
</th> |
|||
<th> |
|||
From Location |
|||
</th> |
|||
<th> |
|||
To Location |
|||
</th> |
|||
<th> |
|||
Distance |
|||
</th> |
|||
<th> |
|||
Truck Type |
|||
</th> |
|||
<th> |
|||
Goods Type |
|||
</th> |
|||
<th> |
|||
Weight / Unit |
|||
</th> |
|||
<th> |
|||
Total Amount |
|||
</th> |
|||
<th> |
|||
State |
|||
</th> |
|||
</tr> |
|||
</thead> |
|||
<t t-foreach="report" t-as="line"> |
|||
<tr> |
|||
<td> |
|||
<span t-esc="line_index + 1"/> |
|||
</td> |
|||
<td> |
|||
<span t-esc="line['date']"/> |
|||
</td> |
|||
<td> |
|||
<span t-esc="line['name']"/> |
|||
</td> |
|||
<td> |
|||
<span t-esc="line['from_location']"/> |
|||
</td> |
|||
<td> |
|||
<span t-esc="line['to_location']"/> |
|||
</td> |
|||
<td> |
|||
<span t-esc="line['distance']"/> |
|||
KM |
|||
</td> |
|||
<td> |
|||
<span t-esc="line['truck']"/> |
|||
</td> |
|||
<td> |
|||
<span t-esc="line['goods']"/> |
|||
</td> |
|||
<td> |
|||
<span t-esc="line['weight']"/>/ |
|||
<span t-esc="line['unit']"/> |
|||
</td> |
|||
<td> |
|||
<span t-esc="line['amount']"/> |
|||
</td> |
|||
<td> |
|||
<span t-esc="line['state']"/> |
|||
</td> |
|||
</tr> |
|||
</t> |
|||
</table> |
|||
</div> |
|||
</div> |
|||
</t> |
|||
</t> |
|||
</template> |
|||
</odoo> |
@ -0,0 +1,24 @@ |
|||
<?xml version="1.0" encoding="utf-8" ?> |
|||
<odoo> |
|||
<!-- Generate the Booking report as pdf Format--> |
|||
<record id="action_report_booking" model="ir.actions.report"> |
|||
<field name="name">Truck Booking</field> |
|||
<field name="model">make.truck.booking.pdf</field> |
|||
<field name="report_type">qweb-pdf</field> |
|||
<field name="report_name">packers_and_movers_management.report_truck_booking</field> |
|||
<field name="report_file">packers_and_movers_management.report_truck_booking</field> |
|||
</record> |
|||
<record id="action_report_truck_booking_form" model="ir.actions.report"> |
|||
<field name="name">Truck Booking</field> |
|||
<field name="model">truck.booking</field> |
|||
<field name="report_type">qweb-pdf</field> |
|||
<field name="report_name"> |
|||
report.packers_and_movers_management.form_truck_booking_report |
|||
</field> |
|||
<field name="report_file"> |
|||
report.packers_and_movers_management.form_truck_booking_report |
|||
</field> |
|||
<field name="binding_model_id" ref="model_truck_booking"/> |
|||
<field name="binding_type">report</field> |
|||
</record> |
|||
</odoo> |
@ -0,0 +1,41 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Afra MP (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 TruckFormReport(models.AbstractModel): |
|||
"""Class is used to print pdf report for the truck_booking module form view""" |
|||
_name = 'report.packers_and_movers_management.form_truck_booking_report' |
|||
|
|||
@api.model |
|||
def _get_report_values(self, docids, data=None): |
|||
"""Function to return values for the report, |
|||
docids: it will provide the current id the model""" |
|||
query = """select tb.reference_no,pr.name,fv.name as truck,gt.name as goods,tb.from_location,tb.to_location, |
|||
tb.distance,tb.weight,tb.unit,amount,tb.date,tb.state from truck_booking as tb |
|||
inner join res_partner as pr on pr.id = tb.partner_id |
|||
inner join fleet_vehicle_model as fv on fv.id = tb.truck_id |
|||
inner join goods_type as gt on gt.id = tb.goods_type_id |
|||
where tb.id = %d""" % docids |
|||
self.env.cr.execute(query) |
|||
report = self.env.cr.dictfetchall() |
|||
return {'doc_ids': docids, 'report': report} |
|
@ -0,0 +1,20 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<data noupdate="1"> |
|||
<record id="truck_booking_rule_company" model="ir.rule"> |
|||
<field name="name">Truck Booking multi company rule</field> |
|||
<field name="model_id" ref="model_truck_booking"/> |
|||
<field name="domain_force">['|',('company_id','=',False),('company_id', 'in', company_ids)]</field> |
|||
</record> |
|||
<record id="goods_type_rule_company" model="ir.rule"> |
|||
<field name="name">Goods Type multi company rule</field> |
|||
<field name="model_id" ref="model_goods_type"/> |
|||
<field name="domain_force">['|',('company_id','=',False),('company_id', 'in', company_ids)]</field> |
|||
</record> |
|||
<record id="truck_type_rule_company" model="ir.rule"> |
|||
<field name="name">Truck Type multi company rule</field> |
|||
<field name="model_id" ref="model_truck_type"/> |
|||
<field name="domain_force">['|',('company_id','=',False),('company_id', 'in', company_ids)]</field> |
|||
</record> |
|||
</data> |
|||
</odoo> |
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.2 KiB |
After Width: | Height: | Size: 673 B |
After Width: | Height: | Size: 878 B |
After Width: | Height: | Size: 653 B |
After Width: | Height: | Size: 905 B |
After Width: | Height: | Size: 839 B |
After Width: | Height: | Size: 427 B |
After Width: | Height: | Size: 627 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 988 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 4.4 KiB |
After Width: | Height: | Size: 589 B |
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 967 B |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 5.0 KiB |
After Width: | Height: | Size: 88 KiB |
After Width: | Height: | Size: 81 KiB |
After Width: | Height: | Size: 79 KiB |
After Width: | Height: | Size: 92 KiB |
After Width: | Height: | Size: 82 KiB |
After Width: | Height: | Size: 74 KiB |
After Width: | Height: | Size: 74 KiB |
After Width: | Height: | Size: 78 KiB |
After Width: | Height: | Size: 92 KiB |
After Width: | Height: | Size: 159 KiB |
After Width: | Height: | Size: 79 KiB |
After Width: | Height: | Size: 88 KiB |
After Width: | Height: | Size: 97 KiB |
After Width: | Height: | Size: 75 KiB |
After Width: | Height: | Size: 178 KiB |
After Width: | Height: | Size: 200 KiB |
After Width: | Height: | Size: 119 KiB |
After Width: | Height: | Size: 83 KiB |
After Width: | Height: | Size: 114 KiB |
After Width: | Height: | Size: 232 KiB |
After Width: | Height: | Size: 180 KiB |
After Width: | Height: | Size: 73 KiB |
After Width: | Height: | Size: 16 KiB |
@ -0,0 +1,621 @@ |
|||
<div style="background-color: #714B67; height: 810px; width: 100%; padding: 15px; position: relative;"> |
|||
<!-- TITLE BAR --> |
|||
<div class="d-flex align-items-center justify-content-between" |
|||
style="border-bottom: 1px solid #875A7B; padding: 15px; display: flex; justify-content: space-between; align-items: center;"> |
|||
<img src="assets/misc/cybrosys-logo.png" width="42" height="42" style="width: 42px; height: 42px;"/> |
|||
<div> |
|||
<div |
|||
style="color: #7C7BAD; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;" |
|||
class="mr-2"> |
|||
<i class="fa fa-check mr-1"></i>Community |
|||
</div> |
|||
<div |
|||
style="color: #875A7B; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;" |
|||
class="mr-2"> |
|||
<i class="fa fa-check mr-1"></i>Enterprise |
|||
</div> |
|||
<div |
|||
style="color: #017E84; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;" |
|||
class="mr-2"> |
|||
<i class="fa fa-check mr-1"></i>Odoo.sh |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<!-- END OF TITLE BAR --> |
|||
<div class="container"> |
|||
<div class="row"> |
|||
<div class="col-sm-12 col-md-12 col-lg-12"> |
|||
<!-- APP HERO --> |
|||
<h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;"> |
|||
Packers & Movers Management</h1> |
|||
<p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;">Detailed |
|||
Packers & Movers Management View.</p> |
|||
<!-- END OF APP HERO --> |
|||
<img src="assets/screenshots/hero.gif" class="img-responsive" |
|||
style="width: 100%; margin-left: auto; margin-right: auto;"/> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<!-- NAVIGATION SECTION --> |
|||
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px; margin-top: 300px;"> |
|||
<div class="d-flex justify-content-center align-items-center mr-2" |
|||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|||
<img src="assets/misc/compass.png"/> |
|||
</div> |
|||
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Explore This |
|||
Module</h2> |
|||
</div> |
|||
<div class="row my-4" style="font-family: 'Montserrat', sans-serif;"> |
|||
<div class="col-sm-12 col-md-6 my-3"> |
|||
<a href="#overview"> |
|||
<div class="d-flex justify-content-between align-items-center" |
|||
style="background-color: #f5f5f5; padding: 30px; width: 100%;"> |
|||
<div> |
|||
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Overview</span> |
|||
<span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">Learn |
|||
more about this |
|||
module</span> |
|||
</div> |
|||
<img src="assets/misc/right-arrow.png" width="36" height="36"/> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-sm-12 col-md-6 my-3"> |
|||
<a href="#features"> |
|||
<div class="d-flex justify-content-between align-items-center" |
|||
style="background-color: #f5f5f5; padding: 30px; width: 100%;"> |
|||
<div> |
|||
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Features</span> |
|||
<span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View |
|||
features of this |
|||
module</span> |
|||
</div> |
|||
<img src="assets/misc/right-arrow.png" width="36" height="36"/> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-sm-12 col-md-6 my-3"> |
|||
<a href="#screenshots"> |
|||
<div class="d-flex justify-content-between align-items-center" |
|||
style="background-color: #f5f5f5; padding: 30px; width: 100%;"> |
|||
<div> |
|||
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Screenshots</span> |
|||
<span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View |
|||
screenshots for this |
|||
module</span> |
|||
</div> |
|||
<img src="assets/misc/right-arrow.png" width="36" height="36"/> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
<!-- END OF NAVIGATION SECTION --> |
|||
|
|||
<!-- OVERVIEW SECTION --> |
|||
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="overview"> |
|||
<div class="d-flex justify-content-center align-items-center mr-2" |
|||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|||
<img src="assets/misc/pie-chart.png"/> |
|||
</div> |
|||
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Overview |
|||
</h2> |
|||
</div> |
|||
<div class="row" style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;"> |
|||
<div class="col-sm-12 py-4"> |
|||
The Packers & Movers Management module helps Users to book the trucks through online, |
|||
you can Manage all the orders, print the PDF report, create truck types and goods type also. |
|||
This module include a Dashboard menu to see all report. |
|||
<br/> |
|||
Furthermore, we can view the different types of reports in the form of graphs |
|||
according to the values and operations. |
|||
</div> |
|||
</div> |
|||
<!-- END OF OVERVIEW SECTION --> |
|||
|
|||
<!-- FEATURES SECTION --> |
|||
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="features"> |
|||
<div class="d-flex justify-content-center align-items-center mr-2" |
|||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|||
<img src="assets/misc/features.png"/> |
|||
</div> |
|||
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Features |
|||
</h2> |
|||
</div> |
|||
<div class="row" style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;"> |
|||
<div class="col-sm-12 col-md-6"> |
|||
<div class="d-flex align-items-center" style="margin-top: 40px; margin-bottom: 40px"> |
|||
<img src="assets/misc/check-box.png" class="mr-2"/> |
|||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Dedicated Website |
|||
Views |
|||
for Users.</span> |
|||
</div> |
|||
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> |
|||
<img src="assets/misc/check-box.png" class="mr-2"/> |
|||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Users can Easily Book Truck</span> |
|||
</div> |
|||
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> |
|||
<img src="assets/misc/check-box.png" class="mr-2"/> |
|||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
|||
Available in Odoo 16.0 Community and Enterprise.</span> |
|||
</div> |
|||
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> |
|||
<img src="assets/misc/check-box.png" class="mr-2"/> |
|||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Truck Type and Goods Menu in Website.</span> |
|||
</div> |
|||
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> |
|||
<img src="assets/misc/check-box.png" class="mr-2"/> |
|||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Distance/KM Amount can set in Configuration Settings,</span> |
|||
</div> |
|||
</div> |
|||
<div class="col-sm-12 col-md-6"> |
|||
|
|||
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> |
|||
<img src="assets/misc/check-box.png" class="mr-2"/> |
|||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Dashboard View.</span> |
|||
</div> |
|||
|
|||
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> |
|||
<img src="assets/misc/check-box.png" class="mr-2"/> |
|||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Print PDF Report.</span> |
|||
</div> |
|||
|
|||
</div> |
|||
</div> |
|||
<!-- END OF FEATURES SECTION --> |
|||
|
|||
<!-- SCREENSHOTS SECTION --> |
|||
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="screenshots"> |
|||
<div class="d-flex justify-content-center align-items-center mr-2" |
|||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|||
<img src="assets/misc/pictures.png"/> |
|||
</div> |
|||
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Screenshots |
|||
</h2> |
|||
</div> |
|||
<div class="row"> |
|||
<div class="col-sm-12"> |
|||
|
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Dashboard view with filtration. |
|||
</h3> |
|||
|
|||
<img src="assets/screenshots/5.png" class="img-thumbnail"> |
|||
<img src="assets/screenshots/6.png" class="img-thumbnail"> |
|||
</div> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">In Configuration Settings you can set the amount per KM, and if you have any |
|||
extra amount you can add in extra amount field. |
|||
</h3> |
|||
<div style="display: block; margin: 30px auto;"> |
|||
<img src="assets/screenshots/12.png" class="img-thumbnail"> |
|||
</div> |
|||
|
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Truck Booking Tree view. |
|||
</h3> |
|||
|
|||
<img src="assets/screenshots/7.png" class="img-thumbnail"> |
|||
</div> |
|||
|
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
|||
Truck Booking Form view. |
|||
</h3> |
|||
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Add the Customer name and the pickup city and the drop city. then automatically calculate the |
|||
distance and amount. set the date, truck, goods type and weight, and it's unit.</p> |
|||
<img src="assets/screenshots/f8.png" class="img-thumbnail"> |
|||
</div> |
|||
|
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Create Goods Type. |
|||
</h3> |
|||
<img src="assets/screenshots/9.png" class="img-thumbnail"> |
|||
</div> |
|||
|
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Create Truck Type. |
|||
</h3> |
|||
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Add truck type and length, width and height of the container.</p> |
|||
<img src="assets/screenshots/11.png" class="img-thumbnail"> |
|||
</div> |
|||
|
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Create Truck. |
|||
</h3> |
|||
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> Create model in fleet module and set vehicle type truck. And in information page set |
|||
truck type</p> |
|||
|
|||
<img src="assets/screenshots/14.png" class="img-thumbnail"> |
|||
</div> |
|||
|
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Create PDF report. |
|||
</h3> |
|||
<img src="assets/screenshots/13.png" class="img-thumbnail"> |
|||
</div> |
|||
|
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Truck Booking Form |
|||
</h3> |
|||
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Add the pickup city and drop city. So, it automatically fills the distance in KM |
|||
. In this form, the user can select the truck type, goods type, and weight of the object in units. |
|||
And users can fill in their personal details in the form. </p> |
|||
<img src="assets/screenshots/w1.png" class="img-thumbnail"> |
|||
<img src="assets/screenshots/2.png" class="img-thumbnail"> |
|||
</div> |
|||
|
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Truck Type Menu |
|||
</h3> |
|||
<img src="assets/screenshots/3.png" class="img-thumbnail"> |
|||
</div> |
|||
|
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Goods Type Menu |
|||
</h3> |
|||
<img src="assets/screenshots/4.png" class="img-thumbnail"> |
|||
</div> |
|||
|
|||
</div> |
|||
</div> |
|||
<!-- END OF SCREENSHOTS SECTION --> |
|||
|
|||
<!-- RELATED PRODUCTS --> |
|||
<div class="row"> |
|||
<div class="col-sm-12 col-md-12-col-lg-2"> |
|||
<h2 style="font-weight: bold; color: #3D3D4E;">Related Modules</h2> |
|||
<p style="color: #777783;">Explore our related modules</p> |
|||
<hr /> |
|||
</div> |
|||
<div class="col-sm-12"> |
|||
<div id="demo1" class="row carousel slide" data-ride="carousel"> |
|||
<!-- The slideshow --> |
|||
<div class="carousel-inner" style="padding: 30px;"> |
|||
<div class="carousel-item" style="min-height: 198.656px;"> |
|||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> |
|||
<a href="https://apps.odoo.com/apps/modules/16.0/whatsapp_redirect/" target="_blank"> |
|||
<div style="border-radius:10px"> |
|||
<img class="img img-responsive center-block" style="border-radius: 0px;" src="assets/modules/1.png"> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> |
|||
<a href="https://apps.odoo.com/apps/modules/16.0/hr_payroll_community/" target="_blank"> |
|||
<div style="border-radius:10px"> |
|||
<img class="img img-responsive center-block" style="border-radius: 0px;" src="assets/modules/2.png"> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> |
|||
<a href="https://apps.odoo.com/apps/modules/16.0/crm_dashboard/" target="_blank"> |
|||
<div style="border-radius:10px"> |
|||
<img class="img img-responsive center-block" style="border-radius: 0px;" src="assets/modules/3.png"> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
<div class="carousel-item active" style="min-height: 198.656px;"> |
|||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> |
|||
<a href="https://apps.odoo.com/apps/modules/16.0/export_stockinfo_xls/" target="_blank"> |
|||
<div style="border-radius:10px"> |
|||
<img class="img img-responsive center-block" style="border-radius: 0px;" src="assets/modules/4.png"> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> |
|||
<a href="https://apps.odoo.com/apps/modules/16.0/sale_discount_total/" target="_blank"> |
|||
<div style="border-radius:10px"> |
|||
<img class="img img-responsive center-block" style="border-radius: 0px;" src="assets/modules/5.png"> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> |
|||
<a href="https://apps.odoo.com/apps/modules/16.0/fleet_rental/" target="_blank"> |
|||
<div style="border-radius:10px"> |
|||
<img class="img img-responsive center-block" style="border-radius: 0px;" src="assets/modules/6.png"> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<!-- Left and right controls --> |
|||
<a class="carousel-control-prev" href="#demo1" 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="#demo1" 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> |
|||
</div> |
|||
<!-- END OF RELATED PRODUCTS --> |
|||
|
|||
<!-- OUR SERVICES --> |
|||
|
|||
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> |
|||
<div class="d-flex justify-content-center align-items-center mr-2" |
|||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|||
<img src="assets/misc/star.png"/> |
|||
</div> |
|||
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Our Services |
|||
</h2> |
|||
</div> |
|||
|
|||
<div class="container my-5"> |
|||
<div class="row"> |
|||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|||
style="background-color: #1dd1a1 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|||
<img src="assets/icons/cogs.png" class="img-responsive" height="48px" width="48px"> |
|||
</div> |
|||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|||
Odoo |
|||
Customization</h6> |
|||
</div> |
|||
|
|||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|||
style="background-color: #ff6b6b !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|||
<img src="assets/icons/wrench.png" class="img-responsive" height="48px" width="48px"> |
|||
</div> |
|||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|||
Odoo |
|||
Implementation</h6> |
|||
</div> |
|||
|
|||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|||
style="background-color: #6462CD !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|||
<img src="assets/icons/lifebuoy.png" class="img-responsive" height="48px" width="48px"> |
|||
</div> |
|||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|||
Odoo |
|||
Support</h6> |
|||
</div> |
|||
|
|||
|
|||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|||
style="background-color: #ffa801 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|||
<img src="assets/icons/user.png" class="img-responsive" height="48px" width="48px"> |
|||
</div> |
|||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|||
Hire |
|||
Odoo |
|||
Developer</h6> |
|||
</div> |
|||
|
|||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|||
style="background-color: #54a0ff !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|||
<img src="assets/icons/puzzle.png" class="img-responsive" height="48px" width="48px"> |
|||
</div> |
|||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|||
Odoo |
|||
Integration</h6> |
|||
</div> |
|||
|
|||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|||
style="background-color: #6d7680 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|||
<img src="assets/icons/update.png" class="img-responsive" height="48px" width="48px"> |
|||
</div> |
|||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|||
Odoo |
|||
Migration</h6> |
|||
</div> |
|||
|
|||
|
|||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|||
style="background-color: #786fa6 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|||
<img src="assets/icons/consultation.png" class="img-responsive" height="48px" width="48px"> |
|||
</div> |
|||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|||
Odoo |
|||
Consultancy</h6> |
|||
</div> |
|||
|
|||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|||
style="background-color: #f8a5c2 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|||
<img src="assets/icons/training.png" class="img-responsive" height="48px" width="48px"> |
|||
</div> |
|||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|||
Odoo |
|||
Implementation</h6> |
|||
</div> |
|||
|
|||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|||
style="background-color: #e6be26 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|||
<img src="assets/icons/license.png" class="img-responsive" height="48px" width="48px"> |
|||
</div> |
|||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|||
Odoo |
|||
Licensing Consultancy</h6> |
|||
</div> |
|||
</div> |
|||
|
|||
</div> |
|||
|
|||
<!-- END OF END OF OUR SERVICES --> |
|||
|
|||
<!-- OUR INDUSTRIES --> |
|||
|
|||
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> |
|||
<div class="d-flex justify-content-center align-items-center mr-2" |
|||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|||
<img src="assets/misc/corporate.png"/> |
|||
</div> |
|||
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Our |
|||
Industries |
|||
</h2> |
|||
</div> |
|||
|
|||
<div class="container my-5"> |
|||
<div class="row"> |
|||
<div class="col-lg-3"> |
|||
<div class="my-4 d-flex flex-column justify-content-center" |
|||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|||
<img src="assets/icons/trading-black.png" class="img-responsive mb-3" height="48px" width="48px"> |
|||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|||
Trading |
|||
</h5> |
|||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|||
Easily procure |
|||
and |
|||
sell your products</p> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-lg-3"> |
|||
<div class="my-4 d-flex flex-column justify-content-center" |
|||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|||
<img src="assets/icons/pos-black.png" class="img-responsive mb-3" height="48px" width="48px"> |
|||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|||
POS |
|||
</h5> |
|||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|||
Easy |
|||
configuration |
|||
and convivial experience</p> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-lg-3"> |
|||
<div class="my-4 d-flex flex-column justify-content-center" |
|||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|||
<img src="assets/icons/education-black.png" class="img-responsive mb-3" height="48px" width="48px"> |
|||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|||
Education |
|||
</h5> |
|||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|||
A platform for |
|||
educational management</p> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-lg-3"> |
|||
<div class="my-4 d-flex flex-column justify-content-center" |
|||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|||
<img src="assets/icons/manufacturing-black.png" class="img-responsive mb-3" height="48px" width="48px"> |
|||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|||
Manufacturing |
|||
</h5> |
|||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|||
Plan, track and |
|||
schedule your operations</p> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-lg-3"> |
|||
<div class="my-4 d-flex flex-column justify-content-center" |
|||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|||
<img src="assets/icons/ecom-black.png" class="img-responsive mb-3" height="48px" width="48px"> |
|||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|||
E-commerce & Website |
|||
</h5> |
|||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|||
Mobile |
|||
friendly, |
|||
awe-inspiring product pages</p> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-lg-3"> |
|||
<div class="my-4 d-flex flex-column justify-content-center" |
|||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|||
<img src="assets/icons/service-black.png" class="img-responsive mb-3" height="48px" width="48px"> |
|||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|||
Service Management |
|||
</h5> |
|||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|||
Keep track of |
|||
services and invoice</p> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-lg-3"> |
|||
<div class="my-4 d-flex flex-column justify-content-center" |
|||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|||
<img src="assets/icons/restaurant-black.png" class="img-responsive mb-3" height="48px" width="48px"> |
|||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|||
Restaurant |
|||
</h5> |
|||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|||
Run your bar or |
|||
restaurant methodically</p> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-lg-3"> |
|||
<div class="my-4 d-flex flex-column justify-content-center" |
|||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|||
<img src="assets/icons/hotel-black.png" class="img-responsive mb-3" height="48px" width="48px"> |
|||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|||
Hotel Management |
|||
</h5> |
|||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|||
An |
|||
all-inclusive |
|||
hotel management application</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<!-- END OF END OF OUR INDUSTRIES --> |
|||
|
|||
<!-- SUPPORT --> |
|||
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> |
|||
<div class="d-flex justify-content-center align-items-center mr-2" |
|||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|||
<img src="assets/misc/customer-support.png"/> |
|||
</div> |
|||
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Support |
|||
</h2> |
|||
</div> |
|||
<div class="container mt-5"> |
|||
<div class="row"> |
|||
<div class="col-sm-12 col-md-6"> |
|||
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;"> |
|||
<div class="mr-4 d-flex justify-content-center align-items-center" |
|||
style="background-color: #714B67; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;"> |
|||
<img src="assets/misc/support.png" height="48" width="48" style="width: 42px; height: 42px;"/> |
|||
</div> |
|||
<div> |
|||
<h4>Need Help?</h4> |
|||
<p style="line-height: 100%;">Got questions or need help? Get in touch.</p> |
|||
<a href="mailto:odoo@cybrosys.com"> |
|||
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;"> |
|||
odoo@cybrosys.com</p> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-sm-12 col-md-6"> |
|||
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;"> |
|||
<div class="mr-4 d-flex justify-content-center align-items-center" |
|||
style="background-color: #2AC44D; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;"> |
|||
<img src="assets/misc/whatsapp.png" height="52" width="52" style="width: 52px; height: 52px;"/> |
|||
</div> |
|||
<div> |
|||
<h4>WhatsApp</h4> |
|||
<p style="line-height: 100%;">Say hi to us on WhatsApp!</p> |
|||
<a href="https://api.whatsapp.com/send?phone=918606827707"> |
|||
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;">+91 86068 |
|||
27707</p> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="row"> |
|||
<div class="col-sm-12 my-5 d-flex justify-content-center align-items-center"> |
|||
<img src="assets/misc/logo.png" width="144" height="31" |
|||
style="width:144px; height: 31px; margin-top: 40px;"/> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<!-- END OF SUPPORT --> |
@ -0,0 +1,102 @@ |
|||
|
|||
.o_action_manager { |
|||
overflow: auto !important; |
|||
} |
|||
|
|||
.help_dashboards { |
|||
padding-top: 10px; |
|||
background-color: #f8faff !important; |
|||
} |
|||
|
|||
.dashboard_card h4 { |
|||
font-size: 21px; |
|||
} |
|||
|
|||
.main-section { |
|||
margin-left: 6px; |
|||
} |
|||
|
|||
.breadcrumbs { |
|||
margin-top: 0; |
|||
} |
|||
|
|||
/* Widget One |
|||
---------------------------*/ |
|||
.stat-content { |
|||
display: inline-block; |
|||
width: 66%; |
|||
} |
|||
|
|||
.stat-icon { |
|||
display: inline-block; |
|||
} |
|||
|
|||
.stat-widget-one .stat-icon { |
|||
vertical-align: top; |
|||
margin: auto; |
|||
width: 100%; |
|||
color: #01c490; |
|||
} |
|||
|
|||
.stat-widget-one .stat-text { |
|||
font-size: 11px; |
|||
color: #868e96; |
|||
font-weight: bold; |
|||
} |
|||
|
|||
.stat-widget-one .stat-digit { |
|||
font-size: 24px; |
|||
color: #02448b; |
|||
} |
|||
|
|||
/*=====================Dashboard===========================*/ |
|||
|
|||
.customer{ |
|||
margin-top: 15px; |
|||
backgroud: #fff; |
|||
transition: transform 0.2s ease, box-shadow 0.2s ease; |
|||
will-change: transform, box-shadow; |
|||
box-shadow: 0 10px 40px 0 rgba(62,57,107,0.07), 0 2px 9px 0 rgba(62,57,107,0.06); |
|||
height: 316px; |
|||
overflow-y: auto; |
|||
margin-bottom: 15px; |
|||
border-radius:10px; |
|||
} |
|||
|
|||
.customer_head{ |
|||
font-size: 17px; |
|||
padding: 12px; |
|||
color: #7d7eaf; |
|||
background-color: #e5e5ef; |
|||
} |
|||
.padding{ |
|||
margin-bottom:75px; |
|||
} |
|||
.graph{ |
|||
padding: 10px; |
|||
box-shadow: 0 10px 40px 0 rgba(62,57,107,0.07), 0 2px 9px 0 rgba(62,57,107,0.06); |
|||
background: #fff; |
|||
margin-bottom: 15px; |
|||
border-radius:15px; |
|||
} |
|||
.left{ |
|||
margin-top: -740px; |
|||
margin-left: 800px; |
|||
} |
|||
.circle{ |
|||
border-radius: 50%; |
|||
border-color:#fff; |
|||
padding: 10px; |
|||
color: #7d7eaf; |
|||
background-color: #e5e5ef; |
|||
font: 20px arial, sans-serif; |
|||
height: 44px; |
|||
width: 44px; |
|||
text-align:center; |
|||
margin:auto; |
|||
} |
|||
.head{ |
|||
font-size: 18px; |
|||
color: #7d7eaf; |
|||
font-family: cursive; |
|||
} |
@ -0,0 +1,125 @@ |
|||
#loader{ |
|||
height:137px; |
|||
width:131px; |
|||
margin-top:-42px; |
|||
margin-left:143px; |
|||
margin-bottom:-66px; |
|||
background-image:url("/packers_and_movers_management/static/src/img/loader2.gif"); |
|||
background-repeat:no-repeat; |
|||
background-size:cover; |
|||
} |
|||
.head{ |
|||
margin-top:25px; |
|||
margin-left:20px; |
|||
} |
|||
.image{ |
|||
background-image:url("/packers_and_movers_management/static/src/img/order_track.jpg"); |
|||
background-size:cover; |
|||
height:300px; |
|||
width:600px; |
|||
margin-left:-20px; |
|||
} |
|||
h1{ |
|||
color:gray; |
|||
font-family:"Lucida consol","Courier Nem",monospace; |
|||
} |
|||
.body{ |
|||
margin-top:-365px; |
|||
margin-left:875px; |
|||
margin-bottom:10px; |
|||
} |
|||
.select{ |
|||
position:relative; |
|||
} |
|||
.unit{ |
|||
position:absolute; |
|||
right:145px; |
|||
top:0; |
|||
height: 50px; |
|||
border-color:#ed8115; |
|||
} |
|||
.link-style{ |
|||
width:500px; |
|||
height:50px; |
|||
border-color:#ed8115; |
|||
} |
|||
.button{ |
|||
width:500px; |
|||
height:50px; |
|||
background-color:#ed8115; |
|||
color:white; |
|||
border-color:#ed8115; |
|||
} |
|||
.input{ |
|||
width:500px; |
|||
height:50px; |
|||
border-color:#ed8115; |
|||
} |
|||
table{ |
|||
border-collapse:collapse; |
|||
width:100%; |
|||
} |
|||
th,td{ |
|||
text_align:left; |
|||
padding:8px; |
|||
border: 1px solid white; |
|||
} |
|||
thead{ |
|||
background-color:#ed8115; |
|||
color:#fcfcfc; |
|||
} |
|||
tr:nth-child(even){ |
|||
background-color:#a9aaab; |
|||
} |
|||
.success{ |
|||
font-size:20px; |
|||
color:white; |
|||
text-align:center; |
|||
background-color:#ed8115; |
|||
height:75px; |
|||
padding:15px; |
|||
margin-bottom:10px; |
|||
} |
|||
.link{ |
|||
color:#ed8115; |
|||
} |
|||
.form-group{ |
|||
padding-bottom:10px; |
|||
padding-top:10px; |
|||
} |
|||
.wrap{ |
|||
min-height: 450px; |
|||
overflow:auto; |
|||
} |
|||
|
|||
@media(max-width:790px){ |
|||
|
|||
.head{ |
|||
margin-top:15px; |
|||
margin-left:11px; |
|||
} |
|||
.image{ |
|||
height:190px; |
|||
width:360px; |
|||
margin-left:-21px; |
|||
} |
|||
.body{ |
|||
margin-top:25px; |
|||
margin-left:2px; |
|||
} |
|||
.input{ |
|||
width:332px; |
|||
} |
|||
.button{ |
|||
width:332px; |
|||
} |
|||
.link-style{ |
|||
width:332px; |
|||
} |
|||
.unit{ |
|||
right:-7px; |
|||
} |
|||
#loader{ |
|||
margin-left:64px; |
|||
} |
|||
} |
After Width: | Height: | Size: 174 KiB |
After Width: | Height: | Size: 89 KiB |
@ -0,0 +1,812 @@ |
|||
/** @odoo-module */ |
|||
import { loadBundle } from "@web/core/assets"; |
|||
var AbstractAction = require('web.AbstractAction'); |
|||
var core = require('web.core'); |
|||
var QWeb = core.qweb; |
|||
var rpc = require('web.rpc'); |
|||
var CustomDashBoard = AbstractAction.extend({// Extended abstract class to create dashboard
|
|||
template: 'CustomDashBoard', |
|||
events: { |
|||
'change #stock_selection': function(e) { |
|||
e.stopPropagation(); |
|||
var value = $(e.target).val(); |
|||
if (value=="year"){ |
|||
this.onclick_this_year(value); |
|||
}else if (value=="day"){ |
|||
this.onclick_this_day(value); |
|||
}else if (value=="month"){ |
|||
this.onclick_this_month(value); |
|||
}else if (value=="week"){ |
|||
this.onclick_this_week(value); |
|||
} |
|||
}, |
|||
}, |
|||
init: function(parent, context) {//function to Initializes all the values while loading the file
|
|||
this._super(parent, context); |
|||
this.dashboards_templates = ['DashboardTruckBooking']; |
|||
this.booking_count = [] |
|||
this.distance_count = [] |
|||
this.total_invoice = [] |
|||
this.total_amount = [] |
|||
}, |
|||
willStart: function() {// returns the function fetch_data when page load.
|
|||
var self = this; |
|||
return $.when(loadBundle(this), this._super()).then(function() { |
|||
return self.fetch_data(); |
|||
}); |
|||
}, |
|||
start: function() {//fetch data and return render_dashboards and render_graph function
|
|||
self = this; |
|||
this.set("title", 'Dashboard'); |
|||
return this._super().then(function() { |
|||
self.render_dashboards(); |
|||
self.render_graph(); |
|||
}); |
|||
}, |
|||
render_dashboards: function() {//return value to show in tile.
|
|||
self = this; |
|||
_.each(this.dashboards_templates, function(template) { |
|||
self.$('.o_pj_dashboard').append(QWeb.render(template, {widget: self})); |
|||
}); |
|||
}, |
|||
fetch_data: function() {//function to call rpc query to fetch data fom python
|
|||
self = this; |
|||
var def1 = this._rpc({ |
|||
model: 'truck.booking', |
|||
method: 'get_total_booking' |
|||
}).then(function(result) |
|||
{ |
|||
self.booking_count = result.total_booking, |
|||
self.distance_count = result.total_distance_count, |
|||
self.total_invoice = result.total_invoice |
|||
self.total_amount = result.total_amount |
|||
}); |
|||
var def2 = this._rpc({ |
|||
model: 'truck.booking', |
|||
method: 'get_top_truck' |
|||
}).then(function(result) |
|||
{ |
|||
self.truck = result['truck'] |
|||
self.customer = result['customer'] |
|||
self.upcoming = result['upcoming'] |
|||
}); |
|||
return $.when(def1,def2); |
|||
}, |
|||
render_graph: function(){//Add function to load in dashboard.
|
|||
this.render_booking(); |
|||
this.render_truck(); |
|||
this.render_distance(); |
|||
this.render_weight(); |
|||
}, |
|||
render_booking:function(){//Function to add booking chart on the basis of customer
|
|||
rpc.query({ |
|||
model: "truck.booking", |
|||
method: "get_booking_analysis", |
|||
}).then(function (result) { |
|||
new Chart(self.$("#booking"), { |
|||
type: 'bar', |
|||
data: { |
|||
labels: result.name, |
|||
datasets: [{ |
|||
label: 'Count', |
|||
data: result.count, |
|||
backgroundColor: [ |
|||
"#003f5c", |
|||
"#2f4b7c", |
|||
"#f95d6a", |
|||
"#665191", |
|||
"#d45087", |
|||
"#ff7c43", |
|||
"#ffa600", |
|||
"#a05195", |
|||
"#6d5c16", |
|||
"#CCCCFF" |
|||
|
|||
], |
|||
borderColor: [ |
|||
"#003f5c", |
|||
"#2f4b7c", |
|||
"#f95d6a", |
|||
"#665191", |
|||
"#d45087", |
|||
"#ff7c43", |
|||
"#ffa600", |
|||
"#a05195", |
|||
"#6d5c16", |
|||
"#CCCCFF" |
|||
], |
|||
barPercentage: 0.5, |
|||
barThickness: 6, |
|||
maxBarThickness: 8, |
|||
minBarLength: 0, |
|||
borderWidth: 1, |
|||
type: 'bar', |
|||
fill: false |
|||
}] |
|||
}, |
|||
options: { |
|||
scales: { |
|||
y: { |
|||
beginAtZero: true |
|||
}, |
|||
}, |
|||
responsive: true, |
|||
maintainAspectRatio: false, |
|||
} |
|||
}); |
|||
}); |
|||
}, |
|||
render_truck:function(){//Function to add booking chart on the basis of truck
|
|||
rpc.query({ |
|||
model: "truck.booking", |
|||
method: "get_truck_analysis", |
|||
}).then(function (result) { |
|||
new Chart(self.$("#truck"), { |
|||
type: 'doughnut', |
|||
data: { |
|||
labels: result.name, |
|||
datasets: [{ |
|||
label: 'Count', |
|||
data: result.count, |
|||
backgroundColor: [ |
|||
"#665191", |
|||
"#ff7c43", |
|||
"#ffa600", |
|||
"#d45087", |
|||
"#a05195", |
|||
"#6d5c16", |
|||
"#CCCCFF", |
|||
"#003f5c", |
|||
"#2f4b7c", |
|||
"#f95d6a", |
|||
|
|||
], |
|||
borderColor: [ |
|||
"#003f5c", |
|||
"#2f4b7c", |
|||
"#f95d6a", |
|||
"#665191", |
|||
"#d45087", |
|||
"#ff7c43", |
|||
"#ffa600", |
|||
"#a05195", |
|||
"#6d5c16", |
|||
"#CCCCFF" |
|||
], |
|||
barPercentage: 0.5, |
|||
barThickness: 6, |
|||
maxBarThickness: 8, |
|||
minBarLength: 0, |
|||
borderWidth: 1, |
|||
type: 'pie', |
|||
fill: false |
|||
}] |
|||
}, |
|||
options: { |
|||
scales: { |
|||
y: { |
|||
beginAtZero: true |
|||
}, |
|||
}, |
|||
responsive: true, |
|||
maintainAspectRatio: false, |
|||
} |
|||
}); |
|||
}); |
|||
}, |
|||
render_distance:function(){//Function to add total distance chart on the basis of customer and truck
|
|||
rpc.query({ |
|||
model: "truck.booking", |
|||
method: "get_distance", |
|||
}).then(function (result) { |
|||
new Chart(self.$("#cust_distance"), { |
|||
type: 'doughnut', |
|||
data: { |
|||
labels: result.cust, |
|||
datasets: [{ |
|||
label: 'Count', |
|||
data: result.cust_sum, |
|||
backgroundColor: [ |
|||
"#665191", |
|||
"#ff7c43", |
|||
"#ffa600", |
|||
"#d45087", |
|||
"#a05195", |
|||
"#6d5c16", |
|||
"#CCCCFF", |
|||
"#003f5c", |
|||
"#2f4b7c", |
|||
"#f95d6a", |
|||
|
|||
], |
|||
borderColor: [ |
|||
"#003f5c", |
|||
"#2f4b7c", |
|||
"#f95d6a", |
|||
"#665191", |
|||
"#d45087", |
|||
"#ff7c43", |
|||
"#ffa600", |
|||
"#a05195", |
|||
"#6d5c16", |
|||
"#CCCCFF" |
|||
], |
|||
barPercentage: 0.5, |
|||
barThickness: 6, |
|||
maxBarThickness: 8, |
|||
minBarLength: 0, |
|||
borderWidth: 1, |
|||
type: 'pie', |
|||
fill: false |
|||
}] |
|||
}, |
|||
options: { |
|||
scales: { |
|||
y: { |
|||
beginAtZero: true |
|||
}, |
|||
}, |
|||
responsive: true, |
|||
maintainAspectRatio: false, |
|||
} |
|||
}); |
|||
new Chart(self.$("#truck_distance"), { |
|||
type: 'line', |
|||
data: { |
|||
labels: result.truck_name,//x axis
|
|||
datasets: [{ |
|||
label: 'count', // Name the series
|
|||
data: result.truck_sum, // Specify the data values array
|
|||
backgroundColor: '#003f5c', |
|||
borderColor: '#003f5c', |
|||
barPercentage: 0.5, |
|||
barThickness: 6, |
|||
maxBarThickness: 8, |
|||
minBarLength: 0, |
|||
borderWidth: 1, // Specify bar border width
|
|||
type: 'line', // Set this data to a line chart
|
|||
fill: false |
|||
}] |
|||
}, |
|||
options: { |
|||
scales: { |
|||
y: { |
|||
beginAtZero: true |
|||
}, |
|||
}, |
|||
responsive: true, // Instruct chart js to respond nicely.
|
|||
maintainAspectRatio: false, // Add to prevent default behaviour of full-width/height
|
|||
} |
|||
}); |
|||
}); |
|||
}, |
|||
render_weight:function(){//Function to add total goods weight chart on the basis of customer and truck
|
|||
rpc.query({ |
|||
model: "truck.booking", |
|||
method: "get_weight", |
|||
}).then(function (result) { |
|||
new Chart(self.$("#cust_weight"), { |
|||
type: 'line', |
|||
data: { |
|||
labels: result.cust,//x axis
|
|||
datasets: [{ |
|||
label: 'count', // Name the series
|
|||
data: result.cust_sum, // Specify the data values array
|
|||
backgroundColor: '#003f5c', |
|||
borderColor: '#003f5c', |
|||
barPercentage: 0.5, |
|||
barThickness: 6, |
|||
maxBarThickness: 8, |
|||
minBarLength: 0, |
|||
borderWidth: 1, // Specify bar border width
|
|||
type: 'line', // Set this data to a line chart
|
|||
fill: false |
|||
}] |
|||
}, |
|||
options: { |
|||
scales: { |
|||
y: { |
|||
beginAtZero: true |
|||
}, |
|||
}, |
|||
responsive: true, // Instruct chart js to respond nicely.
|
|||
maintainAspectRatio: false, // Add to prevent default behaviour of full-width/height
|
|||
} |
|||
}); |
|||
new Chart(self.$("#truck_weight"), { |
|||
type: 'bar', |
|||
data: { |
|||
labels: result.truck_name, |
|||
datasets: [{ |
|||
label: 'Count', |
|||
data: result.truck_sum, |
|||
backgroundColor: [ |
|||
"#003f5c", |
|||
"#2f4b7c", |
|||
"#f95d6a", |
|||
"#665191", |
|||
"#d45087", |
|||
"#ff7c43", |
|||
"#ffa600", |
|||
"#a05195", |
|||
"#6d5c16", |
|||
"#CCCCFF" |
|||
|
|||
], |
|||
borderColor: [ |
|||
"#003f5c", |
|||
"#2f4b7c", |
|||
"#f95d6a", |
|||
"#665191", |
|||
"#d45087", |
|||
"#ff7c43", |
|||
"#ffa600", |
|||
"#a05195", |
|||
"#6d5c16", |
|||
"#CCCCFF" |
|||
], |
|||
barPercentage: 0.5, |
|||
barThickness: 6, |
|||
maxBarThickness: 8, |
|||
minBarLength: 0, |
|||
borderWidth: 1, |
|||
type: 'bar', |
|||
fill: false |
|||
}] |
|||
}, |
|||
options: { |
|||
scales: { |
|||
y: { |
|||
beginAtZero: true |
|||
}, |
|||
}, |
|||
responsive: true, |
|||
maintainAspectRatio: false, |
|||
} |
|||
}); |
|||
|
|||
}); |
|||
}, |
|||
onclick_this_year: function (ev) {//Function shows a year filtered dashboard
|
|||
self = this; |
|||
rpc.query({ |
|||
model: 'truck.booking', |
|||
method: 'get_select_filter', |
|||
args: [ev], |
|||
}) |
|||
.then(function (result) { |
|||
self.$('#booking_this_day').hide(); |
|||
self.$('#distance_this_day').hide(); |
|||
self.$('#amount_this_day').hide(); |
|||
self.$('#invoice_this_day').hide(); |
|||
self.$('#booking_this_month').hide(); |
|||
self.$('#distance_this_month').hide(); |
|||
self.$('#amount_this_month').hide(); |
|||
self.$('#invoice_this_month').hide(); |
|||
self.$('#booking_this_week').hide(); |
|||
self.$('#distance_this_week').hide(); |
|||
self.$('#amount_this_week').hide(); |
|||
self.$('#invoice_this_week').hide(); |
|||
self.$('.total').hide(); |
|||
self.$('#booking_this_year').show(); |
|||
self.$('#distance_this_year').show(); |
|||
self.$('#amount_this_year').show(); |
|||
self.$('#invoice_this_year').show(); |
|||
self.$('#booking_this_year').empty(); |
|||
self.$('#distance_this_year').empty(); |
|||
self.$('#amount_this_year').empty(); |
|||
self.$('#invoice_this_year').empty(); |
|||
self.$('#booking_this_year').append('<span>' + result['booking'][0]['count'] + '</span>'); |
|||
self.$('#distance_this_year').append('<span>' + result['distance'][0]['sum'] + '</span>'); |
|||
self.$('#amount_this_year').append('<span>' + result['amount'][0]['sum'] + '</span>'); |
|||
self.$('#invoice_this_year').append('<span>' + result['invoice'][0]['sum'] + '</span>'); |
|||
self.get_cust_invoice(result); |
|||
self.get_truck_invoice(result); |
|||
self.get_cust_distance(result); |
|||
self.get_truc_distance(result); |
|||
self.get_cust_weight(result); |
|||
self.get_truck_weight(result); |
|||
}) |
|||
}, |
|||
onclick_this_day: function (ev) {//Function shows day filtered dashboard.
|
|||
self = this; |
|||
rpc.query({ |
|||
model: 'truck.booking', |
|||
method: 'get_select_filter', |
|||
args: [ev], |
|||
}) |
|||
.then(function (result) { |
|||
self.$('.total').hide(); |
|||
self.$('#booking_this_month').hide(); |
|||
self.$('#distance_this_month').hide(); |
|||
self.$('#amount_this_month').hide(); |
|||
self.$('#invoice_this_month').hide(); |
|||
self.$('#booking_this_week').hide(); |
|||
self.$('#distance_this_week').hide(); |
|||
self.$('#amount_this_week').hide(); |
|||
self.$('#invoice_this_week').hide(); |
|||
self.$('#booking_this_year').hide(); |
|||
self.$('#distance_this_year').hide(); |
|||
self.$('#amount_this_year').hide(); |
|||
self.$('#invoice_this_year').hide(); |
|||
self.$('#booking_this_day').show(); |
|||
self.$('#distance_this_day').show(); |
|||
self.$('#amount_this_day').show(); |
|||
self.$('#invoice_this_day').show(); |
|||
self.$('#booking_this_day').empty(); |
|||
self.$('#distance_this_day').empty(); |
|||
self.$('#amount_this_day').empty(); |
|||
self.$('#invoice_this_day').empty(); |
|||
self.$('#booking_this_day').append('<span>' + result['booking'][0]['count'] + '</span>'); |
|||
self.$('#distance_this_day').append('<span>' + result['distance'][0]['sum'] + '</span>'); |
|||
self.$('#amount_this_day').append('<span>' + result['amount'][0]['sum'] + '</span>'); |
|||
self.$('#invoice_this_day').append('<span>' + result['invoice'][0]['sum'] + '</span>'); |
|||
self.get_cust_invoice(result); |
|||
self.get_truck_invoice(result); |
|||
self.get_cust_distance(result); |
|||
self.get_truc_distance(result); |
|||
self.get_cust_weight(result); |
|||
self.get_truck_weight(result); |
|||
}) |
|||
}, |
|||
onclick_this_week: function (ev) {//Function shows week filtered dashboard.
|
|||
self = this; |
|||
rpc.query({ |
|||
model: 'truck.booking', |
|||
method: 'get_select_filter', |
|||
args: [ev], |
|||
}) |
|||
.then(function (result) { |
|||
|
|||
self.$('.total').hide(); |
|||
self.$('#booking_this_month').hide(); |
|||
self.$('#distance_this_month').hide(); |
|||
self.$('#amount_this_month').hide(); |
|||
self.$('#invoice_this_month').hide(); |
|||
self.$('#booking_this_year').hide(); |
|||
self.$('#distance_this_year').hide(); |
|||
self.$('#amount_this_year').hide(); |
|||
self.$('#invoice_this_year').hide(); |
|||
self.$('#booking_this_day').hide(); |
|||
self.$('#distance_this_day').hide(); |
|||
self.$('#amount_this_day').hide(); |
|||
self.$('#invoice_this_day').hide(); |
|||
|
|||
self.$('#booking_this_week').show(); |
|||
self.$('#distance_this_week').show(); |
|||
self.$('#amount_this_week').show(); |
|||
self.$('#invoice_this_week').show(); |
|||
|
|||
self.$('#booking_this_week').empty(); |
|||
self.$('#distance_this_week').empty(); |
|||
self.$('#amount_this_week').empty(); |
|||
self.$('#invoice_this_week').empty(); |
|||
|
|||
self.$('#booking_this_week').append('<span>' + result['booking'][0]['count'] + '</span>'); |
|||
self.$('#distance_this_week').append('<span>' + result['distance'][0]['sum'] + '</span>'); |
|||
self.$('#amount_this_week').append('<span>' + result['amount'][0]['sum'] + '</span>'); |
|||
self.$('#invoice_this_week').append('<span>' + result['invoice'][0]['sum'] + '</span>'); |
|||
self.get_cust_invoice(result); |
|||
self.get_truck_invoice(result); |
|||
self.get_cust_distance(result); |
|||
self.get_truc_distance(result); |
|||
self.get_cust_weight(result); |
|||
self.get_truck_weight(result); |
|||
}) |
|||
}, |
|||
onclick_this_month: function (ev) {//Function shows month filtered dashboard.
|
|||
self = this; |
|||
rpc.query({ |
|||
model: 'truck.booking', |
|||
method: 'get_select_filter', |
|||
args: [ev], |
|||
}) |
|||
.then(function (result) { |
|||
self.$('.total').hide(); |
|||
self.$('#booking_this_year').hide(); |
|||
self.$('#distance_this_year').hide(); |
|||
self.$('#amount_this_year').hide(); |
|||
self.$('#invoice_this_year').hide(); |
|||
self.$('#booking_this_day').hide(); |
|||
self.$('#distance_this_day').hide(); |
|||
self.$('#amount_this_day').hide(); |
|||
self.$('#invoice_this_day').hide(); |
|||
self.$('#booking_this_week').hide(); |
|||
self.$('#distance_this_week').hide(); |
|||
self.$('#amount_this_week').hide(); |
|||
self.$('#invoice_this_week').hide(); |
|||
self.$('#booking_this_month').show(); |
|||
self.$('#distance_this_month').show(); |
|||
self.$('#amount_this_month').show(); |
|||
self.$('#invoice_this_month').show(); |
|||
self.$('#booking_this_month').empty(); |
|||
self.$('#distance_this_month').empty(); |
|||
self.$('#amount_this_month').empty(); |
|||
self.$('#invoice_this_month').empty(); |
|||
self.$('#booking_this_month').append('<span>' + result['booking'][0]['count'] + '</span>'); |
|||
self.$('#distance_this_month').append('<span>' + result['distance'][0]['sum'] + '</span>'); |
|||
self.$('#amount_this_month').append('<span>' + result['amount'][0]['sum'] + '</span>'); |
|||
self.$('#invoice_this_month').append('<span>' + result['invoice'][0]['sum'] + '</span>'); |
|||
self.get_cust_invoice(result); |
|||
self.get_truck_invoice(result); |
|||
self.get_cust_distance(result); |
|||
self.get_truc_distance(result); |
|||
self.get_cust_weight(result); |
|||
self.get_truck_weight(result); |
|||
}) |
|||
}, |
|||
get_cust_invoice: function (result) {//function to create a chart which shows the total invoice according to the customer
|
|||
new Chart(self.$("#booking"), { |
|||
type: 'bar', |
|||
data: { |
|||
labels: result.cust_invoice_name, |
|||
datasets: [{ |
|||
label: 'Count', |
|||
data: result.cust_invoice_sum, |
|||
backgroundColor: [ |
|||
"#003f5c", |
|||
"#2f4b7c", |
|||
"#f95d6a", |
|||
"#665191", |
|||
"#d45087", |
|||
"#ff7c43", |
|||
"#ffa600", |
|||
"#a05195", |
|||
"#6d5c16", |
|||
"#CCCCFF" |
|||
|
|||
], |
|||
borderColor: [ |
|||
"#003f5c", |
|||
"#2f4b7c", |
|||
"#f95d6a", |
|||
"#665191", |
|||
"#d45087", |
|||
"#ff7c43", |
|||
"#ffa600", |
|||
"#a05195", |
|||
"#6d5c16", |
|||
"#CCCCFF" |
|||
], |
|||
barPercentage: 0.5, |
|||
barThickness: 6, |
|||
maxBarThickness: 8, |
|||
minBarLength: 0, |
|||
borderWidth: 1, |
|||
type: 'bar', |
|||
fill: false |
|||
}] |
|||
}, |
|||
options: { |
|||
scales: { |
|||
y: { |
|||
beginAtZero: true |
|||
}, |
|||
}, |
|||
responsive: true, |
|||
maintainAspectRatio: false, |
|||
} |
|||
}); |
|||
}, |
|||
get_truck_invoice: function (result){//function to create a chart which shows the total invoice according to the truck.
|
|||
new Chart(self.$("#truck"), { |
|||
type: 'doughnut', |
|||
data: { |
|||
labels: result.truck_invoice_name, |
|||
datasets: [{ |
|||
label: 'Count', |
|||
data: result.truck_invoice_count, |
|||
backgroundColor: [ |
|||
"#665191", |
|||
"#ff7c43", |
|||
"#ffa600", |
|||
"#d45087", |
|||
"#a05195", |
|||
"#6d5c16", |
|||
"#CCCCFF", |
|||
"#003f5c", |
|||
"#2f4b7c", |
|||
"#f95d6a", |
|||
|
|||
], |
|||
borderColor: [ |
|||
"#003f5c", |
|||
"#2f4b7c", |
|||
"#f95d6a", |
|||
"#665191", |
|||
"#d45087", |
|||
"#ff7c43", |
|||
"#ffa600", |
|||
"#a05195", |
|||
"#6d5c16", |
|||
"#CCCCFF" |
|||
], |
|||
barPercentage: 0.5, |
|||
barThickness: 6, |
|||
maxBarThickness: 8, |
|||
minBarLength: 0, |
|||
borderWidth: 1, |
|||
type: 'pie', |
|||
fill: false |
|||
}] |
|||
}, |
|||
options: { |
|||
scales: { |
|||
y: { |
|||
beginAtZero: true |
|||
}, |
|||
}, |
|||
responsive: true, |
|||
maintainAspectRatio: false, |
|||
} |
|||
}); |
|||
}, |
|||
get_cust_distance: function (result){//function to create a graph which shows the distance according to the customer
|
|||
new Chart(self.$("#cust_distance"), { |
|||
type: 'doughnut', |
|||
data: { |
|||
labels: result.cust_distance_name, |
|||
datasets: [{ |
|||
label: 'Count', |
|||
data: result.cust_distance_count, |
|||
backgroundColor: [ |
|||
"#665191", |
|||
"#ff7c43", |
|||
"#ffa600", |
|||
"#d45087", |
|||
"#a05195", |
|||
"#6d5c16", |
|||
"#CCCCFF", |
|||
"#003f5c", |
|||
"#2f4b7c", |
|||
"#f95d6a", |
|||
|
|||
], |
|||
borderColor: [ |
|||
"#003f5c", |
|||
"#2f4b7c", |
|||
"#f95d6a", |
|||
"#665191", |
|||
"#d45087", |
|||
"#ff7c43", |
|||
"#ffa600", |
|||
"#a05195", |
|||
"#6d5c16", |
|||
"#CCCCFF" |
|||
], |
|||
barPercentage: 0.5, |
|||
barThickness: 6, |
|||
maxBarThickness: 8, |
|||
minBarLength: 0, |
|||
borderWidth: 1, |
|||
type: 'pie', |
|||
fill: false |
|||
}] |
|||
}, |
|||
options: { |
|||
scales: { |
|||
y: { |
|||
beginAtZero: true |
|||
}, |
|||
}, |
|||
responsive: true, |
|||
maintainAspectRatio: false, |
|||
} |
|||
}); |
|||
}, |
|||
get_truc_distance: function (result){//function to create a graph which shows the distance according to the truck
|
|||
new Chart(self.$("#truck_distance"), { |
|||
type: 'line', |
|||
data: { |
|||
labels: result.truck_distance_name,//x axis
|
|||
datasets: [{ |
|||
label: 'count', // Name the series
|
|||
data: result.truck_distance_count, // Specify the data values array
|
|||
backgroundColor: '#003f5c', |
|||
borderColor: '#003f5c', |
|||
barPercentage: 0.5, |
|||
barThickness: 6, |
|||
maxBarThickness: 8, |
|||
minBarLength: 0, |
|||
borderWidth: 1, // Specify bar border width
|
|||
type: 'line', // Set this data to a line chart
|
|||
fill: false |
|||
}] |
|||
}, |
|||
options: { |
|||
scales: { |
|||
y: { |
|||
beginAtZero: true |
|||
}, |
|||
}, |
|||
responsive: true, // Instruct chart js to respond nicely.
|
|||
maintainAspectRatio: false, // Add to prevent default behaviour of full-width/height
|
|||
} |
|||
}); |
|||
}, |
|||
get_cust_weight: function (result){//function to create a chart which shows the total goods weight according to the customer
|
|||
new Chart(self.$("#cust_weight"), { |
|||
type: 'line', |
|||
data: { |
|||
labels: result.cust_weight_name,//x axis
|
|||
datasets: [{ |
|||
label: 'count', // Name the series
|
|||
data: result.cust_weight_count, // Specify the data values array
|
|||
backgroundColor: '#003f5c', |
|||
borderColor: '#003f5c', |
|||
barPercentage: 0.5, |
|||
barThickness: 6, |
|||
maxBarThickness: 8, |
|||
minBarLength: 0, |
|||
borderWidth: 1, // Specify bar border width
|
|||
type: 'line', // Set this data to a line chart
|
|||
fill: false |
|||
}] |
|||
}, |
|||
options: { |
|||
scales: { |
|||
y: { |
|||
beginAtZero: true |
|||
}, |
|||
}, |
|||
responsive: true, // Instruct chart js to respond nicely.
|
|||
maintainAspectRatio: false, // Add to prevent default behaviour of full-width/height
|
|||
} |
|||
}); |
|||
}, |
|||
get_truck_weight: function (result){//function to create a chart which shows the total goods weight according to the truck
|
|||
new Chart(self.$("#truck_weight"), { |
|||
type: 'bar', |
|||
data: { |
|||
labels: result.truck_weight_name, |
|||
datasets: [{ |
|||
label: 'Count', |
|||
data: result.truck_weight_count, |
|||
backgroundColor: [ |
|||
"#003f5c", |
|||
"#2f4b7c", |
|||
"#f95d6a", |
|||
"#665191", |
|||
"#d45087", |
|||
"#ff7c43", |
|||
"#ffa600", |
|||
"#a05195", |
|||
"#6d5c16", |
|||
"#CCCCFF" |
|||
|
|||
], |
|||
borderColor: [ |
|||
"#003f5c", |
|||
"#2f4b7c", |
|||
"#f95d6a", |
|||
"#665191", |
|||
"#d45087", |
|||
"#ff7c43", |
|||
"#ffa600", |
|||
"#a05195", |
|||
"#6d5c16", |
|||
"#CCCCFF" |
|||
], |
|||
barPercentage: 0.5, |
|||
barThickness: 6, |
|||
maxBarThickness: 8, |
|||
minBarLength: 0, |
|||
borderWidth: 1, |
|||
type: 'bar', |
|||
fill: false |
|||
}] |
|||
}, |
|||
options: { |
|||
scales: { |
|||
y: { |
|||
beginAtZero: true |
|||
}, |
|||
}, |
|||
responsive: true, |
|||
maintainAspectRatio: false, |
|||
} |
|||
}); |
|||
}, |
|||
}) |
|||
core.action_registry.add('dashboard_tags', CustomDashBoard); |
|||
return CustomDashBoard; |
@ -0,0 +1,43 @@ |
|||
odoo.define('packers_and_movers_management.website_page', function (require) { |
|||
'use strict'; |
|||
var publicWidget = require('web.public.widget'); |
|||
var ajax = require('web.ajax'); |
|||
var Dialog = require('web.Dialog'); |
|||
publicWidget.registry.PackersAndMoversWidget = publicWidget.Widget.extend({ |
|||
//Extends the publicWidget.Widget class to hide and show the button and calculate the distance between locations.
|
|||
selector: '.packers-and-movers-widget', |
|||
events: { |
|||
'click #check': '_onCheckClick', |
|||
'click #next': '_onNextClick', |
|||
}, |
|||
|
|||
_onCheckClick: function(ev) {//Click function to fetch from and to location value and calculate the distance.
|
|||
var self = this |
|||
var from_location = this.el.querySelector('#from').value |
|||
var to_location = this.el.querySelector('#to').value |
|||
if (from_location!='' && to_location!='') |
|||
{ |
|||
this.el.querySelector('#loader').classList.remove("d-none"); |
|||
ajax.jsonRpc('/geo/' + from_location + '/' + to_location, 'call', { |
|||
}).then(function (data) { // success callback
|
|||
self.$('#distance').val(data); |
|||
self.el.querySelector('#loader').classList.add("d-none"); |
|||
self.el.querySelector('#details').classList.remove("d-none"); |
|||
}).catch(function (data) { |
|||
self.el.querySelector('#loader').classList.add("d-none"); |
|||
Dialog.alert(this, "Please enter valid city"); |
|||
return false; |
|||
}); |
|||
} |
|||
else |
|||
{ |
|||
Dialog.alert(this, "Add Pickup city and drop City"); |
|||
return false; |
|||
} |
|||
}, |
|||
_onNextClick: function (ev) {//Function to show the customer details form view
|
|||
this.el.querySelector('#customer').classList.remove("d-none"); |
|||
}, |
|||
}); |
|||
return publicWidget.registry.PackersAndMoversWidget; |
|||
}); |
@ -0,0 +1,237 @@ |
|||
: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: 1rem; |
|||
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: 1.7rem; |
|||
background-color: var(--mauve-light); |
|||
color: var(--mauve); |
|||
height: 50px; |
|||
width: 50px; |
|||
border-radius: 50%; |
|||
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 */ |
|||
thead { |
|||
background-color: #e9ecf0; |
|||
border-bottom: none; |
|||
} |
|||
|
|||
.table thead th { |
|||
border-bottom: none; |
|||
} |
|||
|
|||
.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; |
|||
} |
|||
|
|||
.crm_scroll_table .count-container { |
|||
height: 45px; |
|||
width: 130px; |
|||
border-radius: 50px; |
|||
margin-right: 10px; |
|||
} |
|||
|
|||
.crm_scroll_table .item-content ul > li { |
|||
font-size: 1.1rem; |
|||
} |
@ -0,0 +1,312 @@ |
|||
<?xml version="1.0" encoding="utf-8" ?> |
|||
<!--This template defines a custom dashboard for Packers and Movers Management. |
|||
The dashboard displays various statistics and graphs related to truck bookings, |
|||
distances, revenue, and customer analysis. It also includes tables showing |
|||
upcoming events, top customers, and top trucks.--> |
|||
<template> |
|||
<t t-name="CustomDashBoard"> |
|||
<!-- This template defines a custom dashboard. --> |
|||
<div class="oh_dashboards" style="margin-top: 20px;"> |
|||
<div class="container-fluid o_pj_dashboard"> |
|||
<!-- Your template implementation here --> |
|||
</div> |
|||
</div> |
|||
</t> |
|||
<t t-name="DashboardTruckBooking"> |
|||
<div class="scrollbar" id="style-1"> |
|||
<div class="col-xs-12"> |
|||
<div class="row" style="margin:0px;"> |
|||
<h2 class="section-header" |
|||
style="font-size: 2em; color: #7d7eaf;">Packers And |
|||
Movers Management |
|||
Dashboard |
|||
</h2> |
|||
<div class="select" id="top_product_button"> |
|||
<select name="filter" id="stock_selection" style="width: 283px; height: 30px; |
|||
border-color:#7d7eaf; background-color: #fff; border-radius: 10px;"> |
|||
<option id="day" value="day">Day</option> |
|||
<option id="month" value="month" selected="">Month |
|||
</option> |
|||
<option id="week" value="week">Week</option> |
|||
<option id="year" value="year">Year</option> |
|||
</select> |
|||
</div> |
|||
<div class="crm_dash_cards row"> |
|||
<div class="col-sm-12 col-md-3"> |
|||
<div class="dashboard-card card-shadow my_lead"> |
|||
<div class="dashboard-card__icon-container bg-mauve-light d-flex justify-content-center align-items-center"> |
|||
<i class="fa fa-line-chart text-mauve"/> |
|||
</div> |
|||
<div class="dashboard-card__details"> |
|||
<h3> |
|||
<div class="total"> |
|||
<t t-esc="widget.booking_count"/> |
|||
</div> |
|||
<span> |
|||
<div id="booking_this_year"/> |
|||
<div id="booking_this_day"/> |
|||
<div id="booking_this_month"/> |
|||
<div id="booking_this_week"/> |
|||
</span> |
|||
</h3> |
|||
<h4>Total Booking</h4> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-sm-12 col-md-3"> |
|||
<div class="dashboard-card card-shadow opportunity"> |
|||
<div class="dashboard-card__icon-container bg-mauve-light d-flex justify-content-center align-items-center"> |
|||
<i class="fa fa-map-marker text-mauve"/> |
|||
</div> |
|||
<div class="dashboard-card__details"> |
|||
<h3> |
|||
<span> |
|||
<div class="total"> |
|||
<t t-esc="widget.distance_count"/> |
|||
</div> |
|||
<div id="distance_this_year"/> |
|||
<div id="distance_this_day"/> |
|||
<div id="distance_this_month"/> |
|||
<div id="distance_this_week"/> |
|||
</span> |
|||
</h3> |
|||
<h4>Total Distance</h4> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-sm-12 col-md-3"> |
|||
<div class="dashboard-card card-shadow exp_revenue"> |
|||
<div |
|||
class="dashboard-card__icon-container bg-mauve-light d-flex justify-content-center align-items-center"> |
|||
<i class="fa fa-usd text-mauve"/> |
|||
</div> |
|||
<div class="dashboard-card__details"> |
|||
<h3> |
|||
<div class="total"> |
|||
<t t-esc="widget.total_amount"/> |
|||
</div> |
|||
<span> |
|||
<div id="amount_this_year"/> |
|||
<div id="amount_this_day"/> |
|||
<div id="amount_this_month"/> |
|||
<div id="amount_this_week"/> |
|||
</span> |
|||
</h3> |
|||
<h4>Total Amount</h4> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-sm-12 col-md-3"> |
|||
<div class="dashboard-card card-shadow revenue_card revenue_card"> |
|||
<div |
|||
class="dashboard-card__icon-container bg-mauve-light d-flex justify-content-center align-items-center"> |
|||
<i class="fa fa-usd text-mauve"/> |
|||
</div> |
|||
<div class="dashboard-card__details"> |
|||
<h3> |
|||
<div class="total"> |
|||
<t t-esc="widget.total_invoice"/> |
|||
</div> |
|||
<span> |
|||
<div id="invoice_this_year"/> |
|||
<div id="invoice_this_day"/> |
|||
<div id="invoice_this_month"/> |
|||
<div id="invoice_this_week"/> |
|||
</span> |
|||
</h3> |
|||
<h4>Invoiced Amount</h4> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-sm-6 col-lg-6"> |
|||
<div class="oh-card text-color graph"> |
|||
<div class="oh-card-body pb-0"> |
|||
<h4 class="head"> |
|||
Customer Analysis By Invoice |
|||
</h4> |
|||
<hr/> |
|||
</div> |
|||
<canvas id="booking" width="300" height="200"/> |
|||
</div> |
|||
</div> |
|||
<div class="col-sm-6 col-lg-6 head"> |
|||
<div class="oh-card text-color graph"> |
|||
<div class="oh-card-body pb-0"> |
|||
<h4 class="head"> |
|||
Truck Analysis By Invoice |
|||
</h4> |
|||
</div> |
|||
<hr/> |
|||
<canvas id="truck" width="300" height="200"/> |
|||
</div> |
|||
</div> |
|||
<div class="col-sm-6 col-lg-6"> |
|||
<div class="oh-card text-color graph"> |
|||
<div class="oh-card-body pb-0"> |
|||
<h4 class="head"> |
|||
Customer Analysis By Distance |
|||
</h4> |
|||
<hr/> |
|||
</div> |
|||
<canvas id="cust_distance" width="300" |
|||
height="200"/> |
|||
</div> |
|||
</div> |
|||
<div class="col-sm-6 col-lg-6 head"> |
|||
<div class="oh-card text-color graph"> |
|||
<div class="oh-card-body pb-0"> |
|||
<h4 class="head"> |
|||
Truck Analysis By Distance |
|||
</h4> |
|||
</div> |
|||
<hr/> |
|||
<canvas id="truck_distance" width="300" |
|||
height="200"/> |
|||
</div> |
|||
</div> |
|||
<div class="col-sm-6 col-lg-6"> |
|||
<div class="oh-card text-color graph"> |
|||
<div class="oh-card-body pb-0"> |
|||
<h4 class="head"> |
|||
Customer Analysis By Weight |
|||
</h4> |
|||
<hr/> |
|||
</div> |
|||
<canvas id="cust_weight" width="300" height="200"/> |
|||
</div> |
|||
</div> |
|||
<div class="col-sm-6 col-lg-6 head"> |
|||
<div class="oh-card text-color graph"> |
|||
<div class="oh-card-body pb-0"> |
|||
<h4 class="head"> |
|||
Truck Analysis By Weight |
|||
</h4> |
|||
</div> |
|||
<hr/> |
|||
<canvas id="truck_weight" width="300" |
|||
height="200"/> |
|||
</div> |
|||
</div> |
|||
<div class="col-md-4 col-lg-4"> |
|||
<div class="customer"> |
|||
<div class="customer_head"> |
|||
Upcoming |
|||
</div> |
|||
<div class="col-sm-12 col-lg-12" |
|||
style="padding:0;"> |
|||
<div class="text-color"> |
|||
<table class="table table-sm"> |
|||
<thead> |
|||
<tr> |
|||
<th rowspan="14">Sequence.no |
|||
</th> |
|||
<th rowspan="14">customer Name |
|||
</th> |
|||
<th rowspan="14">Date</th> |
|||
</tr> |
|||
</thead> |
|||
<tbody> |
|||
<t t-foreach="widget.upcoming" |
|||
t-as="upcoming"> |
|||
<tr> |
|||
<td> |
|||
<t t-esc="upcoming['reference_no']"/> |
|||
</td> |
|||
<td> |
|||
<t t-esc="upcoming['name']"/> |
|||
</td> |
|||
<td> |
|||
<t t-esc="upcoming['date']"/> |
|||
</td> |
|||
</tr> |
|||
</t> |
|||
</tbody> |
|||
</table> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-md-4 col-lg-4"> |
|||
<div class="customer"> |
|||
<div class="customer_head"> |
|||
Top 10 Customers |
|||
</div> |
|||
<div class="col-sm-12 col-lg-12" |
|||
style="padding:0;"> |
|||
<div class="text-color"> |
|||
<table class="table table-sm"> |
|||
<thead> |
|||
<tr> |
|||
<th rowspan="14" |
|||
style="text-align:center;"> |
|||
S.NO |
|||
</th> |
|||
<th rowspan="14">Truck Type |
|||
</th> |
|||
</tr> |
|||
</thead> |
|||
<tbody> |
|||
<t t-foreach="widget.customer" |
|||
t-as="customer"> |
|||
<tr> |
|||
<td> |
|||
<div class="circle"> |
|||
<t t-esc="customer_index + 1"/> |
|||
</div> |
|||
</td> |
|||
<td> |
|||
<t t-esc="customer['name']"/> |
|||
</td> |
|||
</tr> |
|||
</t> |
|||
</tbody> |
|||
</table> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-md-4 col-lg-4"> |
|||
<div class="customer"> |
|||
<div class="customer_head"> |
|||
Top 10 Truck |
|||
</div> |
|||
<div class="col-sm-12 col-lg-12" |
|||
style="padding:0;"> |
|||
<div class="text-color"> |
|||
<table class="table table-sm"> |
|||
<thead> |
|||
<tr> |
|||
<th rowspan="14" |
|||
style="text-align:center;"> |
|||
count |
|||
</th> |
|||
<th rowspan="14">Truck Type |
|||
</th> |
|||
</tr> |
|||
</thead> |
|||
<tbody> |
|||
<t t-foreach="widget.truck" |
|||
t-as="truck"> |
|||
<tr> |
|||
<td> |
|||
<div class="circle"> |
|||
<t t-esc="truck_index + 1"/> |
|||
</div> |
|||
</td> |
|||
<td> |
|||
<t t-esc="truck['name']"/> |
|||
</td> |
|||
</tr> |
|||
</t> |
|||
</tbody> |
|||
</table> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</t> |
|||
</template> |
@ -0,0 +1,12 @@ |
|||
<?xml version="1.0" encoding="utf-8" ?> |
|||
<odoo> |
|||
<!-- The client action record to view the Dashboard--> |
|||
<record id="dashboard_view_action" model="ir.actions.client"> |
|||
<field name="name">Dashboard</field> |
|||
<field name="tag">dashboard_tags</field> |
|||
</record> |
|||
|
|||
<menuitem id="dashboard_view_menu_action" action="dashboard_view_action" |
|||
parent="packers_and_movers_management.truck_booking_menu_root" |
|||
sequence="0"/> |
|||
</odoo> |
@ -0,0 +1,69 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<!--Inherited the fleet form to add Additional information--> |
|||
<record id="fleet_vehicle_model_view_form" model="ir.ui.view"> |
|||
<field name="name"> |
|||
fleet.vehicle.model.view.form.inherit.packers.and.movers.management |
|||
</field> |
|||
<field name="model">fleet.vehicle.model</field> |
|||
<field name="inherit_id" ref="fleet.fleet_vehicle_model_view_form"/> |
|||
<field name="arch" type="xml"> |
|||
<field name="vehicle_type" position="inside"/> |
|||
<page name="information" position="inside"> |
|||
<group> |
|||
<group string="Truck Information" |
|||
attrs="{'invisible': [('vehicle_type', '!=', 'truck')]}"> |
|||
<field name="truck_type_id"/> |
|||
</group> |
|||
</group> |
|||
</page> |
|||
</field> |
|||
</record> |
|||
<!--Creation action of the truck type model--> |
|||
<record id="truck_type_action" model="ir.actions.act_window"> |
|||
<field name="name">Truck Type Action</field> |
|||
<field name="res_model">truck.type</field> |
|||
<field name="view_mode">tree,form</field> |
|||
</record> |
|||
<!--The tree for the truck type--> |
|||
<record id="truck_type_view_tree" model="ir.ui.view"> |
|||
<field name="name">truck.type.view.tree</field> |
|||
<field name="model">truck.type</field> |
|||
<field name="arch" type="xml"> |
|||
<tree string="truck.type"> |
|||
<field name="name"/> |
|||
</tree> |
|||
</field> |
|||
</record> |
|||
<!-- Form view for the Truck types--> |
|||
<record id="truck_type_view_form" model="ir.ui.view"> |
|||
<field name="name">truck.type.view.form</field> |
|||
<field name="model">truck.type</field> |
|||
<field name="arch" type="xml"> |
|||
<form string="truck_type"> |
|||
<sheet> |
|||
<group> |
|||
<group> |
|||
<field name="name"/> |
|||
<field name="capacity"/> |
|||
<field name="weight"/> |
|||
<field name="unit"/> |
|||
</group> |
|||
<group> |
|||
<field name="length" placeholder="Length..."/> |
|||
<field name="width" placeholder="Breadth..."/> |
|||
<field name="height" placeholder="Height.."/> |
|||
<field name="company_id" invisible="1"/> |
|||
</group> |
|||
</group> |
|||
</sheet> |
|||
</form> |
|||
</field> |
|||
</record> |
|||
<!-- Menu to add the truck details in parent menus--> |
|||
<menuitem id="truck_type_fleet_menu_action" action="truck_type_action" |
|||
parent="fleet.fleet_configuration"/> |
|||
<menuitem id="truck_type_menu_action" action="truck_type_action" |
|||
parent="packers_and_movers_management.master_data_menu"/> |
|||
|
|||
</odoo> |
@ -0,0 +1,50 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<!-- Action specified for the goods type--> |
|||
<record id="goods_type_action" model="ir.actions.act_window"> |
|||
<field name="name">Goods Type</field> |
|||
<field name="res_model">goods.type</field> |
|||
<field name="view_mode">tree</field> |
|||
</record> |
|||
<!-- Tree of the goods type--> |
|||
<record id="goods_type_view_tree" model="ir.ui.view"> |
|||
<field name="name">goods.type.view.tree</field> |
|||
<field name="model">goods.type</field> |
|||
<field name="arch" type="xml"> |
|||
<tree string="Goods Type" editable="bottom"> |
|||
<field name="name"/> |
|||
<field name="company_id" invisible="1"/> |
|||
</tree> |
|||
</field> |
|||
</record> |
|||
<!--Form view of the goods type--> |
|||
<record id="goods_type_view_form" model="ir.ui.view"> |
|||
<field name="name">goods.type.view.form</field> |
|||
<field name="model">goods.type</field> |
|||
<field name="arch" type="xml"> |
|||
<form string="goods_type"> |
|||
<sheet> |
|||
<group> |
|||
<group> |
|||
<field name="name"/> |
|||
<field name="company_id" invisible="1"/> |
|||
</group> |
|||
</group> |
|||
</sheet> |
|||
</form> |
|||
</field> |
|||
</record> |
|||
<!--Menu used to add the Good type details--> |
|||
<menuitem id="truck_booking_menu_root" name="Packers And Movers" |
|||
web_icon="packers_and_movers_management,static/description/icon.png"/> |
|||
<menuitem id="master_data_menu" name="Master Data" |
|||
parent="packers_and_movers_management.truck_booking_menu_root" |
|||
sequence='2'/> |
|||
<menuitem id="customer_menu_action" |
|||
action="base.action_partner_customer_form" |
|||
parent="packers_and_movers_management.master_data_menu" |
|||
sequence="0"/> |
|||
<menuitem id="goods_type_menu_action" action="goods_type_action" |
|||
parent="packers_and_movers_management.master_data_menu"/> |
|||
|
|||
</odoo> |
@ -0,0 +1,54 @@ |
|||
<?xml version="1.0" encoding="UTF-8" ?> |
|||
<odoo> |
|||
<!-- Config Settings Inherited form view used to add additional datas in the form--> |
|||
<record id="res_config_settings_view_form" model="ir.ui.view"> |
|||
<field name="name">res.config.settings.view.form.inherit.packers.and.movers.management</field> |
|||
<field name="model">res.config.settings</field> |
|||
<field name="priority" eval="15"/> |
|||
<field name="inherit_id" ref="base.res_config_settings_view_form"/> |
|||
<field name="arch" type="xml"> |
|||
<xpath expr="//div[hasclass('settings')]" position="inside"> |
|||
<div class="app_settings_block" data-string="Pricing" string="Packers And Movers" |
|||
data-key="packers_and_movers_management"> |
|||
<h2>Pricing</h2> |
|||
<div class="row mt16 o_settings_container" id="distance_amount"> |
|||
<div class="col-12 col-lg-6 o_setting_box"> |
|||
<div class="o_setting_right_pane"> |
|||
<label for="distance_amount"/> |
|||
<div class="text-muted"> |
|||
Distance amount per 1 kilometer |
|||
</div> |
|||
<field name="distance_amount"/> |
|||
</div> |
|||
</div> |
|||
<div class="col-12 col-lg-6 o_setting_box"> |
|||
<div class="o_setting_left_pane"> |
|||
<field name="is_extra"/> |
|||
</div> |
|||
<div class="o_setting_right_pane"> |
|||
<label for="is_extra"/> |
|||
</div> |
|||
<div class="o_setting_right_pane" attrs="{'invisible':[('is_extra','=',False)]}"> |
|||
<label for="extra_amount"/> |
|||
<field name="extra_amount"/> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</xpath> |
|||
</field> |
|||
</record> |
|||
<!-- Action used in the config settings model--> |
|||
<record id="res_config_settings_action" model="ir.actions.act_window"> |
|||
<field name="name">Configuration Action</field> |
|||
<field name="res_model">res.config.settings</field> |
|||
<field name="view_mode">form</field> |
|||
<field name="view_id" ref="res_config_settings_view_form"/> |
|||
<field name="target">inline</field> |
|||
<field name="context">{'module' : 'packers_and_movers_management','bin_size': False}</field> |
|||
</record> |
|||
<!-- Menu used in the Truck booking root and the Config Settings--> |
|||
<menuitem id="configuration_menu" name="Configuration" parent="packers_and_movers_management.truck_booking_menu_root"/> |
|||
<menuitem id="res_config_settings_menu_action" name="Settings" parent="packers_and_movers_management.configuration_menu" sequence="0" |
|||
action="res_config_settings_action"/> |
|||
</odoo> |
@ -0,0 +1,124 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<!-- Action specified for the truck booking--> |
|||
<record id="truck_booking_action" model="ir.actions.act_window"> |
|||
<field name="name">Truck Booking</field> |
|||
<field name="res_model">truck.booking</field> |
|||
<field name="view_mode">tree,form</field> |
|||
</record> |
|||
<!--Search view records used in the truck booking --> |
|||
<record id='truck_booking_view_search' model='ir.ui.view'> |
|||
<field name="name">truck.booking.view.search</field> |
|||
<field name="model">truck.booking</field> |
|||
<field name="arch" type="xml"> |
|||
<search string="Truck Booking"> |
|||
<field name="reference_no"/> |
|||
<field name="partner_id"/> |
|||
<field name="truck_id"/> |
|||
<field name="goods_type_id"/> |
|||
<field name="state"/> |
|||
<separator/> |
|||
<filter string="Confirm" name="confirm" |
|||
domain="[('state', '=', 'confirm')]"/> |
|||
<filter string="Invoiced" name="invoiced" |
|||
domain="[('state', '=', 'invoice')]"/> |
|||
<filter string="Draft" name="draft" |
|||
domain="[('state', '=', 'draft')]"/> |
|||
<group expand="1" string="Group By"> |
|||
<filter string="Customer" name="groupby_partner_id" |
|||
context="{'group_by': 'partner_id'}"/> |
|||
<filter string="Truck Type" name="groupby_truck_id" |
|||
context="{'group_by': 'truck_id'}"/> |
|||
<filter string="goods Type" name="groupby_goods_type_id" |
|||
context="{'group_by': 'goods_type_id'}"/> |
|||
<filter string="State" name="groupby_state" |
|||
context="{'group_by': 'state'}"/> |
|||
</group> |
|||
</search> |
|||
</field> |
|||
</record> |
|||
<!--Tree view of the truck booking--> |
|||
<record id="truck_booking_view_tree" model="ir.ui.view"> |
|||
<field name="name">truck.booking.view.tree</field> |
|||
<field name="model">truck.booking</field> |
|||
<field name="arch" type="xml"> |
|||
<tree string="truck.booking"> |
|||
<field name="reference_no"/> |
|||
<field name="partner_id"/> |
|||
<field name="from_location"/> |
|||
<field name="to_location"/> |
|||
<field name="state"/> |
|||
</tree> |
|||
</field> |
|||
</record> |
|||
<!--form view of the truck booking--> |
|||
<record id="truck_booking_view_form" model="ir.ui.view"> |
|||
<field name="name">truck.booking.view.form</field> |
|||
<field name="model">truck.booking</field> |
|||
<field name="arch" type="xml"> |
|||
<form string="truck_booking"> |
|||
<header> |
|||
<button name="action_confirm" string='Confirm' |
|||
class="btn-primary" states="draft" type="object"/> |
|||
<button name="action_create_invoice" |
|||
string='Create Invoice' class="btn-primary" |
|||
attrs="{'invisible': ['|', ('hide_invoice', '=', True), ('state', '!=', 'confirm')]}" |
|||
type="object"/> |
|||
<field name="state" widget="statusbar" string="Status"/> |
|||
</header> |
|||
<sheet> |
|||
<div name="button_box" position="inside"> |
|||
<button class="oe_stat_button" type="object" |
|||
name="action_view_invoice" |
|||
icon="fa-pencil-square-o" |
|||
attrs="{'invisible': [('invoice_count', '=', '0')]}"> |
|||
<field string="Invoice" name="invoice_count" |
|||
widget="statinfo"/> |
|||
</button> |
|||
</div> |
|||
<group> |
|||
<widget name="web_ribbon" title="INVOICED" |
|||
bg_color="bg-success" |
|||
attrs="{'invisible': [('state', '!=', 'invoice')]}"/> |
|||
</group> |
|||
<div class="oe_title"> |
|||
<h1> |
|||
<field name="reference_no"/> |
|||
</h1> |
|||
</div> |
|||
<group> |
|||
<group> |
|||
<field name="partner_id"/> |
|||
<field name="from_location"/> |
|||
<field name="to_location"/> |
|||
<field name="distance"/> |
|||
<field name="amount"/> |
|||
<field name="hide_invoice" invisible="1"/> |
|||
</group> |
|||
<group> |
|||
<field name="date"/> |
|||
<field name="truck_id"/> |
|||
<field name="goods_type_id"/> |
|||
<field name="weight"/> |
|||
<field name="unit"/> |
|||
<field name="invoiced_amount" invisible="1"/> |
|||
<field name="company_id" invisible="1"/> |
|||
</group> |
|||
</group> |
|||
</sheet> |
|||
<div class="oe_chatter"> |
|||
<field name="message_follower_ids"/> |
|||
<field name="message_ids"/> |
|||
<field name="activity_ids"/> |
|||
</div> |
|||
</form> |
|||
</field> |
|||
</record> |
|||
<!--Menus used as the parent and submenu for the truck booking--> |
|||
<menuitem id="operation_menu" name="Operations" |
|||
parent="packers_and_movers_management.truck_booking_menu_root" |
|||
sequence='1'/> |
|||
<menuitem id="truck_booking_menu_action" action="truck_booking_action" |
|||
parent="packers_and_movers_management.operation_menu"/> |
|||
|
|||
</odoo> |
@ -0,0 +1,166 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<!-- Template for the Truck booking page--> |
|||
<template id="truck_booking_page" name="Booking"> |
|||
<t t-call="website.layout"> |
|||
<div id="wrap" class="wrap packers-and-movers-widget"> |
|||
<div class="container"> |
|||
<div class="col-md-6"> |
|||
<h1 class="head"> |
|||
<b>Packers And Movers</b> |
|||
</h1> |
|||
<div class="image"/> |
|||
</div> |
|||
<div class="col-md-6 body" t-ref="body"> |
|||
<form action="/booking/submit"> |
|||
<div id="location"> |
|||
<div class="form-group"> |
|||
<input type="text" |
|||
placeholder='Pick Up City Location' |
|||
id="from" |
|||
name="pickup_location" |
|||
class="link-style" required="true"/> |
|||
</div> |
|||
<div class="form-group"> |
|||
<input type="text" |
|||
placeholder='Drop City Location' |
|||
id="to" |
|||
name="drop_location" |
|||
class="link-style" required="true"/> |
|||
</div> |
|||
<button type="submit" id="check" |
|||
class="button">Check Fare |
|||
</button> |
|||
</div> |
|||
<div id="loader" class="d-none"/> |
|||
<div id="details" class="d-none"> |
|||
<div class="form-group"> |
|||
<label for="distance">Distance</label> |
|||
<input type="text" |
|||
class="form-control link-style" |
|||
name="distance" |
|||
id="distance" autocomplete="off" |
|||
required="true" readonly="1"/> |
|||
</div> |
|||
<div class="form-group"> |
|||
<label>Date</label> |
|||
<input type="date" name="date" |
|||
class="form-control link-style" |
|||
required="true"/> |
|||
</div> |
|||
<div class="form-group"> |
|||
<label>Truck Type</label> |
|||
<select name="truck_type" |
|||
class="form-control link-style" |
|||
required="true"> |
|||
<option value="">select truck</option> |
|||
<t t-foreach="truck_ids" |
|||
t-as="truck_id"> |
|||
<option t-esc="truck_id.name" |
|||
t-att-value="truck_id.id"/> |
|||
</t> |
|||
</select> |
|||
</div> |
|||
<div class="form-group"> |
|||
<label>Goods Type</label> |
|||
<select name="goods_type" |
|||
class="form-control link-style" |
|||
required="true"> |
|||
<option value="">Select Goods</option> |
|||
<t t-foreach="goods_ids" |
|||
t-as="goods_id"> |
|||
<option t-esc="goods_id.name" |
|||
t-att-value="goods_id.id"/> |
|||
</t> |
|||
</select> |
|||
</div> |
|||
<div class="form-group"> |
|||
<label>Enter weight</label> |
|||
<div class="select"> |
|||
<input type="number" |
|||
placeholder='Approx Weight(1Ton =1000KG)' |
|||
name="weight" |
|||
class="form-control link-style" |
|||
id="weight" required="true"/> |
|||
<select name="unit" class="unit"> |
|||
<option value="kg" |
|||
selected="selected">KG |
|||
</option> |
|||
<option value="tons">Tons</option> |
|||
</select> |
|||
</div> |
|||
</div> |
|||
<button type="submit" id="next" class="button"> |
|||
Next |
|||
</button> |
|||
</div> |
|||
<div id="customer" class="d-none"> |
|||
<div class="form-group"> |
|||
<label for="name">Name</label> |
|||
<input type="text" placeholder='Enter Name' |
|||
class="form-control link-style" |
|||
name="name" required="true"/> |
|||
</div> |
|||
<div class="form-group"> |
|||
<label for="city">City</label> |
|||
<input type="text" placeholder='City' |
|||
class="form-control link-style" |
|||
name="city" |
|||
required="true"/> |
|||
</div> |
|||
<div class="form-group"> |
|||
<label for="state">State</label> |
|||
<select name="state" |
|||
class="form-control link-style" |
|||
required="true"> |
|||
<t t-foreach="state_ids" |
|||
t-as="state_id"> |
|||
<option t-esc="state_id.name" |
|||
t-att-value="state_id.id"/> |
|||
</t> |
|||
</select> |
|||
</div> |
|||
<div class="form-group"> |
|||
<label for="country">Country</label> |
|||
<select name="country" |
|||
class="form-control link-style" |
|||
required="true"> |
|||
<t t-foreach="country_ids" |
|||
t-as="country_id"> |
|||
<option t-esc="country_id.name" |
|||
t-att-value="country_id.id"/> |
|||
</t> |
|||
</select> |
|||
</div> |
|||
<div class="form-group"> |
|||
<label>Enter Mobile No</label> |
|||
<input type="tel" |
|||
placeholder='Mobile Number' |
|||
class="form-control link-style" |
|||
name="mobile_no"/> |
|||
</div> |
|||
<button type="submit" class="button">Confirm |
|||
</button> |
|||
</div> |
|||
</form> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</t> |
|||
</template> |
|||
<!-- Template used to redirect the booking page into success--> |
|||
<template id="truck_booking_success_page" name="Truck Booking"> |
|||
<t t-call="website.layout"> |
|||
<div id="wrap"> |
|||
<div class="container"> |
|||
<div class="col-md-12"> |
|||
<div class="success"> |
|||
Booking have been Created Successfully. |
|||
</div> |
|||
</div> |
|||
<a href="/booking" class="link">Back to Booking</a> |
|||
</div> |
|||
</div> |
|||
</t> |
|||
</template> |
|||
</odoo> |
@ -0,0 +1,39 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<!-- Template for showing the goods type details--> |
|||
<template id="goods_page" name="Goods"> |
|||
<t t-call="website.layout"> |
|||
<div id="wrap"> |
|||
<h1 align='center'>Goods Type</h1> |
|||
<div class="container"> |
|||
<div class="col-md-12"> |
|||
<div class="row"> |
|||
<table class="table"> |
|||
<thead> |
|||
<tr> |
|||
<th> |
|||
S.NO |
|||
</th> |
|||
<th> |
|||
Goods Type |
|||
</th> |
|||
</tr> |
|||
</thead> |
|||
<t t-foreach='goods_ids' t-as="goods_id"> |
|||
<tr> |
|||
<td> |
|||
<t t-esc="goods_id_index + 1"/> |
|||
</td> |
|||
<td> |
|||
<t t-esc="goods_id.name"/> |
|||
</td> |
|||
</tr> |
|||
</t> |
|||
</table> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</t> |
|||
</template> |
|||
</odoo> |
@ -0,0 +1,59 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<!-- Template for the truck details--> |
|||
<template id="truck_page" name="Truck"> |
|||
<t t-call="website.layout"> |
|||
<div id="wrap"> |
|||
<h1 align='center'>Trucks</h1> |
|||
<div class="container"> |
|||
<div class="col-md-12"> |
|||
<div class="row"> |
|||
<table class="table"> |
|||
<thead> |
|||
<tr> |
|||
<th> |
|||
TRUCK TYPE |
|||
</th> |
|||
<th> |
|||
SIZE(FT) |
|||
</th> |
|||
<th> |
|||
HOUSE HOLD CAPACITY |
|||
</th> |
|||
<th> |
|||
MAX WEIGHT |
|||
</th> |
|||
</tr> |
|||
</thead> |
|||
<t t-foreach='truck_type_ids' |
|||
t-as="truck_type_id"> |
|||
<tr> |
|||
<td> |
|||
<t t-esc="truck_type_id.name"/> |
|||
</td> |
|||
<td> |
|||
<t t-esc="truck_type_id.length"/>L |
|||
X |
|||
<t t-esc="truck_type_id.width"/>W X |
|||
<t t-esc="truck_type_id.height"/>H |
|||
</td> |
|||
<td> |
|||
<t t-esc="truck_type_id.capacity"/> |
|||
BHK |
|||
</td> |
|||
<td> |
|||
Max Load |
|||
<t t-esc="truck_type_id.weight"/> |
|||
<t t-esc="truck_type_id.unit"/> |
|||
</td> |
|||
</tr> |
|||
</t> |
|||
</table> |
|||
</div> |
|||
|
|||
</div> |
|||
</div> |
|||
</div> |
|||
</t> |
|||
</template> |
|||
</odoo> |
@ -0,0 +1,22 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Afra MP (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 make_truck_booking_pdf |