Browse Source

Jul 25 : [UPDT] Updated 'product_combo_pack'

pull/267/head
AjmalCybro 2 years ago
parent
commit
2b36fd5a38
  1. 18
      product_combo_pack/README.rst
  2. 10
      product_combo_pack/__init__.py
  3. 19
      product_combo_pack/__manifest__.py
  4. 9
      product_combo_pack/doc/RELEASE_NOTES.md
  5. 11
      product_combo_pack/models/__init__.py
  6. 50
      product_combo_pack/models/pack_products.py
  7. 79
      product_combo_pack/models/product_template.py
  8. 31
      product_combo_pack/models/sale_order.py
  9. 1
      product_combo_pack/security/ir.model.access.csv
  10. BIN
      product_combo_pack/static/description/assets/screenshots/1.png
  11. BIN
      product_combo_pack/static/description/assets/screenshots/2.png
  12. BIN
      product_combo_pack/static/description/assets/screenshots/3.png
  13. BIN
      product_combo_pack/static/description/assets/screenshots/4.png
  14. BIN
      product_combo_pack/static/description/assets/screenshots/5.png
  15. BIN
      product_combo_pack/static/description/assets/screenshots/6.png
  16. BIN
      product_combo_pack/static/description/assets/screenshots/7.png
  17. BIN
      product_combo_pack/static/description/assets/screenshots/hero.gif
  18. BIN
      product_combo_pack/static/description/assets/screenshots/screenshot-1.png
  19. BIN
      product_combo_pack/static/description/assets/screenshots/screenshot-10.png
  20. BIN
      product_combo_pack/static/description/assets/screenshots/screenshot-11.png
  21. BIN
      product_combo_pack/static/description/assets/screenshots/screenshot-12.png
  22. BIN
      product_combo_pack/static/description/assets/screenshots/screenshot-13.png
  23. BIN
      product_combo_pack/static/description/assets/screenshots/screenshot-14.png
  24. BIN
      product_combo_pack/static/description/assets/screenshots/screenshot-2.png
  25. BIN
      product_combo_pack/static/description/assets/screenshots/screenshot-3.png
  26. BIN
      product_combo_pack/static/description/assets/screenshots/screenshot-4.png
  27. BIN
      product_combo_pack/static/description/assets/screenshots/screenshot-5.png
  28. BIN
      product_combo_pack/static/description/assets/screenshots/screenshot-6.png
  29. BIN
      product_combo_pack/static/description/assets/screenshots/screenshot-7.png
  30. BIN
      product_combo_pack/static/description/assets/screenshots/screenshot-8.png
  31. BIN
      product_combo_pack/static/description/assets/screenshots/screenshot-9.png
  32. 393
      product_combo_pack/static/description/index.html
  33. 103
      product_combo_pack/views/product_form_view.xml
  34. 119
      product_combo_pack/views/product_form_views.xml
  35. 15
      product_combo_pack/views/sale_order_view.xml
  36. 16
      product_combo_pack/views/sale_order_views.xml
  37. 24
      product_combo_pack/wizard/__init__.py
  38. 58
      product_combo_pack/wizard/select_product_pack.py
  39. 32
      product_combo_pack/wizard/select_product_pack_view.xml

18
product_combo_pack/README.rst

@ -1,29 +1,34 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
Product Pack
============
* Create product pack which is a great way to raise average sales price per product, to serve customers with products that make their lives easier, and to leverage current products into new and different ones.
Installation
============
- www.odoo.com/documentation/16.0/setup/install.html
- www.odoo.com/documentation/13.0/setup/install.html
- Install our custom addon
License
=======
GNU AFFERO GENERAL PUBLIC LICENSE, Version 3 (AGPLv3)
(http://www.gnu.org/licenses/agpl.html)
(https://www.gnu.org/licenses/agpl-3.0-standalone.html)
Company
-------
* 'Cybrosys Techno Solutions <https://cybrosys.com/>`__
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__
Credits
-------
* Developer:
Afras @ Cybrosys, Contact: afras@cybrosys.in
* Developer: Jumana jabin MP @ Cybrosys,
* Contact: odoo@cybrosys.com
Contacts
--------
* Mail Contact : odoo@cybrosys.com
* Website : https://cybrosys.com
Bug Tracker
-----------
@ -31,6 +36,8 @@ Bugs are tracked on GitHub Issues. In case of trouble, please check there if you
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
@ -38,4 +45,3 @@ For support and more information, please visit https://www.cybrosys.com
Further information
===================
HTML Description: `<static/description/index.html>`__

10
product_combo_pack/__init__.py

@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
###################################################################################
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-TODAY Cybrosys Technologies (<https://www.cybrosys.com>).
# Author: Afras Habis (odoo@cybrosys.com)
# Copyright (C) 2023-TODAY Cybrosys Technologies (<https://www.cybrosys.com>)
# Author: Jumana Jabin MP (odoo@cybrosys.com)
#
# This program is free software: you can modify
# it under the terms of the GNU Affero General Public License (AGPL) as
@ -19,7 +19,5 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
###################################################################################
################################################################################
from . import models
from . import wizard

19
product_combo_pack/__manifest__.py

@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
###################################################################################
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-TODAY Cybrosys Technologies (<https://www.cybrosys.com>).
# Author: Afras Habis (odoo@cybrosys.com)
# Copyright (C) 2023-TODAY Cybrosys Technologies (<https://www.cybrosys.com>)
# Author: Jumana jabin MP (odoo@cybrosys.com)
#
# This program is free software: you can modify
# it under the terms of the GNU Affero General Public License (AGPL) as
@ -19,11 +19,10 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
###################################################################################
################################################################################
{
'name': 'Product Pack',
'version': '16.0.1.0.2',
'version': '16.0.1.0.3',
'summary': 'Manage Products as Pack',
'description': 'Manage Products as Pack',
'category': 'Sales',
@ -34,12 +33,12 @@
'depends': ['base', 'sale_management', 'stock'],
'data': [
'security/ir.model.access.csv',
'views/product_form_view.xml',
'wizard/select_product_pack_view.xml',
'views/sale_order_view.xml',
'views/product_form_views.xml',
'views/sale_order_views.xml',
],
'images': ['static/description/banner.png'],
'installable': True,
'license': 'AGPL-3',
'installable': True,
'auto_install': False,
'application': True,
}

9
product_combo_pack/doc/RELEASE_NOTES.md

@ -1,10 +1,5 @@
## Module <product_combo_pack>
#### 23.08.2022
#### 14.07.2023
#### Version 16.0.1.0.0
Initial Commit for product_combo_pack
#### 01.12.2022
#### Version 16.0.1.0.1
#### UPDT
- Product pack duplication issue
- Initial Commit for Product Pack

11
product_combo_pack/models/__init__.py

@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
###################################################################################
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-TODAY Cybrosys Technologies (<https://www.cybrosys.com>).
# Author: Afras Habis (odoo@cybrosys.com)
# Copyright (C) 2023-TODAY Cybrosys Technologies (<https://www.cybrosys.com>)
# Author: Jumana Jabin MP (odoo@cybrosys.com)
#
# This program is free software: you can modify
# it under the terms of the GNU Affero General Public License (AGPL) as
@ -19,8 +19,7 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
###################################################################################
from . import product_form
################################################################################
from . import pack_products
from . import product_template
from . import sale_order

50
product_combo_pack/models/pack_products.py

@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
###################################################################################
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-TODAY Cybrosys Technologies (<https://www.cybrosys.com>).
# Author: Afras Habis (odoo@cybrosys.com)
# Copyright (C) 2023-TODAY Cybrosys Technologies (<https://www.cybrosys.com>)
# Author: Jumana Jabin MP (odoo@cybrosys.com)
#
# This program is free software: you can modify
# it under the terms of the GNU Affero General Public License (AGPL) as
@ -19,33 +19,46 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
###################################################################################
################################################################################
from odoo import api, fields, models, _
from odoo.exceptions import UserError, ValidationError
from odoo.exceptions import ValidationError
class PackProducts(models.Model):
"""Model for selecting pack products.This model allows users to select
and manage pack products. """
_name = 'pack.products'
_rec_name = 'product_tmpl_id'
_description = 'Select Pack Products'
product_id = fields.Many2one('product.product', string='Product', required=True,
domain=[('is_pack', '=', False)])
product_tmpl_id = fields.Many2one('product.template', string='Product')
price = fields.Float('Price', compute='compute_price', store=True)
quantity = fields.Integer('Quantity', default=1)
qty_available = fields.Float('Quantity Available', compute='compute_quantity_of_product', store=True,
readonly=False)
total_available_quantity = fields.Float('Total Quantity')
product_id = fields.Many2one('product.product', string='Product',
required=True,
domain=[('is_pack', '=', False)],
help='The specific product being referenced.')
product_tmpl_id = fields.Many2one('product.template', string='Product',
help='The template of the product.')
price = fields.Float('Price', compute='compute_price', store=True,
help='The calculated price of the product.')
quantity = fields.Integer('Quantity', default=1,
help='The quantity of the product.')
qty_available = fields.Float('Quantity Available',
compute='compute_quantity_of_product',
store=True, readonly=False,
help='The available quantity of the product.')
total_available_quantity = fields.Float('Total Quantity',
help='The total available quantity.')
@api.depends('product_id', 'total_available_quantity', 'product_id.qty_available')
@api.depends('product_id', 'total_available_quantity',
'product_id.qty_available')
def compute_quantity_of_product(self):
"""Compute the available quantity for each record based on the
product and location. """
for record in self:
location_id = record.product_tmpl_id.pack_location_id
if location_id:
stock_quant = self.env['stock.quant'].search(
[('product_id', '=', record.product_id.id), ('location_id', '=', location_id.id)])
[('product_id', '=', record.product_id.id),
('location_id', '=', location_id.id)])
if stock_quant:
record.qty_available = stock_quant.quantity
else:
@ -55,14 +68,19 @@ class PackProducts(models.Model):
@api.depends('product_id', 'quantity')
def compute_price(self):
""" Compute the price for each record based on the product and quantity.
"""
for record in self:
record.price = record.product_id.lst_price * record.quantity
@api.onchange('quantity')
def set_price(self):
""" Update the price field when the quantity changes."""
self.price = self.product_id.lst_price * self.quantity
@api.constrains('quantity')
def _check_positive_qty(self):
"""Ensure that the quantity is always positive.Raises a validation
error if any of the records have a negative quantity."""
if any([ml.quantity < 0 for ml in self]):
raise ValidationError(_('You can not enter negative quantities.'))

79
product_combo_pack/models/product_form.py → product_combo_pack/models/product_template.py

@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
###################################################################################
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-TODAY Cybrosys Technologies (<https://www.cybrosys.com>).
# Author: Afras Habis (odoo@cybrosys.com)
# Copyright (C) 2023-TODAY Cybrosys Technologies (<https://www.cybrosys.com>)
# Author: Jumana jabin MP (odoo@cybrosys.com)
#
# This program is free software: you can modify
# it under the terms of the GNU Affero General Public License (AGPL) as
@ -19,31 +19,46 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
###################################################################################
################################################################################
from odoo import api, fields, models, _
from odoo.exceptions import UserError
class ProductPack(models.Model):
"""Model for extending the product template to include
pack-related fields."""
_inherit = 'product.template'
def default_pack_location(self):
""" Get the default pack location for the current company."""
company_user = self.env.company
warehouse = self.env['stock.warehouse'].search([('company_id', '=', company_user.id)], limit=1)
warehouse = self.env['stock.warehouse'].search([(
'company_id', '=', company_user.id)], limit=1)
if warehouse:
return warehouse.lot_stock_id.id
is_pack = fields.Boolean('Is a Pack')
pack_price = fields.Integer(string="Pack Price", compute='set_pack_price', store=True)
pack_products_ids = fields.One2many('pack.products', 'product_tmpl_id', string='Pack Products', copy=True)
pack_quantity = fields.Integer('Pack Quantity')
is_pack = fields.Boolean('Is a Pack', help='Indicates whether the'
' product is a pack or not.')
pack_price = fields.Integer(string="Pack Price", compute='set_pack_price',
store=True,
help='The calculated price of the pack.')
pack_products_ids = fields.One2many('pack.products', 'product_tmpl_id',
string='Pack Products', copy=True,
help='The list of products included '
'in the pack.')
pack_quantity = fields.Integer('Pack Quantity',
help='The quantity of the product'
' in the pack.')
pack_location_id = fields.Many2one('stock.location',
domain=[('usage', 'in', ['internal', 'transit'])],
default=default_pack_location)
domain=[('usage', 'in',
['internal', 'transit'])],
default=default_pack_location,
string='Pack Location',
help='The default location for the pack.')
@api.depends('pack_products_ids', 'pack_products_ids.price')
def set_pack_price(self):
"""Compute the pack price based on the prices of the pack products."""
price = 0
for record in self:
for line in record.pack_products_ids:
@ -52,30 +67,39 @@ class ProductPack(models.Model):
@api.model
def create(self, values):
"""Override the create method to add validation for pack products."""
if values.get('is_pack', False):
if not values.get('pack_products_ids', []):
raise UserError(_(
'You need to add atleast one product in the Pack...!'))
if values.get('type', False) == 'service':
raise UserError(_('You cannot define a pack product as a service..!'))
raise UserError(
_('You cannot define a pack product as a service..!'))
return super(ProductPack, self).create(values)
def write(self, values):
"""Override the write method to add validation for pack products."""
super(ProductPack, self).write(values)
if self.is_pack:
if not self.pack_products_ids:
for rec in self:
if rec.is_pack:
if not rec.pack_products_ids:
raise UserError(_(
'You need to add atleast one product in the Pack...!'))
if self.type == 'service':
raise UserError(_('You cannot define a pack product as a service..!'))
'You need to add at least one product in the Pack...!'))
if rec.type == 'service':
raise UserError(
_('You cannot define a pack product as a service..!'))
def update_price_product(self):
"""Update the list price of the product with the pack price."""
self.list_price = self.pack_price
def get_quantity(self):
"""Calculate the pack quantity based on the availability of
pack products."""
total_quantity = 1
flag = 1
while flag:
max_iterations = 1000
while flag and total_quantity < max_iterations:
for line in self.pack_products_ids:
if line.qty_available >= line.quantity * total_quantity:
continue
@ -85,20 +109,24 @@ class ProductPack(models.Model):
flag = 0
break
if flag:
total_quantity = total_quantity + 1
total_quantity += 1
self.pack_quantity = total_quantity - 1
def update_quantity(self):
"""Update the pack quantity in the specified pack location."""
company_user = self.env.company
product_id = len(self.product_variant_ids) == 1 and self.product_variant_id.id
product_id = len(
self.product_variant_ids) == 1 and self.product_variant_id.id
location_id = self.pack_location_id.id
if not location_id:
warehouse = self.env['stock.warehouse'].search([('company_id', '=', company_user.id)], limit=1)
warehouse = self.env['stock.warehouse'].search([(
'company_id', '=', company_user.id)], limit=1)
location_id = warehouse.lot_stock_id.id
if not location_id:
raise UserError(_(
'You need to select the location to update the pack quantity...!'))
self.env['stock.quant'].with_context(inventory_mode=True).sudo().create({
self.env['stock.quant'].with_context(inventory_mode=True).sudo().create(
{
'product_id': product_id,
'location_id': location_id,
'inventory_quantity': self.pack_quantity,
@ -106,9 +134,12 @@ class ProductPack(models.Model):
@api.onchange('pack_location_id')
def change_quantity_based_on_location(self):
"""Update the total available quantity of pack products based
on the selected pack location."""
for line in self.pack_products_ids:
stock_quant = self.env['stock.quant'].search(
[('product_id', '=', line.product_id.id), ('location_id', '=', self.pack_location_id.id)])
[('product_id', '=', line.product_id.id), (
'location_id', '=', self.pack_location_id.id)])
if stock_quant:
line.total_available_quantity = stock_quant.quantity
else:

31
product_combo_pack/models/sale_order.py

@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
###################################################################################
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-TODAY Cybrosys Technologies (<https://www.cybrosys.com>).
# Author: Afras Habis (odoo@cybrosys.com)
# Copyright (C) 2023-TODAY Cybrosys Technologies (<https://www.cybrosys.com>)
# Author: Jumana Jabin MP (odoo@cybrosys.com)
#
# This program is free software: you can modify
# it under the terms of the GNU Affero General Public License (AGPL) as
@ -19,15 +19,36 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
###################################################################################
################################################################################
from odoo import api, fields, models
class SalePack(models.Model):
"""Model for extending the sale order to include a selection of packs."""
_inherit = 'sale.order'
product_pack_id = fields.Many2one('product.product', string='Select Pack',
domain=[('is_pack', '=', True)],
required=True,
help='The selected pack product for'
' the sale order.')
@api.onchange('product_pack_id')
def onchange_product_pack_id(self):
"""Perform actions when the selected pack product changes."""
if self.product_pack_id:
self.order_line = [(0, 0, {
'product_id': self.product_pack_id.id,
'name': self.product_pack_id.name,
'product_uom_qty': 1,
'price_unit': self.product_pack_id.list_price,
})]
elif not self.product_pack_id:
self.order_line = [(5, 0, 0)]
def action_confirm(self):
"""Override the action_confirm method to create stock moves
for pack products."""
super(SalePack, self).action_confirm()
for line in self.order_line:
if line.product_id.is_pack:

1
product_combo_pack/security/ir.model.access.csv

@ -1,3 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_pack_products,access.pack.products,model_pack_products,base.group_user,1,1,1,1
access_select_product_pack,access.select.product.pack,model_select_product_pack,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_pack_products access.pack.products model_pack_products base.group_user 1 1 1 1
access_select_product_pack access.select.product.pack model_select_product_pack base.group_user 1 1 1 1

BIN
product_combo_pack/static/description/assets/screenshots/1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 438 KiB

BIN
product_combo_pack/static/description/assets/screenshots/2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

BIN
product_combo_pack/static/description/assets/screenshots/3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

BIN
product_combo_pack/static/description/assets/screenshots/4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

BIN
product_combo_pack/static/description/assets/screenshots/5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

BIN
product_combo_pack/static/description/assets/screenshots/6.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

BIN
product_combo_pack/static/description/assets/screenshots/7.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

BIN
product_combo_pack/static/description/assets/screenshots/hero.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 229 KiB

After

Width:  |  Height:  |  Size: 233 KiB

BIN
product_combo_pack/static/description/assets/screenshots/screenshot-1.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

BIN
product_combo_pack/static/description/assets/screenshots/screenshot-10.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

BIN
product_combo_pack/static/description/assets/screenshots/screenshot-11.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

BIN
product_combo_pack/static/description/assets/screenshots/screenshot-12.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

BIN
product_combo_pack/static/description/assets/screenshots/screenshot-13.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

BIN
product_combo_pack/static/description/assets/screenshots/screenshot-14.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

BIN
product_combo_pack/static/description/assets/screenshots/screenshot-2.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

BIN
product_combo_pack/static/description/assets/screenshots/screenshot-3.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

BIN
product_combo_pack/static/description/assets/screenshots/screenshot-4.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

BIN
product_combo_pack/static/description/assets/screenshots/screenshot-5.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

BIN
product_combo_pack/static/description/assets/screenshots/screenshot-6.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

BIN
product_combo_pack/static/description/assets/screenshots/screenshot-7.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

BIN
product_combo_pack/static/description/assets/screenshots/screenshot-8.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

BIN
product_combo_pack/static/description/assets/screenshots/screenshot-9.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

393
product_combo_pack/static/description/index.html

@ -2,7 +2,8 @@
<!-- TITLE BAR -->
<div
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;" />
<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">
@ -19,23 +20,27 @@
</div>
</div>
<!-- END OF TITLE BAR -->
<!-- APP HERO -->
<h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;">Product Pack</h1>
<p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;">Manage Products as Pack</p>
<h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;">
Product Pack</h1>
<p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;">
Manage Products as Pack</p>
<!-- END OF APP HERO -->
<img src="assets/screenshots/hero.gif"
style="width: 75%; height: auto; position: absolute; margin-left: auto; margin-right: auto; top: 45%; left: 12%; right: auto;" />
style="width: 75%; height: auto; position: absolute; margin-left: auto; margin-right: auto; top: 45%; left: 12%; right: auto;"/>
</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 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" />
<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
<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;">
@ -50,7 +55,7 @@
more about this
module</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36" />
<img src="assets/misc/right-arrow.png" width="36" height="36"/>
</div>
</a>
</div>
@ -65,7 +70,7 @@
features of this
module</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36" />
<img src="assets/misc/right-arrow.png" width="36" height="36"/>
</div>
</a>
</div>
@ -80,7 +85,7 @@
screenshots for this
module</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36" />
<img src="assets/misc/right-arrow.png" width="36" height="36"/>
</div>
</a>
</div>
@ -88,67 +93,85 @@
<!-- 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 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" />
<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 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="row"
style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;">
<div class="col-sm-12 py-4">
Selling products in a pack is a great way to raise average sales price per product, to serve customers with products that make their lives easier, and to leverage current products into new and different ones. They are profitable for smaller businesses as well as large ones.
Selling products in a pack is a great way to raise average sales price
per product, to serve customers with products that make their lives
easier, and to leverage current products into new and different ones.
They are profitable for smaller businesses as well as large ones.
</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 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" />
<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 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="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: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2" />
<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;">Create a Product Pack Easily.
</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" />
<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;">Manage the stock of the Product.
</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" />
<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;">Compute the Price of the Pack.
</span>
</div>
</div>
<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" />
<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;">Compute the Quantity of the Pack with
respect to the quantity of Pack items.</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" />
<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;">Update the quantity of pack easily.
</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" />
<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;">Adding Pack into Sale order Easily.
</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" />
<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;">Filter Pack from Products.
</span>
</div>
@ -157,122 +180,97 @@
<!-- 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 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" />
<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 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;">Product Pack Menu.
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Product Pack Menu.
</h3>
<img src="assets/screenshots/screenshot-1.png" class="img-thumbnail">
<img src="assets/screenshots/1.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;">Check if the product is a pack.
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Check if the product is a pack.
</h3>
<img src="assets/screenshots/screenshot-2.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;">Product Pack Page for Consumable(if not managing the stock of pack)</h3>
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Product Pack Page for Consumable(if not managing the stock of
pack)</h3>
<img src="assets/screenshots/screenshot-3.png" class="img-thumbnail">
<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;">Product Pack Page for Storable.
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Product Pack Page for Storable.
</h3>
<img src="assets/screenshots/screenshot-4.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;">Adding products into the pack.
</h3>
<img src="assets/screenshots/screenshot-5.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;">Computing the price with respect to
the product in the pack.</h3>
<img src="assets/screenshots/screenshot-6.png" class="img-thumbnail">
<img src="assets/screenshots/4.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;">Update the price of the pack.
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Adding products into the pack.
</h3>
<img src="assets/screenshots/screenshot-7.png" class="img-thumbnail">
<img src="assets/screenshots/5.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;">Get the quantity of pack with repect to the quantity of pack products.</h3>
<img src="assets/screenshots/screenshot-8.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;">Update the quantity of pack directly with the computed quantity to the selected location.</h3>
<img src="assets/screenshots/screenshot-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;">Adding Pack to sale order.
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Adding Pack to sale order.
</h3>
<img src="assets/screenshots/screenshot-10.png" class="img-thumbnail">
<img src="assets/screenshots/6.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;">Select the Pack and Quantity and click on 'ADD' to add the pack into sale order.</h3>
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Delivery of pack.
</h3>
<img src="assets/screenshots/screenshot-11.png" class="img-thumbnail">
<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;">Pack added to the sale order.
</h3>
<img src="assets/screenshots/screenshot-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;">Delivery of pack.
</h3>
<img src="assets/screenshots/screenshot-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;">Stock reduced for both pack and pack products.</h3>
<img src="assets/screenshots/screenshot-14.png" class="img-thumbnail">
</div>
</div>
</div>
<!-- END OF SCREENSHOTS SECTION -->
<!-- RELATED PRODUCTS -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<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/categories.png" />
<img src="assets/misc/categories.png"/>
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Related
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Related
Products
</h2>
</div>
@ -282,52 +280,71 @@
<!-- 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/15.0/dynamic_accounts_report/" target="_blank">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/dynamic_accounts_report/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
<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/15.0/custom_gantt_view/" target="_blank">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/custom_gantt_view/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
<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/15.0/project_custom_gantt/" target="_blank">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/project_custom_gantt/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
<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/15.0/account_reports_xlsx/" target="_blank">
<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/15.0/account_reports_xlsx/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
<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/15.0/base_accounting_kit/" target="_blank">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/base_accounting_kit/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
<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/15.0/hr_payroll_community/" target="_blank">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/hr_payroll_community/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/6.png">
</div>
</a>
@ -335,10 +352,15 @@
</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"
<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>
@ -348,12 +370,15 @@
<!-- OUR SERVICES -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<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" />
<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 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Our Services
</h2>
</div>
@ -362,9 +387,11 @@
<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">
<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;">
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Customization</h6>
</div>
@ -372,9 +399,11 @@
<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">
<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;">
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Implementation</h6>
</div>
@ -382,9 +411,11 @@
<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">
<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;">
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Support</h6>
</div>
@ -393,9 +424,11 @@
<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">
<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;">
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Hire
Odoo
Developer</h6>
@ -404,9 +437,11 @@
<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">
<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;">
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Integration</h6>
</div>
@ -414,9 +449,11 @@
<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">
<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;">
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Migration</h6>
</div>
@ -425,9 +462,11 @@
<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">
<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;">
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Consultancy</h6>
</div>
@ -435,9 +474,11 @@
<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">
<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;">
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Implementation</h6>
</div>
@ -445,9 +486,11 @@
<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">
<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;">
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Licensing Consultancy</h6>
</div>
@ -455,16 +498,19 @@
</div>
<!-- END OF END OF OUR SERVICES -->
<!-- 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 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" />
<img src="assets/misc/corporate.png"/>
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Our
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Our
Industries
</h2>
</div>
@ -474,7 +520,8 @@
<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">
<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>
@ -488,7 +535,8 @@
<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">
<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>
@ -502,7 +550,8 @@
<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">
<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>
@ -515,7 +564,8 @@
<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"
<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
@ -529,7 +579,8 @@
<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">
<img src="assets/icons/ecom-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
E-commerce &amp; Website
</h5>
@ -543,7 +594,8 @@
<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">
<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>
@ -556,7 +608,8 @@
<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">
<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>
@ -569,7 +622,8 @@
<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">
<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>
@ -582,15 +636,18 @@
</div>
</div>
<!-- END OF END OF OUR INDUSTRIES -->
<!-- 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 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" />
<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 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Support
</h2>
</div>
<div class="container mt-5">
@ -599,11 +656,13 @@
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;">
<div class="mr-4"
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;" />
<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>
<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>
@ -615,13 +674,15 @@
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;">
<div class="mr-4"
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;" />
<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
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;">
+91 86068
27707</p>
</a>
</div>
@ -631,7 +692,7 @@
<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;" />
style="width:144px; height: 31px; margin-top: 40px;"/>
</div>
</div>
</div>

103
product_combo_pack/views/product_form_view.xml

@ -1,103 +0,0 @@
<odoo>
<data>
<!-- Inherit Form View to Modify it -->
<record id="product_product_inherit_pack" model="ir.ui.view">
<field name="name">product.product.inherit.pack</field>
<field name="model">product.product</field>
<field name="inherit_id" ref="product.product_normal_form_view"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='options']" position="inside">
<div modifiers="{}">
<field name="is_pack" modifiers="{}"/>
<label for="is_pack" modifiers="{}"/>
</div>
</xpath>
</field>
</record>
<record id="product_template_inherit_pack" model="ir.ui.view">
<field name="name">product.template.inherit.pack</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_only_form_view"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='options']" position="inside">
<div modifiers="{}">
<field name="is_pack" modifiers="{}"/>
<label for="is_pack" modifiers="{}"/>
</div>
</xpath>
<xpath expr="//page[@name='variants']" position="attributes">
<attribute name="attrs">{'invisible': [('is_pack','=',True)]}</attribute>
</xpath>
<xpath expr="//page[@name='invoicing']" position="after">
<page string="Product Pack" name="product_pack" attrs="{'invisible' : [('is_pack','=',False)] }">
<group name="pack_properties">
<group string="Pack Price">
<label for="pack_price"/>
<div class="o_row">
<field name="pack_price"/>
<button name="update_price_product" type="object" string="Update Price"
class="oe_link oe_read_only pt-0"/>
</div>
</group>
<group string="Pack Quantity" attrs="{'invisible' : [('type','!=','product')]}">
<field name="pack_location_id" attrs="{'required':[('is_pack','=',True)]}"/>
<label for="pack_quantity"/>
<div class="o_row">
<field name="pack_quantity"/>
<button name="get_quantity" type="object" string="Get Quantity"
help='To get the quantity of Pack with respect to the quantity of pack products'/>
<button name="update_quantity" type="object" string="Update Quantity"
class="oe_link oe_read_only pt-0"/>
</div>
</group>
</group>
<field name="pack_products_ids" nolabel="1"
attrs="{'readonly':[('pack_location_id','=',False)]}">
<tree editable="botttom">
<field name="product_id" string="Product" options='{"no_open":True}'/>
<field name="quantity" string="Quantity"/>
<field name="price"/>
<field name="qty_available"/>
<field name="total_available_quantity" invisible="True"/>
</tree>
</field>
</page>
</xpath>
</field>
</record>
<record id="product_pack_action" model="ir.actions.act_window">
<field name="name">Product Pack</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">product.template</field>
<field name="view_mode">kanban,form</field>
<field name="domain">[('is_pack','=',True)]</field>
<field name="context">{'default_is_pack' : True}</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
There is no product pack to show...!
</p>
</field>
</record>
<record id="product_pack_filter" model="ir.ui.view">
<field name="name">product.template.search.inherit</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_search_view"/>
<field name="arch" type="xml">
<xpath expr="//search" position="inside">
<filter string="Is a Pack" name="Is a Pack" domain="[('is_pack','=',True)]"/>
</xpath>
</field>
</record>
<menuitem id="pack_product_sale"
name="Product Pack"
parent="sale.product_menu_catalog"
sequence="3"
action="product_pack_action"/>
</data>
</odoo>

119
product_combo_pack/views/product_form_views.xml

@ -0,0 +1,119 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Modify product.product form view -->
<record id="product_normal_form_view" model="ir.ui.view">
<field name="name">
product.product.form.view.inherit.product.combo.pack
</field>
<field name="model">product.product</field>
<field name="inherit_id" ref="product.product_normal_form_view"/>
<field name="arch" type="xml">
<!-- Add the 'is_pack' field to the 'options' div -->
<xpath expr="//div[@name='options']" position="inside">
<div modifiers="{}">
<field name="is_pack" modifiers="{}"/>
<label for="is_pack" modifiers="{}"/>
</div>
</xpath>
</field>
</record>
<!-- Modify product.template form view -->
<record id="product_template_only_form_view" model="ir.ui.view">
<field name="name">
product.template.form.view.inherit.product.combo.pack
</field>
<field name="model">product.template</field>
<field name="inherit_id"
ref="product.product_template_only_form_view"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='options']" position="inside">
<div modifiers="{}">
<field name="is_pack" modifiers="{}"/>
<label for="is_pack" modifiers="{}"/>
</div>
</xpath>
<xpath expr="//page[@name='variants']" position="attributes">
<attribute name="attrs">{'invisible':
[('is_pack','=',True)]}
</attribute>
</xpath>
<xpath expr="//page[@name='invoicing']" position="after">
<page string="Product Pack" name="product_pack"
attrs="{'invisible' : [('is_pack','=',False)] }">
<group name="pack_properties">
<group string="Pack Price">
<label for="pack_price"/>
<div class="o_row">
<field name="pack_price"/>
<button name="update_price_product"
type="object"
string="Update Price"/>
</div>
</group>
<group string="Pack Quantity"
attrs="{'invisible' : [('type','!=','product')]}">
<field name="pack_location_id"
attrs="{'required':[('is_pack','=',True)]}"/>
<label for="pack_quantity"/>
<div class="o_row">
<field name="pack_quantity"/>
<button name="get_quantity" type="object"
string="Get Quantity"
help='To get the quantity of Pack with respect to the quantity of pack products'/>
<button name="update_quantity" type="object"
string="Update Quantity"/>
</div>
</group>
</group>
<field name="pack_products_ids"
attrs="{'readonly':[('pack_location_id','=',False)]}">
<tree editable="botttom">
<field name="product_id" string="Product"
options='{"no_open":True}'/>
<field name="quantity" string="Quantity"/>
<field name="price"/>
<field name="qty_available"/>
<field name="total_available_quantity"
invisible="True"/>
</tree>
</field>
</page>
</xpath>
</field>
</record>
<!-- Define an action for the Product Pack menu item -->
<record id="product_pack_action" model="ir.actions.act_window">
<field name="name">Product Pack</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">product.template</field>
<field name="view_mode">kanban,form</field>
<field name="domain">[('is_pack','=',True)]</field>
<field name="context">{'default_is_pack' : True}</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
There is no product pack to show...!
</p>
</field>
</record>
<!-- Modify product.template search view -->
<record id="product_template_search_view" model="ir.ui.view">
<field name="name">
product.template.search.view.inherit.product.combo.pack
</field>
<field name="model">product.template</field>
<field name="inherit_id"
ref="product.product_template_search_view"/>
<field name="arch" type="xml">
<xpath expr="//search" position="inside">
<filter string="Is a Pack" name="Is a Pack"
domain="[('is_pack','=',True)]"/>
</xpath>
</field>
</record>
<!-- Add the Product Pack menu item -->
<menuitem id="pack_product_sale"
name="Product Pack"
parent="sale.product_menu_catalog"
sequence="3"
action="product_pack_action"/>
</odoo>

15
product_combo_pack/views/sale_order_view.xml

@ -1,15 +0,0 @@
<odoo>
<data>
<!-- Inherit Form View to Modify it -->
<record id="product_pack_sale_order" model="ir.ui.view">
<field name="name">Product Pack in sale order</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='order_line']" position="before">
<button name="%(action_product_pack_wizard)d" type="action" string="Add Product Pack" style="margin-bottom : 16px;"/>
</xpath>
</field>
</record>
</data>
</odoo>

16
product_combo_pack/views/sale_order_views.xml

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Inherit Form View to Modify it -->
<record id="view_order_form" model="ir.ui.view">
<field name="name">sale.order.form.view.inherit.product.combo.pack
</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<field name="sale_order_template_id" position="before">
<field name="product_pack_id" options="{'no_create': True}"
/>
</field>
</field>
</record>
</odoo>

24
product_combo_pack/wizard/__init__.py

@ -1,24 +0,0 @@
# -*- coding: utf-8 -*-
###################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-TODAY Cybrosys Technologies (<https://www.cybrosys.com>).
# Author: Afras Habis (odoo@cybrosys.com)
#
# This program is free software: you can modify
# it under the terms of the GNU Affero General Public License (AGPL) as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
###################################################################################
from . import select_product_pack

58
product_combo_pack/wizard/select_product_pack.py

@ -1,58 +0,0 @@
# -*- coding: utf-8 -*-
###################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-TODAY Cybrosys Technologies (<https://www.cybrosys.com>).
# Author: Afras Habis (odoo@cybrosys.com)
#
# This program is free software: you can modify
# it under the terms of the GNU Affero General Public License (AGPL) as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
###################################################################################
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
class SelectPack(models.TransientModel):
_name = 'select.product.pack'
_rec_name = 'product_id'
_description = 'Add product pack to sale order'
product_id = fields.Many2one('product.product', string='Select Pack', domain=[('is_pack', '=', True)],
required=True)
quantity = fields.Integer('Quantity', default=1, required=True)
def add_pack_order(self):
active_id = self._context.get('active_id')
if active_id:
sale_id = self.env['sale.order'].browse(active_id)
name = self.product_id.display_name
if self.product_id.description_sale:
name += '\n' + self.product_id.description_sale
self.env['sale.order.line'].create({
'product_id': self.product_id.id,
# 'price_unit': self.product_id.lst_price,
# 'pricelist_item_id': self.product_id.lst_price,
'product_uom': self.product_id.uom_id.id,
'product_uom_qty': self.quantity,
'order_id': sale_id.id,
'name': name,
'tax_id': self.product_id.taxes_id.ids
})
@api.constrains('quantity')
def _check_positive_qty(self):
if any([ml.quantity < 0 for ml in self]):
raise ValidationError(_('You can not enter negative quantities.'))

32
product_combo_pack/wizard/select_product_pack_view.xml

@ -1,32 +0,0 @@
<odoo>
<data>
<record id="action_product_pack_wizard" model="ir.actions.act_window">
<field name="name">Select Pack Products</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">select.product.pack</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<record id="product_pack_product_form" model="ir.ui.view">
<field name="name">Product Pack</field>
<field name="model">select.product.pack</field>
<field name="arch" type="xml">
<form>
<group>
<group>
<field name="product_id"/>
</group>
<group>
<field name="quantity"/>
</group>
</group>
<footer>
<button name="add_pack_order" string="ADD" type="object"/>
<button string="Cancel" class="btn-secondary" special="cancel"/>
</footer>
</form>
</field>
</record>
</data>
</odoo>
Loading…
Cancel
Save